E.D.E.N.という、わたし専用のAIアシスタントを作っています。従量課金のAPIを増やさず、手元のPCで動かすことを条件にしているプロジェクトです。
ある日、使っていて「しゃべるのが遅い。反応も遅い」と感じました。画面には「SPEAKING」と出ているのに、声がなかなか出てこない。出てきた声も、いつものニューラル音声ではなく、平坦なブラウザの読み上げ音声でした。
今回はその原因を切り分けた記録です。結論から書くと、AIの頭脳でもマイクでもなく、音声エンジンを置いていた場所が原因でした。
最初に疑ったのは、AIの応答速度だった
画面の下には、返答にかかった時間が出ます。そのときの表示は「26.0秒」でした。まずローカルLLM(Ollamaで動かしているQwen 3.5 9B)を疑って、単体で計測しました。
| 条件 | 応答までの時間 |
|---|---|
| モデルがメモリに載っていない状態(1回目) | 9.2秒(うちモデル読み込み 8.6秒) |
| 載った後(2回目) | 0.1秒 |
遅いのは「最初の1回だけ」でした。調べると、GPUのメモリに別モードの大きいモデル(Gemma 4 26B)が載っていて、JARVISのモデルが押し出されていました。モードを切り替えた直後に、モデルの読み込みで8秒ほど待たされていたことになります。
これは対策できます。サーバー起動時にJARVISのモデルを先に読み込み、2時間保持するようにしました。ただ、26秒のうち8秒程度しか説明できません。
本当の原因は、音声の側にあった
次に、音声合成だけを単体で呼び出しました。E.D.E.N.は、Kokoroというオープンな音声合成モデルをPC内で動かし、文ごとに音声を作って再生しています。
結果はこうでした。
- 1回目の呼び出し: 30.1秒待って失敗(タイムアウト)
- 2回目の呼び出し: 即座に失敗
音声エンジンが、一度も起動できていませんでした。サーバーは音声エンジンの起動を30秒まで待ち、間に合わなければ諦めて作り直す作りです。E.D.E.N.は「ニューラル音声が使えないときはブラウザの読み上げに切り替える」ようにしてあるので、画面上は動いて見えていました。実際には、毎回30秒待ってから、平坦な代わりの声でしゃべっていたわけです。「遅い」と「声がいつもと違う」は、同じ原因でした。
起動に何秒かかるのかを測った
では、音声エンジンは本来何秒で起動するのか。サーバーを通さず、音声エンジンを直接起動して計測しました。
173.8秒。 約3分です。30秒の待ち時間で間に合うはずがありません。
E.D.E.N.のフォルダは、Google Driveの同期フォルダの中に置いています。複数のAIで同じファイルを扱うためです。音声エンジンを動かすには、Python本体と必要なライブラリ一式(約730MB・約4,500ファイル)と、音声モデル(約340MB)を読み込む必要があります。これをGoogle Driveのストリーミングを通して、毎回ネットワーク越しに読んでいました。
ローカルディスクへ移したら、3.6秒になった
音声エンジン一式を、PCのローカルディスクへコピーしました。コピーそのものには、Python環境だけで約3分かかりました。
同じ計測をやり直した結果です。
| 置き場所 | 起動から1文の音声ができるまで |
|---|---|
| Google Driveの同期フォルダ | 173.8秒 |
| ローカルディスク | 3.6秒 |
約48分の1です。起動した後は、1文の音声を作るのに0.6秒ほどでした。
原本はこれまで通りGoogle Driveに置いたままにしています。Python環境は初回の起動時だけローカルへコピーし、音声の設定ファイルとモデルは起動のたびに差分を同期します。音声の設定を直すときは原本を編集すれば、次の起動で反映されます。
あわせて直したこと
原因が分かったついでに、周辺も直しました。
- 待ち方を変えた。 音声エンジンが準備中のあいだは、30秒待たずにすぐブラウザの読み上げへ切り替えるようにしました。準備ができたら、次の文からニューラル音声に戻ります
- 起動の待ち時間を30秒から4分へ延ばした。 Google Driveから読むことになっても、起動自体は最後までやり切れるようにしました
- 話す速さを上げた。 3つのモードとも、約2割速くしました。設定画面に「話す速さ」の切り替えも付けました
- 読み間違いを直した。 RAPHAELモードは文頭に「告。」「否。」「問。」を付けて話します。音声合成の辞書がこれを「つげ」「いな」「とい」と読んでいたので、読み上げの直前に「こく」「ひ」「もん」へ置き換えるようにしました
わたしが学んだこと
同期フォルダは、文書を置くには便利です。ただ、大量の小さなファイルを毎回読む実行環境を置く場所ではありませんでした。 しかも失敗が「遅い」「声が少し違う」という形でしか表に出ず、代わりの仕組みが動いていたせいで、壊れていることに気づくまで時間がかかりました。
代わりの仕組みを用意するなら、切り替わったことが見えるようにしておく。これは次の改修で入れるつもりです。
このシリーズの続き: E.D.E.N.開発ログ #6|ローカルLLMが「株価は取得できません」と答えた原因は、振り分けの正規表現に「株価」が無かったこと
前回: E.D.E.N.開発ログ #4|3人のAIの「機能」はそのまま、「喋り方」だけを描き分けた
E.D.E.N.の全体像と、開発ログの一覧は「E.D.E.N.とは|開発ログ一覧」にまとめています。


コメント