AIと会話を試みる(音声で)
やりたいこと
音声で話しかけたらAIが音声で返してくる、そんなシステムを作りたい。
具体的には:
- 音声認識でテキスト化
- LLMで回答生成
- 音声合成で読み上げ
リアルタイム会話なので、レスポンス速度が重要になる。
ベースプロジェクトを発見
irelate-ai/voice-chat というプロジェクトを見つけた。
デフォルトの構成:
- 音声認識: Whisper(ブラウザ内)
- VAD: Silero(発話区間検出、話し終わりを自動検知)
- LLM: WebLLM(ブラウザ内Qwen 1.5B)
- TTS: Supertonic(英語向け)
面白いのは、すべてブラウザ内で完結する設計になっていること。外部APIを使わずにローカルで動く。
デモは https://huggingface.co/spaces/RickRossTN/ai-voice-chat で試せる。
問題点
- ブラウザ内LLMが遅い: 約900MBのモデルダウンロードが必要で、推論もモッサリする
- TTSが英語向け: Supertonicは日本語をまともに読めない
日本語で音声会話したいので、両方とも差し替えが必要。
LLMの選択: Gemini 2.0 Flash
ブラウザ内で動かすより、高速なAPIに投げた方が体験が良い。
いくつか選択肢を検討した:
- Claude API
- OpenAI API
- Gemini API
- Ollama(ローカル)
なぜGemini?
無料枠が太っ腹:
- Gemini 2.0 Flash:15リクエスト/分、1日1500リクエストまで無料
- Gemini 1.5 Pro:2リクエスト/分、1日50リクエストまで無料
有料になっても安い(入力0.40/100万トークン)。
なぜFlash?
Proじゃなくていい。むしろFlashの方がいい。
- 音声会話ではレスポンス速度が体験を大きく左右する
- 日常会話レベルなら十分賢い
- Proは複雑な推論や長文分析向けでオーバースペック
速度が正義。
APIキーは Google AI Studio でGoogleアカウントログインすればすぐ発行できる。
TTSの選択: VOICEVOX
日本語の音声合成をどうするか。
検討した選択肢
| 方法 | 速度 | 日本語品質 | 手間 |
|---|---|---|---|
| VOICEVOX | 速い | 良い | 簡単(API標準装備) |
| VOICEPEAK CLI | 遅い | 良い | 微妙 |
| Gemini Live API | 速い | 未知数 | 要検証 |
| Google Cloud TTS | 速い | 良い | API課金 |
| Style-Bert-VITS2 | 速い | 良い | 学習が必要 |
VOICEPEAKは使えない
実はVOICEPEAKを持っているので最初はこれを使おうと思った。
しかしVOICEPEAKはAPIがない。GUIで手動操作するか、CLIでファイル出力するかの2択。
CLIで voicepeak -s "テキスト" -o output.wav はできるが、ファイル経由になるのでリアルタイム会話には向かない。生成に数秒かかる上に、ファイル書き出し→読み込み→再生のオーバーヘッドがある。
VOICEPEAKのライブラリだけ外部から使えないか調べたが、専用フォーマットでエンジンと一体でしか動かない設計。リバースエンジニアリングは規約で禁止されている。
VOICEVOXが最適解
VOICEVOXはインストールして起動するだけで、ローカルに localhost:50021 でAPIサーバーが立つ。
# 音声合成クエリ作成
curl -X POST "localhost:50021/audio_query?text=こんにちは&speaker=8"
# 音声生成
curl -X POST "localhost:50021/synthesis?speaker=8" \
-H "Content-Type: application/json" \
-d @query.json > output.wav
無料だし、設定不要だし、これ一択。
話者の選択
VOICEVOXにはたくさんのキャラクターがいる。
自分のキャラに近いイメージの声が欲しかったので色々聞き比べた結果、春日部つむぎ(speaker=8)を採用。明るくて元気な感じがいい。
https://voicevox.hiroshiba.jp/product/kasukabe_tsumugi/
改造方針まとめ
変更点1: LLMをGemini 2.0 Flashに差し替え
- WebLLM関連を削除(
use-webllm.ts、モデルダウンロード処理) /api/chatエンドポイントを新規作成- Gemini 2.0 Flash APIを呼び出す
- APIキーは環境変数
GEMINI_API_KEYから読む
変更点2: TTSをVOICEVOXに差し替え
- Supertonic TTSを削除
- VOICEVOX API(localhost:50021)を呼び出す
- 話者: 春日部つむぎ(speaker=8)
/audio_query→/synthesisの2ステップ
削除するもの
- WebLLM関連(
use-webllm.ts、モデルダウンロード処理) - Supertonic TTS関連
- 英語用の声データ(
public/voices/)
残すもの
- Whisper STT(音声認識)
- Silero VAD(発話区間検出)
- 基本的なUI
構成比較
| 機能 | 変更前 | 変更後 |
|---|---|---|
| 音声認識 | Whisper | Whisper(変更なし) |
| VAD | Silero | Silero(変更なし) |
| LLM | WebLLM(Qwen 1.5B) | Gemini 2.0 Flash API |
| TTS | Supertonic(英語) | VOICEVOX(春日部つむぎ) |
動作環境
手持ちのPCはRTX 4060 Laptop(VRAM 8GB)。
このプロジェクトの要件:
- WebGPU対応ブラウザ(Chrome/Edge)
- RAM 4GB程度
4060 Laptopなら余裕。WebGPUはブラウザがGPUを使うだけなので問題ない。
Gemini APIを使う構成なら、LLM部分はクラウドに投げるのでローカルの負荷はさらに軽い:
- Whisper(STT):150MB、ローカルGPUで高速
- VAD:2MB、軽い
- TTS:VOICEVOX(別プロセス)
- LLM:Gemini APIなので負荷ゼロ
ボトルネックはネットワーク遅延くらいだろう。
次回
実際にコードを改造して動かしてみる。