ブログ · · 約 6 分で
音声 AI の応答の遅れ:どこで時間がかかり、どう縮めるか
音声 AI の
要点
- 音声 AI の
遅れは 「相手が 話し終えてから、 AI の 声の 最初の 音が 相手に 届くまで」 の 時間で 考え、 話し終わりの 判定・音声認識・生成 AI・音声合成・回線の 区間に 分けて 測ります。 - 縮める
基本は、 各段を 待たずに 流しながらつなぐ ことです。 生成 AI の 返事を 文ごとに 音声合成へ 渡し、 最初の 一文を 短く すると、 最初の 音が 早く 出ます。 - 外部の
API を 呼ぶ 待ち時間は 消せないので、 「お調べします」 のような つなぎの ことばで 無言を 作らないようにします。
音声 AI の
人の会話の「間」
人どうしの
音声 AI は、
遅れが出る 5 つの区間
遅れは
| 区間 | 何を |
長くなる |
|---|---|---|
| 1. 話し終わりの |
無音が |
無音を |
| 2. 音声認識の |
最後の |
発話の |
| 3. 生成 AI の |
指示文と |
長い |
| 4. 音声合成の |
返事を |
返事の |
| 5. 回線・ネットワーク | 音声を |
処理の |
このうち 1 は、
区間ごとの測り方
- 相手の
声が 止まった 時刻 (VAD が 無音を 検出した 時刻) - 話し終わりと
判定した 時刻 - 音声認識の
結果が 確定した 時刻 - 生成 AI の
最初の 文字 (トークン) が 届いた 時刻 - 音声合成の
最初の 音の データが 届いた 時刻 - その
音を 回線に 送り出した 時刻
この
# 1 回の受け答えの時刻(秒)から区間の長さを出す
STAGES = [
("turn_end", "speech_stopped", "turn_detected"),
("stt", "turn_detected", "transcript_final"),
("llm_first_token", "transcript_final", "llm_first_token"),
("tts_first_audio", "llm_first_token", "tts_first_audio"),
("send", "tts_first_audio", "audio_sent"),
]
def breakdown(ts: dict[str, float]) -> dict[str, int]:
out = {name: round((ts[end] - ts[start]) * 1000) for name, start, end in STAGES}
out["total"] = round((ts["audio_sent"] - ts["speech_stopped"]) * 1000)
return out # ミリ秒縮め方
効きやすい順に
流しながらつなぐ
いちばん
- 音声認識は、
話している 間から 少し ずつ認識する (ストリーミング) 方式に する - 生成 AI の
返事は、 全文を 待たずに 文字が 出てくる そばから 受け取る - 句点
(。 ) や 疑問符で 文を 区切り、1 文ずつ音声合成に 渡す
全文を
最初の一文を短くする
文ごとに合成するなら、
- 悪い
例: 「ご予約の 変更で ございますね。 それでは、 現在の ご予約の お日にちと、 ご希望の 新しい お日にちを 順番に お伺いしても よろしいでしょうか。 」 - 良い
例: 「承知しました。 」 「いまの ご予約は、 何日でしょうか。 」
生成 AI に読ませる量を減らす
生成 AI の
- 指示文から、
その 用途で 使わない 説明を 消す - よく
ある 質問の 答えは、 短く 言い 切る 形で 書く - 長い
通話では、 古いやりとりを 要約して 履歴を 短く 保つ
道具の待ちは、ことばで埋める
予約の
割り込まれたら、すぐ止める
遅れとはclear の
処理の場所を相手に近づける
音声認識・生成 AI・音声合成の
voicast での応答の速さ
voicast では、
よくある質問
音声 AI の遅れは、どこから測ればよいですか。
相手の
話し終わりの判定を短くすれば速くなりますか。
速くは
速いモデルに替えるのがいちばん効きますか。
区間を