音声制御AIエージェントの構築
- •KDnuggetsは、本番環境の音声エージェントにはSTT、LLM、TTSの単純な連鎖を超えたストリーミング制御が必要だとした
- •音声エージェントの遅延目標には、200 to 300msの発話間隔と3 seconds超での離脱が含まれる
- •チュートリアル例は、50msの音声チャンク、nine個の部分転写、調整可能な無音しきい値を示した
KDnuggetsはJuly 31, 2026、実用段階の音声制御AIエージェントには、単純なspeech-to-text、LLM、text-to-speechの連鎖ではなく、ストリーミング制御が必要だとするチュートリアルを公開した。記事によると、STTが発話全体を転写し、LLMが回答全体を生成し、TTSが音声全体を合成してから再生する逐次型の構成は、2026年の実会話には遅すぎる。自然な音声エージェントを作る工学上の要点として、遅延、ターンテイキング、ツール呼び出し、割り込み処理、意味的な発話終了検出(話者が話し終えたかを検出する仕組み)、バージイン取り消し、ストリーミング、time-to-first-tokenを挙げた。
記事は、各段階が完了を待たずに部分出力を次へ渡すため、ストリーミングが本番環境の標準パターンだとしている。STTは部分転写をLLMへ流し、LLMはトークンをTTSへ流し、TTSは後続テキストの生成中でも最初の完全な文から発話を始める。遅延目標は狭い。人間同士の会話には自然な200 to 300msの発話間隔があり、500msを超える遅れは遅く感じられ、3 secondsを超える遅れでは大半のユーザーが離脱するか、システムが壊れていると考える。現在のspeech-to-speechシステムは、主要プロバイダー全体でtime-to-first-tokenが0.8 to 3 secondの範囲に集まると説明された。
ストリーミング型speech-to-textについて、記事は本番システムが永続的なWebSocket接続を使い、およそ50msの音声チャンクを送信し、ユーザーが話している最中に転写イベントを受け取るとした。チュートリアルは、部分転写イベントと最終転写イベントを分けている。部分転写はモデルが推測を修正するにつれて変わり得る一方、下流システムは最終イベントだけに基づいて動作すべきだという。Python 3.10+の模擬STT例は標準ライブラリだけを使い、“My order number is A B 3 7 9 2”という発話をシミュレートし、nine個の部分転写を出した後、信頼度0.97の最終転写を1つ返す。部分イベントの信頼度は0.7だ。
ターン検出は、エージェントがいつ聞くのをやめて応答すべきかを決めるため、STTとは別のコンポーネントとして示された。記事によると、本番システムでは発話終了を宣言する前にaround 600msの最小無音時間を使うことが多く、曖昧な間を強制的に応答へ進める最大無音上限はoften around 1500msに設定される。高齢者ケアや医療のような慎重な発話が多い文脈では、その上限をtoward 2500msへ上げる場合があり、速い会話の文脈では最小値をtoward 300msへ下げる場合がある。チュートリアルの状態機械例では、t=300msからt=500msまでの休止はsilence_pendingのままで、t=700msの実際の停止後にt=1300msでend_of_turnが発火する。
応答ストリーミングの節では、LLMは生成された順にトークンを送り、TTSは生のトークンや回答全体ではなく、完全な文を合成すべきだとしている。Python例は文境界の正規表現を使い、完全な応答が終わる前に“Let me check that for you.”をyieldし、注文状況に関するサンプル応答から合計three文を生成する。記事は、この早い受け渡しにより、ユーザーは完全な回答を待つのではなく、LLMの生成開始から数百ミリ秒以内にエージェントの声を聞けるとしている。