すべて処理がオフラインで完結、壁打ち英会話練習アプリ

![app1A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4119853/f33b3084-18e6-4bb3-9c95-70a5987b68b3.png)

# 英会話をもっと気軽に
私がこの英会話アプリを開発したいと考えたのは、私自身の英語学習における長年の課題と、ローカルLLM技術の可能性が結びついたからです。

私は英語が得意ではありませんし、学生時代から座学中心の英語学習には取り組んできたものの、「話す」 ことになると途端に口が重くなってしまいます。
英語で気軽に話せる友人も周囲にはおらず、いざ英会話の練習をしようと思っても、スクールに通うには費用がかさむし、見知らぬ人と話すのは気恥ずかしい…。
「もっと気軽に、自分のペースで、しかも人目を気にせず練習できる環境があれば」という思いは、常に私の心の中にありました。

# 英会話アプリ開発のきっかけ

最近、私は趣味でRAG（Retrieval-Augmented Generation）アプリを製作していました。その過程でさまざまな大規模言語モデルに触れるうち、個人所有のPCでも十分に会話が成立するレベルにまで、モデルの性能が向上していることに気づきました。

また、日々の業務の中で、会議の議事録作成に膨大な時間を費やしていることに課題を感じていて、「もっと効率化できないか」という思いからWhisperという文字起こしの存在を知りました。実際に試してみると、打ち合わせの音声を文字起こしし、それをAIに渡すことで、高い精度で議事録の叩き台が作成できました。
さらに、モデルサイズを小さくすることで、短い音声の文字起こしであれば驚くほど高速に処理が完了することも理解しました。

そして、Kokoroというテキスト読み上げライブラリを知り、こちらも短い文章であれば瞬時に読み上げが完了することに気づきました。

それぞれの点と点だった気づきをまとめて線にすることで、

喋った内容を録音→Whisperで音声を文字起こし→テキストをローカルLLMが処理して返答生成→Kokoroが音声として読み上げる。 

これら全てをローカル環境で完結させることができれば、完全にオフラインでAIと自然な会話ができるようになるのではないかという探求心に火をつけました。

せっかくこの技術を組み合わせるなら、日本語での会話ではなくて、私自身が長年抱えていた英語学習の課題、つまり「話す」に特化したアプリにしようと思い、英会話の壁打ち練習相手となるこのアプリを開発する、直接的なきっかけとなります。


# システム全体の流れ
![deepseek_mermaid_20250622_cdcbca.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4119853/435a8421-326a-4a79-a83a-8f862ba9daee.png)

app.py、audio_transcribe.py、conversation_agent.pyの3つのPythonファイルで構成されています。
app.pyは画面まわりのフロントエンド処理
audio_transcribe.py、conversation_agent.pyはバックエンド処理で、音声の文字起こしとLLMへの要求応答を担当しています。
「録音→文字起こし→AI応答→音声出力」のフルサイクルをワンストップで実現している点が大きな特徴的です。


| 領域       | 使用技術                         |
| :--------- | :------------------------------- |
| フロントエンド | Streamlit                        |
| 音声処理   | sounddevice, soundfile           |
| 音声認識   | faster-whisper                   |
| 音声合成   | kokoroライブラリ                 |
| 言語モデル | Gemma 3B (LM Studio経由)         |
| AIフレームワーク | LangChain                      |



# 前提
・LM Stdioがすでに導入済みであること。
　以下の記事が参考になります。
　https://zenn.dev/allllllllez/articles/20240507_lm_studio_with_obsidian
・speak インストールが完了していること。
　以下の記事が参考になります。
 　https://www.kkaneko.jp/ai/win/espeak.html
  ※注意点としてインストール完了後には環境変数にインストールされたespeakのパスを追加をお願いします。

![スクリーンショット 2025-06-22 130021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4119853/0cd0b390-2378-4c2e-96ef-927bce982153.png)




# 使用しているPC
GALLERIA XA7C-R48 Core i7 13700F/RTX 4080/16GBメモリ/NVMe SSD 1TB
 
# gemma3のインストール
まずはモデルのインストールから行います。今回はGoogleの gemma-3-12b-it をベースモデルとし、日本語の性能向上に特化してトレーニングされた大規模言語モデル（LLM）で「EZO2.5-gemma-3-12b-it-Preview」を使用します。

まずは、左にある虫眼鏡マークからモデルのダウンロードを行います。
![LM Stdio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4119853/86c3f9c4-2a49-419a-8462-a34d09b8e236.png)

検索欄でモデル名を入れれば、ダウンロード可能なモデルが表示されます。Q6_Kという部分をクリックすれば、モデルサイズを変更できます。モデルが大きすぎと会話がスムーズにいかずに待ち時間が長くなるため、サイズの小さいモデルを選択します。今回はQ6_Kの量子化モデルをダウンロードしました。

![LM Stdio1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4119853/d2c57895-4edf-49b7-8340-cf666f679bc1.png)
![LM Stdio5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4119853/00ce1cbd-5403-4ac7-a3ed-b06bb9ac7c14.png)


ダウンロードが完了したらモデルを読み込むかが聞かれます。読み込みが完了したら、左上の緑のマークをクリックして、Context Lengthを長めに設定して、GPU Offoadも高めに設定します。Context Lengthを長めにすることで過去の会話も考慮した回答にしてくれます。

![LM Stdio6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4119853/6b3fb6a5-d536-4bff-8cb5-9fec65e8cf86.png)

最後に右下の「Reload to apply change」をクリックすればgemma3のインストールは完了します。


# アプリの起動手順

以下に、アプリ起動手順を記載します。

## リポジトリのクローン

まず、以下のコマンドでリポジトリのクローンを作成します。

```bash
git clone https://github.com/yu1234se/AI_English_Conversation_Practice.git
```

## 仮想環境の構築と有効化

次に、プロジェクトフォルダ直下で仮想環境を構築します。

```bash
python -m venv venv
```

仮想環境を有効化するには、以下のコマンドを実行してください。

```bash
.\venv\Scripts\Activate.ps1
```

## 必要なライブラリのインストール

仮想環境が有効化されたら、`requirements.txt` に記載されている必要なライブラリをインストールします。

```bash
pip install -r requirements.txt
```

## アプリの起動

最後に、以下のコマンドでアプリを起動します。

```bash
streamlit run app.py
```

# アプリの操作方法
アプリ起動をするとlocalhstのポート8501で以下の画面が自動で立ち上がります。(http://localhost:8501)

![app1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4119853/ddb913d2-1339-4015-970a-2df028d99252.png)

以下の手順で会話練習を開始・進行できます。

録音の開始:
画面中央に表示されている「🎤 Start Recording」ボタンをクリックして、音声の録音を開始します。

録音の終了:
話し終えたら、「⏹️ Stop Recording」ボタンをクリックして録音を終了します。

音声の処理とAIへの送信:
録音終了後、「Transcribe and Send」をクリックすることで、録音された音声の処理とAIへの連携を行うための操作が続きます。この操作により、音声はテキストに文字起こしされ、その内容が「LM Studio」にあるgemma3に送信されます。

設定 (オプション):

画面左側の「Settings」セクションでは、「Speech Speed」（音声速度）を調整できます。スライダーを操作して、AIの音声応答の速度を0.50から2.00の間で変更できます。デフォルト値は1.00です。

![app1A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4119853/abb2e824-7b0a-44bd-9b59-7a7201e06d87.png)

AIの応答の確認と再生:
AI（LM Studio）からの回答が準備されると、画面上にAIの応答テキストと再生バーが表示されます。再生バーの横にある再生ボタン（▶アイコン）をクリックすることで、AIの回答を英語音声で聞くことができます。

次の会話の開始:
現在の会話を終えて次の会話に進みたい場合は、再度「🎤 Start Recording」ボタンをクリックして録音を開始し、話し終えたら「⏹️ Stop Recording」ボタンをクリックして録音を終了し、その後「Transcribe and Send」の処理を行うことで、次の会話フェーズに移行します。

設定 (オプション):
「Click to see English text」をクリックすれば読み上げた音声の文章を確認することが可能です。

# プログラムの説明


## app.py - メインアプリケーション
Streamlitベースの英会話練習アプリのフロントエンドとコアロジックを担当しています。
主な機能
- **カスタム音声レコーダー**
  - 録音開始/停止ボタンの実装
  - 最大5分間の音声録音機能
  - 無音部分の自動トリミング
  - 録音プレビュー表示
- **音声処理パイプライン**
  - 音声→文字起こし（audio_transcribe.py連携）
  - テキスト→音声合成（kokoroライブラリ使用）
  - 音声速度調整機能（0.5～2.0倍速）
- **会話管理**
  - 会話履歴の保持（セッション状態）
  - AI応答生成（conversation_agent.py連携）
  - 音声自動再生機能
- **UIコンポーネント**
  - チャットインターフェース表示
  - 音声速度調整スライダー（サイドバー）
  - 折りたたみ式テキスト表示（AI応答）

## audio_transcribe.py - 音声認識モジュール
音声ファイルを英語テキストに変換する専門モジュールです。
こちらでwhisperのモデルサイズを変更できますが、高速処理のためにサイズはsmallにしています。

```bash
# "small"モデルを使用し、GPU (cuda) でfloat16の計算タイプを使用します。
self.model = WhisperModel("small", device="cuda", compute_type="float16")
```


## conversation_agent.py - 対話エージェント
英会話応答を生成するAIエージェントモジュールです。

主な機能
- **プロンプトエンジニアリング**
  - 英会話講師ロールの厳格な定義
  - シナリオ設定（海外旅行・TOEIC600点レベル）
  - 出力制約（基本英語のみ・文法誤りのみ日本語指摘）
- **LangChain統合**
  - プロンプトテンプレート管理
  - LLM呼び出しの抽象化
- **ローカルLLM連携**
  - LM Studioサーバー接続（localhost:1234）
  - Gemma 3Bモデル使用（EZO2.5-gemma-3-12b-it）
- **会話コンテキスト管理**
  - 直近6メッセージの履歴保持

今回は「EZO2.5-gemma-3-12b-it-Preview.Q6_K.gguf」を使用しましたが、LM_STUDIO_LLM_MODEL_NAMEを変更すれば好きなモデルを選択できます。また、プロンプトはCONVERSATION_TEMPLATE に英会話のロールプレイのプロンプトを入力しています。別のシチュエーションでの会話に変更したり、英会話のレベルを上げる場合は、プロンプトを修正すれば調整可能です。

```bash
LM_STUDIO_LLM_MODEL_NAME = "EZO2.5-gemma-3-12b-it-Preview.Q6_K.gguf"

# 会話プロンプトテンプレート
CONVERSATION_TEMPLATE = """
あなたは、プロの英会話講師です。
以下の制約条件と入力文をもとに、最高の英会話レッスンをしてください。

#制約条件:
・英語での会話をロールプレイングしてください。
・1つずつ英語でのやりとりを行ってください。
・出力は基本的には英語の会話だけでお願いします。
・余計なことを言わずになりきって会話をしてください。
・文法や表現が適切でない場合のみ日本語で指摘してください。

#入力文:
以下の条件に合わせた英会話ロープレをお願いします。
・ジャンル:日常英会話
・シチュエーション:海外旅行
・レベル:TOEIC600点レベル

Current conversation:
{history}

User: {input}
Assistant:
"""
```

# まとめ
英語学習における「話す」課題を解決するため、ローカルLLM（大規模言語モデル） と様々な音声処理技術を組み合わせた英会話アプリについて解説しました。

アプリは、ユーザーの音声をWhisperで文字起こし、それをローカルLLM（Gemma 3Bモデルを使用）で処理して英語の応答を生成、さらにKokoroで音声として読み上げるという流れで動作します。フロントエンドにはStreamlit、AIフレームワークにはLangChainを使用し、音声の速度調整や会話履歴の保持など、実践的な機能も盛り込まれています。

このアプリは、英会話スクールに通う費用や人目を気にすることなく、自分のペースで気軽に英語を話す練習をしたいと考えている私のような方をターゲットに作りました。プロンプトを調整することで、会話のシチュエーションやレベルを自由に変更できるため、様々な学習ニーズに対応が可能です。また、モデルやパラメータの変更すれば英語だけでなくほかの言語での会話も変更可能です。


このプロジェクトの詳細は、以下のGitHubリポジトリで確認できます。

[AI_English_Conversation_Practice](https://github.com/yu1234se/AI_English_Conversation_Practice/tree/main)
[X]デモ動画を投稿しました。
(https://x.com/Sharaku12354890/status/1936734068038906258)