音声AIエージェントの遅延原因をCloudflareで切り分ける

Cloudflareのturnmetricsを使い、音声AIエージェントの遅延や無音応答をステージ別に切り分ける方法を解説します。7つのoutcome、各タイミングの読み方、3つの制御テストを押さえれば、モデルやTTSを推測で変更する前に、文字起こし・モデル・音声生成・ブラウザ再生のどこを調べるべきか判断できます。

Saturday, September 12, 2026Omid Saffari
音声AIエージェントの遅延原因をCloudflareで切り分ける

Cloudflareの音声AIエージェントが遅い、または無音になるとき、処理がどこで止まったのかを特定できるようになりました。モデルの変更、プロンプトの書き直し、高速な音声サービスへの追加投資に踏み切る前に、原因を証拠で切り分けられます。@cloudflare/voice 0.4.0では、音声・テキストの各ターンに型付きの結果とステージ別の所要時間が付くため、デバッグで最初に問うべきことは「どのベンダーを替えるべきか」ではなく「どのステージで失敗したか」になります。

音声AIエージェントの遅延診断、まず押さえる答え

@cloudflare/voice@^0.4.0agents@^0.22.0と組み合わせてインストールし、turnmetricsイベントを監視します。あとは各ターンをturnIdsourceoutcome、そして実際に存在するタイミングフィールドで分類してください。Cloudflareの9月11日リリースでは、正常終了した音声とテキストのほか、空の出力、モデル上限、コンテンツフィルタリング、モデルエラー、音声生成エラー、中断されたターンまで判別できます。

これは、6月16日に最終更新された現行のVoiceガイドに載っている4つの互換メトリクス、llm_mstts_msfirst_audio_mstotal_msから大きく前進したものです。この4項目が表すのは、空ではない音声応答を返して正常終了したターンの所要時間です。テキストターン、空の回答、中断、失敗したターンが、なぜ音声を返さず終わったのかまでは分かりません。

従来の表示が配達完了票だとすれば、VoiceTurnMetricsは荷物の追跡履歴です。受付、仕分け、発送、完了までを1つの識別子で追い、配送に失敗した場合も、どこで止まったかを確認できます。

TypeScript
client.addEventListener("turnmetrics", (turn) => {
  console.log(turn.outcome, turn.turnTotalMs);
});

この最新サマリーは、VoiceClientuseVoiceAgent()useVoiceInput()のいずれからも取得できます。最後に挙げたAPIは音声テキスト変換専用なので、公開されるのは音声と文字起こしについて計測可能な項目だけです。

音声、モデル、TTSのタイミング軸を1回の音声ターン全体に対応づけた構成図
各タイミングは足し合わせる数値ではなく、1つのターン内で重なり得る通過点として読みます。

各タイミングから実際に何が分かるのか

分析の基本単位は1回のターンです。turnIdが処理をひも付けるキー、sourceが入力元が音声かテキストかを示し、outcomeがターンの終了状態を表します。それ以外のフィールドは、すべてミリ秒単位の所要時間です。

ターン内の処理確認するフィールド計測範囲
音声からテキストへの変換speechStartToFirstInterimMs, speechStartToFinalMsプロバイダー側で発話が始まってから、最初の暫定文字起こし、続いて確定文字起こしが得られるまで
文字起こし後のフックafterTranscribeMsサーバー側のafterTranscribeフックにかかった時間
モデルの応答modelToFirstTextMs, modelStreamConsumptionMs空白以外のモデル出力が最初に現れるまでと、正規化されたストリームを最後まで処理するまで
公開された推論exposedReasoningMsモデルストリームが公開する推論ブロックに費やした累積時間
最初の音声応答finalInputToFirstAudioMs, ttsToFirstAudioMs入力確定時点および最初のTTS呼び出しから、サーバーが最初の音声を送信するまで
音声生成処理ttsWallMs, ttsWorkMsすべての文の処理にかかった実時間と、並行して動くTTSジョブを含む処理時間の累計
ターン全体turnTotalMsターンの割り当てから最終サマリーが確定するまで

これらの値を足し合わせてはいけません。Cloudflareによると、各タイミングは同じサーバークロックを使っており、互いに重なる可能性があります。典型例が文単位のチャンク処理です。モデルが続きをストリーミングしている間に、完成した文の音声合成を始められます。モデルとTTSの所要時間を合計すると、一部の実時間を二重に数えることになります。

タイミングが存在しないことも手掛かりです。該当するライフサイクル上の地点に到達しなかったと分かります。テキストターンに音声から文字起こしまでのフィールドはありません。no_outputなら、モデルがTTSへ渡す内容を何も生成していないため、TTSを調整しても解決しません。ttsToFirstAudioMsがなければ、TTSから最初のサーバー音声を送る段階に一度も到達していません。

ただし、重要な境界があります。ブラウザでの再生はVoiceTurnMetricsの対象外です。Workerとブラウザのクロックが独立しているため、Cloudflareは計測から除外しています。サーバー側では最初の音声がすぐ送られているのに、通話相手には間が空いて聞こえるなら、調べる先をクライアント側の転送、デコード、デバイスのルーティング、再生処理へ移してください。

本番に触る前に実施する3つの制御テスト

以下は、制御されたSDKテストでの観測結果であり、本番環境のレイテンシ実績ではありません。既知の経路を計測機構が正しく分類できると確かめてから、顧客との通話データを信頼するためのテストです。中立的なプロンプトを使い、会話内容はログに残さないでください。

テスト1:正常終了する音声ターン

通話を開始し、短い定型フレーズを1つ話し、エージェントの返答を遮らず最後まで流します。この経路に対するCloudflare側のテストでは、source: "speech"outcome: "completed"turnIdに加え、文字起こし、モデルストリームの処理、TTS処理、ターン全体の所要時間が取得されます。

確認するのは速さの優劣ではなく、構造です。同じturnIdが最終サマリーにも含まれ、想定したステージのフィールドがそろっていることを確認します。ローカルで1回実行しただけのミリ秒値を、速度性能の根拠として公表してはいけません。

テスト2:正常終了するテキストターン

sendText()で定型メッセージを送ります。この経路は音声テキスト変換を通らず、直接onTurn()へ進みます。Cloudflare側の制御テストで得られるのは、source: "text"outcome: "completed"、モデルストリームのタイミングです。speechStartToFirstInterimMsspeechStartToFinalMsafterTranscribeMsは含まれません。

この性質により、テキストは比較基準として役立ちます。音声ターンは遅く感じるのに、同等のテキストターンではモデルの最初の出力がすぐ届くなら、モデルよりも文字起こし、ターン検出、onTurn()への受け渡しを疑うべきです。

テスト3:意図的に空の応答を返す

テスト専用の分岐を設け、既知の入力が1つ来たときにonTurn()から空のストリームを返します。Cloudflare側のテストでは、この音声ターンはno_outputに分類されます。アシスタントの文字起こしイベント、互換メトリクスのメッセージ、speaking状態はいずれも発生しません。

これで、無音だからといって必ずしもTTSの問題ではないと明確に証明できます。音声合成に渡せる応答テキストが、そもそも存在しなかったからです。アサーション後はテスト分岐を削除し、ユーザーが操作できる会話テキストを分岐条件に使わないでください。

正常な音声、正常なテキスト、出力なしの音声ターンを比較するテストマトリクスの構成図
本番ターンを解釈する前に、3つの制御経路で現れるべきフィールドを確定します。

終了状態は7つ、診断先も7通り

outcomeは、次に調べる先を決めるルーティングラベルです。無音のターンをすべて同じ一般的な障害として扱うと、今回のリリースで得られる最大の価値を捨ててしまいます。

終了状態(outcome)次に確認すべきこと
completedパイプラインは通常の終了状態まで到達しています。遅いタイミング地点を調べ、サーバーから音声がすぐ送られているならクライアント再生を確認します。
no_outputモデルは完了しましたが、表示可能な応答テキストがありません。TTSより先に、プロンプトロジック、ツール分岐、空のストリーム、応答の正規化を確認します。
output_limit対応するモデルストリームが長さの上限で終了しました。出力上限と、途中までの出力を音声に使ってよいかを検討します。
content_filtered対応するモデルストリームからコンテンツフィルタリングが報告されました。会話自体を記録せず、リクエスト経路と安全性ポリシーを確認します。
model_errorモデルのストリーミングに失敗しました。音声レンダラーではなく、モデルイベントと、プロバイダーから得た安全に記録できるエラーメタデータを確認します。
tts_error応答テキストは存在しますが、1回以上のTTS処理に失敗しました。ここで初めて、音声プロバイダー、音声形式、合成フックを疑います。
aborted完了前にターンが中断、置換、または切断されました。割り込み動作、切断、キャンセル処理を確認します。

no_outputoutput_limitcontent_filteredmodel_errorを区別することには意味があります。通話相手から見れば、4つとも「エージェントが何も言わなかった」ように映るからです。最初にプロンプトや空ストリームのロジックを疑うべきなのは、そのうち1つだけです。どれも、高速な音声サービスを購入することが最初の対処にはなりません。

最初に効果が出る7つの場面

特に効果が大きいのは、誤診によって作業のやり直しが生じたり、不要なベンダー変更に追い込まれたりする場面です。

1. 無音ターンが発生するカスタマーサポートエージェント

サポートエンジニアリングチームは、会話内容を含まないターンサマリーをケース識別子と一緒に記録し、無音ターンを終了状態別に分類できます。各グループをモデル、安全性、TTS、接続の担当者へ振り分ければ、推測に基づくたらい回しが減ります。no_outputの集団は応答ロジックへ、tts_errorの集団は音声経路へ送ります。

2. 予約受付エージェント

クリニックや飲食店の自動化チームなら、固定した予約フローをテストし、すべてのターンを関連付け、リリース前後で遅延がどこに入ったかを比較できます。事業上の価値は、見栄えのよいレイテンシグラフではありません。売上につながる予約ワークフローを変更する前に、通話相手を待たせた原因が文字起こし、モデル出力、音声生成、ローカル再生のどこにあるかを把握できることです。

3. 音声エージェントの回帰テスト

プロダクトチームは、既知の音声、テキスト、空出力、中断のケースを少数そろえたテストスイートを維持できます。各ビルドで最終的な終了状態とフィールドの有無を検証し、リリース間でステージ別の分布を比較します。これにより、広範なエンドツーエンドのスコアに埋もれる前に、障害経路の変化を検出できます。

4. 間違ったレイヤーを責めないプロバイダー比較

音声ベンダーを比較するチームは、プロンプトとモデルを固定したまま、制御された実行でttsToFirstAudioMsとTTS処理時間を比較できます。モデルのテキストが現れる前に遅延しているなら、TTSの比較は意味がありません。TTSが計測上のボトルネックなら、低レイテンシTTS APIの比較を検討する適切なタイミングです。

5. 多言語文字起こしの調整

多言語サービスでは、対応する各言語で同じタスクと既知の発話を使い、音声開始から暫定結果、確定結果までの時間を、モデルの処理時間と分けて確認できます。ターン全体の数値1つでは隠れてしまう、文字起こしやターン検出の問題を見つけられます。ただし、高速でも文字起こしが間違っている場合はあるため、精度は別途評価しなければなりません。

6. テキストと音声を併用するインターフェース

フィールドサービス向けアプリなら、同じエージェントロジックを通すテキスト入力の対照ターンと音声ターンを比較できます。テキストはSTTを通らないため、2経路の差から調査範囲を音声入力とターン確定に絞れます。共通のturnId、入力元、終了状態を使えば、両チャネルを1つの診断スキーマで扱えます。

7. 割り込みが多い電話フロー

IVRを置き換えるチームは、長い応答を意図的に遮り、そのターンが原因不明の失敗ではなくabortedになることを確認できます。障害レポートが整理され、より安全なキャンセル処理につながります。ただし、通話相手が割り込み動作を好意的に受け取った証明にはならないため、音声レビューとユーザーテストは引き続き必要です。

この計測で変わる予算判断

Cloudflareのテストアプリ内で行う、ステージ単位の初期切り分けなら、新しいイベントで対応できます。ただし、本格的な音声QAプラットフォームの代替にはなりません。

この違いは重要です。専門サービスの現行料金には、はるかに広い機能が含まれているからです。Covalの料金はStarterプランが月額$100、Growthプランが月額$500で、シミュレーション、モニタリング、トレース保存、評価機能を提供しています。Roarkの料金は開始時クレジットが$50、利用料として消費されるTeamプランが月額$500、Enterpriseプランは月額$4,000からです。

当面の課題が「このCloudflareターンを遅く、または無音にしたステージはどこか」であれば、より広範な仕組みを購入する前にturnmetricsを実装してください。合成通話、スコアリング、アラート、長期トレース、人によるレビュー、コンプライアンスのワークフロー、プラットフォーム横断比較が必要なら、SDKイベントは素材にすぎません。予算の分け方は明快です。診断には計測を使い、その診断を継続運用する仕組みにはQA製品を使います。

構築する価値がある3つのプロダクト

1. Cloudflareネイティブのターン切り分けコンソール

最も有望なのがこの案です。会話内容を含まないVoiceTurnMetricsを取り込み、終了状態別に分類し、ステージごとの分布を表示し、関連イベントをturnIdでひも付けます。音声エージェントの購入層は事業者にとって価値の高い顧客層で、DataForSEOによると、米国におけるai voice agentの月間検索数は6,600、検索意図は商用、CPCは$51.22です。より限定的なvoice agent latencyは月間10件にすぎません。つまり、これは幅広い消費者向けではなく、専門領域へ入るための足掛かりです。

販売可能な最小構成には、イベントコレクター、保存期間の制御、入力元と終了状態のフィルター、リリース前後の比較、記事末尾の表に示す判断ルーティングが必要です。現行市場の価格から、値下げ圧力も読み取れます。Covalは月額$100からで、CovalとRoarkのより広範なチーム向けプランは月額$500です。

難点は、特定プラットフォームへの依存です。Cloudflareが独自UIを拡張する可能性があり、ブラウザ再生は安定したターンサマリーの対象外です。優位性にするべきなのはワークフローです。リリース比較、回帰の証拠、プライバシー制御、問題のあるクラスターから担当者へ素早くつなぐ仕組みが必要になります。

2. プルリクエスト向けのレイテンシ回帰ゲート

固定した音声、テキスト、空出力、中断のケースをプレビューデプロイに対して実行し、想定外の終了状態が現れた場合や、計測対象のステージがチーム独自の基準値より悪化した場合にリリースを止めるプロダクトです。DataForSEOによると、米国のvoice ai agentは月間880検索で、CPCは$36.64です。さらに限定的なlow latency voice agentは月間10検索にすぎませんが、CPCは$29.34で、これも検索規模は小さくクリック単価は高いという兆候です。

MVPに必要なのは、テストランナー、基準値の保存、終了状態のアサーション、パーセンタイル比較、簡潔なCIレポートです。同条件のものだけを比較し、重複するタイミングを決して足し合わせない設計にします。

難点は、テストの再現性です。合成したマイク入力では、通話相手ごとのネットワーク、アクセント、ブラウザ、デバイス、電話回線の全経路を再現できません。本番体験の証明ではなく、リリース保護として販売すべきです。

3. ステージを意識したプロバイダー比較ラボ

パイプラインの大部分を固定し、一度に1社のプロバイダーだけを切り替えて、そのプロバイダーが実際に影響できるステージを比較するプロダクトです。DataForSEOによると、米国のvoice agent platformは月間40検索、検索意図は商用、CPCは$44.12です。検索数は控えめですが、クリック単価を見る限り、少数の真剣な購入層をめぐってベンダーが競っています。

MVPには、再現可能なプロンプトと音声フィクスチャ、プロバイダー設定、ステージ別サマリー、終了状態ごとの発生率、書き出し可能な判断レポートが必要です。モデルの改善による効果を高速なTTSベンダーの手柄にしたり、文字起こしの遅延をそのベンダーの責任にしたりする誤判断を防げます。

難点は、原因の帰属です。VoiceTurnMetricsが計測するのはSDKライフサイクル上の通過点であり、プロバイダー内部まで含む完全なトレースではありません。ネットワーク上の配置、ブラウザ再生、入力品質、プロバイダー側の待ち行列には、別の証拠が必要です。

この機能だけでは解決できないこと

ターンメトリクスが教えてくれるのは、調査を始める場所です。文字起こしが正しかったか、回答が役に立ったか、音声が自然だったか、通話相手が目的を達成したか、クライアント再生が滑らかに感じられたかまでは分かりません。

ブラウザコンソールの診断ストリームは、サーバーのライフサイクルイベントと、マイク、接続、最初の音声、再生のイベントをまとめて確認できるため、ローカル調査には役立ちます。ただし、一時的なデバッグ補助として扱ってください。Cloudflareによるとデフォルトでは無効で、イベント名とフィールドは変わる可能性があるため、安定した分析用の契約にはできません。

安定版のサマリーは意図的に会話内容を除外していますが、独自メッセージの設計次第で、その保護を台無しにしてしまいます。Cloudflareは既知のコンテンツフィールドを除きますが、任意のプロバイダー応答の中身までは検査しません。独自のエラー文字列には、文字起こし、プロンプト、ツール引数、顧客識別子などの会話内容を含めないでください。

最後に、Voiceガイドには現在もBetaと明記されています。バージョン固定、制御されたテストスイート、リリースごとのレビューを、事務的な後処理ではなく実装の一部として扱ってください。

このテーマでよく検索される質問

Cloudflare Realtime Agentsとは何ですか?

Cloudflare Realtime Agentsは、WebRTC、パイプラインのオーケストレーション、構成可能な音声・モデルコンポーネントを中心にした、以前からあるリアルタイム音声ランタイムです。ここで扱う@cloudflare/voiceパッケージは、WebSocketを使うAgents SDKの音声経路です。いずれもCloudflareの音声関連製品ですが、9月11日のターンメトリクスは@cloudflare/voice専用のリリースです。

リアルタイム音声エージェントはどのように動きますか?

一般的なターンでは、音声を取得してテキストへ変換し、そのテキストをアプリケーションとモデルのロジックへ渡し、応答を音声に合成して通話相手へ再生します。Cloudflareのパッケージはマイク音声をWebSocketでストリーミングし、onTurn()を実行し、ストリーミングされるモデル出力を文単位に分割して、音声を送り返します。

CloudflareはAIエージェントを提供していますか?

はい。CloudflareのAgents SDKはDurable Objectsを基盤とするステートフルなエージェントを提供し、@cloudflare/voiceは完全な音声経路と音声入力経路を追加します。現行ガイドによれば、音声パッケージは引き続きBetaです。

Cloudflare AgentsのGitHubリポジトリはどこですか?

公式リポジトリはGitHubのcloudflare/agentsです。音声関連の型とテストから、今回のリリースを支える安定版のターンスキーマと、制御テストにおける終了状態の挙動を確認できます。

次の月曜日にやること:証拠で調査先を決める

来週、テストビルドにイベントリスナーを追加し、上記3つの制御経路を実行してください。保存するのは会話内容を含まないサマリーだけです。そのうえで、勘に頼ってモデルを変更するのではなく、次の表に沿って調査先を決めます。

計測されたシグナル最初に調べる場所最初に変更しないもの
speechStartToFirstInterimMsまたはspeechStartToFinalMsが遅いマイク入力、文字起こし、ターン検出、音声プロバイダー経路TTS音声
afterTranscribeMsが遅い文字起こしフックとその依存先モデルまたはTTSベンダー
modelToFirstTextMsが遅いモデルの選択、プロンプト経路、ツール、プロバイダーのレイテンシ合成音声
最初のテキストは速いがmodelStreamConsumptionMsが遅いストリーム処理、ツール処理、長い応答、コンシューマー側の待機文字起こし
ttsToFirstAudioMsが遅いTTSプロバイダー、文の区切り、合成フック、音声形式モデルのプロンプト
サーバーの最初の音声は速いが、実際の再生が遅いブラウザ側の転送、デコード、出力デバイス、再生キューサーバー側モデル
no_output空のモデルストリーム、プロンプト分岐、応答の正規化TTSプロバイダー
output_limitモデルの出力上限と音声応答の長さ文字起こし
content_filtered安全性ポリシーとリクエスト経路音声転送
model_errorモデルイベントと、プロバイダーから得た安全に記録できるエラーメタデータTTS音声
tts_error音声プロバイダーと合成経路モデルの選択
aborted中断、置換、切断、キャンセル中断を再現する前に、いずれかのレイテンシ関連プロバイダーを変更すること

この診断ループを組み込んだ音声サポートシステムが必要なら、設計からリリースまで支援できます

最終更新
2026年9月12日
カテゴリー
Build

Googleでこのサイトを優先する

omidsaffari.comをGoogle検索の優先ソースに追加

omidsaffari.comを優先ソースに設定すると、GoogleがTop Stories・AI Overviews・AI Modeであなたのために優先表示します。

動画に字幕を入れる:RendiでSRTを焼き付ける実践ガイド

動画に字幕を入れる:RendiでSRTを焼き付ける実践ガイド

動画に字幕を入れる方法を、Rendiの非同期FFmpeg APIを使った実装例で解説します。SRTの事前確認、字幕スタイルの指定、ジョブ送信と完了確認、出力MP4の品質チェック、料金を左右する容量計算まで、バッチ処理へ進む前に押さえる実務手順と注意点を具体的にわかりやすくまとめました。2026年9月11日Build
OpenAI Agents SDKかAgents APIか:開発体制で決める選び方

OpenAI Agents SDKかAgents APIか:開発体制で決める選び方

OpenAI Agents SDKとAgents APIのどちらを選ぶべきか。セッション管理、実行環境、データ保持、料金、移行コストを比較し、小規模チームから規制業界まで、開発体制に合う判断基準を具体例と試算で整理します。長時間タスク、ZDR、セルフホスト、運用負荷の違いも分かります。2026年9月11日Build
FFmpeg APIで見るRendi料金:動画時間より処理バイト数で選ぶ

FFmpeg APIで見るRendi料金:動画時間より処理バイト数で選ぶ

RendiのFFmpeg API料金を、入出力の処理量、ストレージ、コマンド実行時間、vCPUの4条件で比較。Freeから月額$25のPro、実行時間無制限プランまで、動画処理パイプラインに必要な最小構成の選び方、隠れコスト、Very Good FFmpeg・RenderIOとの違いを具体例で解説します。2026年9月11日Build
Codex CLI 0.154.0のworktree実践術:隔離から統合まで

Codex CLI 0.154.0のworktree実践術:隔離から統合まで

Codex CLI 0.154.0のworktree機能を実践的に解説します。隔離セッションの起動、作業場所と差分の確認、テスト、コミットの取り込み、後片付けまでを順に整理。依存関係、ポート、データベース、キャッシュ、秘密情報を別途管理する際の注意点や、並列開発で役立つ用途もわかります。2026年9月10日Build
Claude Code 使い方ガイド:maxEffortLevelで推論レベルを制御

Claude Code 使い方ガイド:maxEffortLevelで推論レベルを制御

Claude Code 2.1.267で追加されたmaxEffortLevelの使い方を解説します。ユーザー、プロジェクト、マネージド設定で推論負荷に上限を設け、どの値が優先されるかを検証。条件をそろえた日常タスクで品質とトークン支出を別々に測り、導入すべき上限を判断する方法が分かります。2026年9月10日Build
ブラウザ自動化の録画FPSはどう選ぶ?agent-browser v0.37.0実践ガイド

ブラウザ自動化の録画FPSはどう選ぶ?agent-browser v0.37.0実践ガイド

ブラウザ自動化の実行結果を、チームがレビューしやすい動画証跡として残す方法を解説します。agent-browser v0.37.0の新しい30 fps既定値、1〜60 fpsの使い分け、ffmpegの確認、MP4/WebM保存、CIで失敗原因を追える証拠を残す実践手順まで具体的に整理しました。2026年9月8日Build
VPS 料金で見るUltaHostの更新コスト:契約期間・追加費用を徹底比較

VPS 料金で見るUltaHostの更新コスト:契約期間・追加費用を徹底比較

UltaHostのVPS 料金と更新費用を契約期間別に検証。Basicは月額$6.89からですが、長期契約は返金対象外となる場合があります。Plesk・cPanelの追加料金、2026年8月の値上げ、旧SKU、Hostinger・DigitalOceanとの比較まで、更新前に必要な判断材料を整理します。2026年9月7日Build
Claude Code 設定:ツール出力の上限を引き上げる方法

Claude Code 設定:ツール出力の上限を引き上げる方法

Claude Code 2.1.261で追加されたbashOutputMaxCharsとtaskOutputMaxCharsを使い、コマンドとバックグラウンドタスクの出力上限を安全に調整する方法を解説します。切れたログの回収、設定ファイルの選び方、コンテキスト消費とのバランスまで、実例を交えて確認できます。2026年9月6日Build
ニュースレター

毎週日曜、一通の手紙。動くシステムの話。感想戦ではなく。

週刊。スパムなし。いつでも解除できます。