生成ＡＩを使った英語勉強法（３）

https://qiita.com/EasyCording/items/c5d9e03bdeff41ab7fb6

今日も英会話のサークルに行ってきた。
たまたま外国人観光客が多いという話題になり、いろいろな意見を求められたのであるが、極端に言葉が出てこなかった。
これまでの自分の英語能力を分析すると、簡単な日常会話は問題ないが、自分の意見を述べるなどの状況になると、やはり言葉が出てこない。
```plantuml
@startuml
left to right direction
actor 英語学習者 as user
rectangle 英会話サークル {
    usecase "日常会話に参加する" as UC1
    usecase "意見を求められる" as UC2
    usecase "適切に応答する" as UC3
    usecase "言葉に詰まる" as UC4
    usecase "他の会話に参加する" as UC5
}


user --> UC1
user --> UC2
UC1 ..> UC3 : 問題なし
UC2 ..> UC4 : 課題
UC4 ..> UC5 : 自己逃避

@enduml
```
# 課題感

やはりボキャブラリー。頭の中に無いものは、いくら考えても出てこない。辞書替わりになるような参加者がいれば、会場でなんて言えばいいのかを悩んで、そこで聞き出すもしくは、別の言い方をして、何とか切り抜けるという方法が選択される。
やはり記録と課題克服のフィードバック。瞬間には上記の対策で逃れたとしても、いつまでも同じことをやっていると、やはり成長しない。会話できなかった部分は、次回から克服できるように、言えることを増やしていく必要がある。そうしないと、会話のレパートリーが増やせないからだ。
```plantuml
@startuml
left to right direction
actor 英語学習者 as user
rectangle 英会話サークルでの課題 {
    usecase "ボキャブラリー不足を実感する" as UC1
    usecase "必要な単語が出てこない" as UC2
    usecase "辞書代わりの参加者に助けを求める" as UC3
    usecase "別の言い方で切り抜ける" as UC4
}



user --> UC1
user --> UC2
UC2 ..> UC3 : 助けを求める
UC2 ..> UC4 : 別の表現を使う

@enduml
```
# 脱線話

今回の敗因を分析してみたのであるが、前日に関西人の親戚と飲みに行き、かなりの時間を大阪弁トークしていたので、完全に脳の回路が日本語志向になってしまっていた。これも大きい。つまり英語の勉強を阻害する最大の要因は、日本語での会話である。実質的に丸一日、英会話教室に行って学習が進行したとしても、次の日に日本語での会議などで仕事をすると、その分、学習が逆転してしまうからだ。（もちろん、そんなことを言うと、学校教育で英語、国語などいう時間割を組むと、効果を打ち消してしまうのか？といえば、そうでもないかもしれない）
```plantuml
@startuml
left to right direction
actor 英語学習者 as user
rectangle 英語学習を阻害する要因 {
    usecase "日本語での会話に多くの時間を費やす" as UC1
    usecase "脳の回路が日本語志向になる" as UC2
    usecase "英語学習の効果が打ち消される" as UC3
}


user --> UC1
UC1 ..> UC2 : 影響を与える
UC2 .left.> UC3 : 結果をもたらす





@enduml
```
# 対策

まずは英語でのアウトプットを増やす。これは身近に英語の得意な人が居れば、英語で話すことが手っ取り早い。よく言うが外国人の恋人を作るのがベストなどともいうが、さすがに既婚者にはありえない選択だ。
ＳＮＳやインターネット上で英語での情報発信などもありだが、やはりリアルタイム性がない。動的なスキルの育成にはならない。
あとは生成ＡＩを壁打ち代わりに利用するのもありだ。スマホ版のCHATGPTは会話が楽しめるので、是非とも利用すべきだろう。
```plantuml
@startuml
left to right direction

rectangle 英語でのアウトプット増加策 {
    usecase "英語の得意な人と英語で話す" as UC4
    usecase "外国人の恋人を作る" as UC5
    usecase "SNSやインターネットで英語の情報発信をする" as UC6
    usecase "生成AIを壁打ち代わりに利用する" as UC7
    usecase "スマホ版のChatGPTで会話練習をする" as UC8
usecase "リアルタイム性の欠如" as UC9
}

user --> UC5
user --> UC6
user --> UC7


UC5 ..> UC4 : ベストな選択肢
UC6 ..> UC9 : 動的なスキルの育成にならない
UC7 ..> UC8 : 具体的な方法


@enduml
```

# アバターワールド

前回も構想を書いたが、少し拡張してアバターワールドというものを作り、いくつか話し相手を想定して作るというのもありだ。
アバターワールドに行くと、そこには英語を話す人のキャラクターや、シチュエーションがあって、その中で一定の目的をもって取り組む状況を再現できる。
アバターごとに会話の履歴を記憶するようにすれば、相手のことを理解したより高等なコミュニケーションができるようになる。
いったん描くべきところは、いわゆるバーチャルな世界を作り、そこでコミュニケーション能力をシミュレーションしていくことが、現時点ではもっとも最適解のように思える。

# 実際問題

おそらく上記のアプリは、この世のどこかで開発されているのは裕に予想できる。いつか出てくるとは思うが、おそらくはGPTの費用がかかることから、無料というのはありえないだろう。ただ、英会話学校のように膨大な費用にはならないと思われる。
そして、アバターとなると、その人が良く使うフレーズや単語など、人格を持ったほうがリアル感が増す。ここの部分は会話履歴を吸い上げれば、使用頻度をベクトル化してデータベースに記憶することで実現できる。
```plantuml
@startuml
left to right direction
actor 英語学習者 as user
rectangle アバターワールド {
    usecase "英語を話すキャラクターとの会話" as UC1
    usecase "シチュエーションベースの目的指向学習" as UC2
    usecase "アバターごとの会話履歴管理" as UC3
    usecase "高度なコミュニケーション能力の育成" as UC4
}



user --> UC1
user --> UC2
UC1 .up.> UC3 : 会話内容の保存
UC2 ..> UC4 : 能力の向上
UC3 ..> UC4 : 理解度の向上

@enduml
```
# 直近の課題

現時点では、古典的な学習方法に、何とか弱点克服のようなアプリを作りたい。

音声データは、MP3レコーダーで記憶　→　これは音声→テキスト変換すれば可能。自分が話した部分を、生成ＡＩに添削してもらうのが良いだろう。仕様としてはMP3アップロード、音声解析、会話診断。少し難しい部分は、発話者の認識ぐらいだ。ライブラリを少し調べてみることにする。

会話診断としては、まずは生成ＡＩに話の流れを理解してもらわなければならない。
次に、文法的な訂正

ただし、難しいのは会話のログだけでは、自分がこういう風に言いたかったという（気持ち）の部分はログには残らない。
あとは現状認識。自分が知っている単語と言うのは、聞いてわかるレベルと、実際に使いこなすレベルというのは、まったく別問題だ。問題はやはり、後者の方で、単語は自由に使いこなせてナンボのものである。その際は、やはりフレーズという単位で、言いたいことをフレームワーク化させて、それをカラオケのレパートリーのように自分の中で増やしていく感覚に似ている。（ちなみに外国語のカラオケは別の方法論でクリアできる。https://qiita.com/EasyCording/items/96b19930ac7a5a250ce1


```plantuml
@startuml
left to right direction
actor 英語学習者 as user
rectangle 音声認識アプリ {
    usecase "音声データの記録" as UC1
    usecase "音声のテキスト変換" as UC2
    usecase "発話者の認識" as UC4
}

rectangle 弱点克服アプリ {
    usecase "生成AIによる添削" as UC3
    usecase "会話の流れの理解" as UC5
    usecase "文法的な訂正" as UC6
    usecase "言いたかったことの推測" as UC7
    usecase "単語の使いこなしレベルの評価" as UC8
    usecase "フレーズ単位での言語化" as UC9
}

user --> UC1
UC1 .up.> UC4 : 音声データの処理
UC2 .up.> UC3 : テキストデータの活用
UC4 ..> UC2 : 発話者情報の利用
UC3 ..> UC5 : 会話の文脈把握
UC5 .left.> UC6 : 文法誤りの特定
UC5 .left.> UC7 : 意図の推測
UC3 ..> UC8 : 単語の使用状況分析
UC8 .left.> UC9 : フレーズレベルでの評価


@enduml
```

# 言語をプログラムに例えた考察
先ほどの例をプログラムに置き換えて言えば、関数がフレーズであり、単語が引数ということになる。

```
例）　外国人が日本にやってきて、京都の住民は迷惑している

関数　何々が原因で、こういう状況が起きているの説明する　
引数　外国人が日本にやってきて。京都の住民が迷惑している

```
```plantuml
@startuml
skinparam defaultTextAlignment center

rectangle "プログラムの例" as programExample {
rectangle "関数: explainSituation(cause, effect)" as explainFunction
rectangle "引数1: cause" as causeArgument
rectangle "引数2: effect" as effectArgument
rectangle "実行結果: cause + ' is causing ' + effect" as explainResult
}

rectangle "言語表現の例" as languageExample {
rectangle "フレーズ: [原因]が原因で、[結果]が起きている" as explainPhrase
rectangle "語彙1: [原因]" as causeVocabulary
rectangle "語彙2: [結果]" as effectVocabulary
rectangle "表現の意味: 外国人の来訪が京都の住民の迷惑につながっている" as explainMeaning
}

explainFunction -[hidden]- causeArgument
causeArgument -[hidden]- effectArgument
effectArgument -[hidden]- explainResult

explainPhrase -[hidden]- causeVocabulary
causeVocabulary -[hidden]- effectVocabulary
effectVocabulary -[hidden]- explainMeaning

programExample -[hidden]- languageExample
explainFunction ~~~ explainPhrase
causeArgument ~~~ causeVocabulary
effectArgument ~~~ effectVocabulary
explainResult ~~~ explainMeaning

footer
状況説明の文も、プログラムの関数呼び出しと類似の構造を持つ！
endfooter
@enduml
```

```
例）　外国人が日本にやってきて、京都の住民は迷惑している

関数　世の中の進行状態をしめすことを説明する
引数　外国人、日本にやってくる
引数　京都の住民、迷惑している
```
```plantuml
@startuml
skinparam defaultTextAlignment center

rectangle "プログラムの例" as programExample {
rectangle "関数: expressSituation(subject, predicate)" as expressFunction
rectangle "引数1: subject = '京都の住民'" as subjectArgument
rectangle "引数2: predicate = '迷惑している'" as predicateArgument
rectangle "実行結果: '京都の住民が迷惑している'" as expressResult
}

rectangle "言語表現の例" as languageExample {
rectangle "フレーズ: [主語]が[述語]" as expressPhrase
rectangle "語彙1: [主語] = '京都の住民'" as subjectVocab
rectangle "語彙2: [述語] = '迷惑している'" as predicateVocab
}

expressFunction -[hidden]- subjectArgument
subjectArgument -[hidden]- predicateArgument
predicateArgument -[hidden]- expressResult

expressPhrase -[hidden]- subjectVocab
subjectVocab -[hidden]- predicateVocab

programExample -[hidden]- languageExample
expressFunction ~~~ expressPhrase
subjectArgument ~~~ subjectVocab
predicateArgument ~~~ predicateVocab
expressResult ~~~ expressPhrase
@enduml
```

結局のところ、プログラムにおける関数自体が文法であり、そこに品詞や句が引数になる。究極言えば、言語はプログラムなのである。そうであれば、言語を話す脳はコンピュータの実行環境なのだろう。

# まとめ

* 言語習得は一朝一夕にはいかない
* 楽しみながら継続することが大事
* テクノロジーも味方につけつつ、自分なりの学習法を作ること

# 参考記事

https://qiita.com/EasyCording/items/c5d9e03bdeff41ab7fb6