技術 約4分で読めます

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 で試せる。

問題点

  1. ブラウザ内LLMが遅い: 約900MBのモデルダウンロードが必要で、推論もモッサリする
  2. 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.10/100万トークン、出力0.10/100万トークン、出力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

構成比較

機能変更前変更後
音声認識WhisperWhisper(変更なし)
VADSileroSilero(変更なし)
LLMWebLLM(Qwen 1.5B)Gemini 2.0 Flash API
TTSSupertonic(英語)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なので負荷ゼロ

ボトルネックはネットワーク遅延くらいだろう。

次回

実際にコードを改造して動かしてみる。