TT Lab
ブログ

한국어 English 日本語 中文

はじめる
ブログ

ブログ

リアルタイム音声対話、パーツ別に直接測定した遅延:音声認識 0.2秒、LLMファーストトークン 0.07秒、音声合成は長さの半分

ステータス:ドラフト(2026-10-06)、実測記事です。 以下の数値は筆者が直接測定した値です。1ターンの最初の音声までの時間は、パーツ別の実測からの 計算された推測値であり、最初から最後まで通して測定したわけではありません。大半の測定は合成音声と1種類の対話プロンプトで行ったため、実際のユーザー環境とは異なる場合があります。4-3節は、人間が読み上げた音声(公開音声コーパス)で音声認識を再度測定した値であり、非ネイティブの英語も含みます。 作成ルール:実測データを基本とし、測定できなかったものは「未測定」と表記します。

目次

1. 何をなぜ測定したのか

第19回でオープンソースの候補を調査しましたが、値はすべてドキュメント基準でした。外国語のスピーキング練習に「音声でのやり取り」機能を組み込むには、次の3つのパーツの遅延を直接把握する必要があります。

  1. 音声認識(ASR): 学習者の発話をテキストに変換します。
  2. 対話LLM: 書き起こされた言葉に対する返答を生成します。
  3. 音声合成(TTS): 返答を音声として読み上げます。

3つのパーツすべてを韓国語、日本語、中国語、英語で測定し、オープンモデルの2ペア(Qwen3-ASRとNemotron 3.5 ASR、VoxCPM2とMagpie TTS)を同一の入力で比較しました。

2. 環境と方法

項目 値
サーバー GPUサーバー2台。24GBクラスのコンシューマー向けGPU(ドライバー570系)と8GBクラスのノートPC用GPU(ドライバー595系)
音声合成 VoxCPM2(24GBクラスGPU)、Magpie TTS Multilingual 357M(8GBクラスGPU)
音声認識 Qwen3-ASR-1.7Bおよび単語タイムアライナー(24GBクラスGPU)、Nemotron 3.5 ASR Streaming 0.6B(8GBクラスGPU)
対話LLM Gemma 4 12B Google公式QAT 4bit(GGUF 7.0GB)、llama.cppサーバー(--parallel 2、コンテキスト4096)、思考モードOFF(24GBクラスGPU)
方法 サーバーを一時コンテナ上で起動し、3種類の文(短、中、長)×4言語を各3回ずつ(LLMは5回)リクエストして中央値を算出
セーフティネット コンテナメモリの制限、ホストの利用可能メモリが基準を下回った場合は測定を中断

2つのモデルペアを 異なるGPU で測定しているため、速度の直接比較には慎重を期す必要があります(メモリ使用量と精度はGPUに関係なく比較可能です)。音声合成は、サーバーが通知する合成時間と音声の長さから リアルタイム係数(合成時間 ÷ 音声の長さ) を算出し、1未満であれば再生よりも速く生成できることを意味します。

3. 音声合成(TTS)結果

3-1. VoxCPM2

ウォームアップ状態(モデルがロードされ、声質がすでに設定された状態)での3回の測定の中央値です。

言語 文字数 音声(秒) 合成時間(秒) リアルタイム係数
英語 39 / 80 / 179 2.08 / 4.00 / 9.60 1.21 / 2.11 / 4.77 0.572 / 0.526 / 0.496
日本語 17 / 36 / 67 3.04 / 5.28 / 9.12 1.69 / 2.78 / 4.56 0.556 / 0.519 / 0.500
中国語 18 / 23 / 54 3.84 / 4.96 / 10.72 2.05 / 2.59 / 5.31 0.531 / 0.522 / 0.496
韓国語 20 / 38 / 67 3.84 / 6.88 / 12.64 2.06 / 3.50 / 6.25 0.536 / 0.509 / 0.494

3-2. Magpie TTS Multilingual 357M

同じ文で測定しました(8GBクラスのノートPC用GPU、3回の中央値)。

言語 合成時間(秒) 音声(秒) リアルタイム係数 音声認識の書き戻し文字エラー率
英語 1.23 / 2.10 / 4.59 2.69 / 4.55 / 9.33 0.458 / 0.462 / 0.495 0% / 0% / 0%
日本語 1.41 / 2.71 / 4.80 3.11 / 5.76 / 9.66 0.448 / 0.471 / 0.496 13% / 12% / 0%(表記の違い)
中国語 1.87 / 2.29 / 5.09 3.85 / 4.92 / 10.26 0.452 / 0.465 / 0.499 0% / 10% / 6%
韓国語 0.27 / 0.37 / 0.99 0.51 / 0.65 / 2.18(異常) 0.455~0.588 100%(結果なし)

4. 音声認識(ASR)結果

上記の合成で作成された12個の音声(2〜13秒)を、言語を指定して書き起こさせました。

4-1. Qwen3-ASR-1.7B

言語 音声(秒) 推論時間(秒) リアルタイム係数 文字エラー率
英語 2.1 / 3.8 / 9.6 0.16 / 0.26 / 0.52 0.054~0.077 0% / 0% / 0%
日本語 3.0 / 5.3 / 8.6 0.15 / 0.31 / 0.51 0.049~0.059 0% / 15% / 0%
中国語 3.8 / 4.8 / 10.7 0.16 / 0.25 / 0.49 0.042~0.052 0% / 0% / 0%
韓国語 4.2 / 7.4 / 12.6 0.22 / 0.42 / 0.62 0.049~0.057 0% / 0% / 0%

4-2. Nemotron 3.5 ASR Streaming 0.6B

同じ12個の音声(8GBクラスのノートPC用GPU、言語をロケールとして指定、ファイル全体を一度に書き起こす方式)です。

項目 値
推論時間 ファイルあたり0.23〜0.30秒(リアルタイム係数0.023〜0.112、中央値0.050)
平均文字エラー率 3.9% (Qwen3-ASRは日本語の表記の違いを除くと0%)
自動検出 12個すべて正解(結果に <ko-KR> のような言語タグが付く)
GPUメモリ モデルロード後 約5,078MiB(モデル以外の実行環境分が含まれた値)
ロード時間 ウェイトのダウンロード後 約31秒

4-3. 人間の音声で再度測定した値:ネイティブの朗読と非ネイティブの英語

上記の12個は合成音声であり、人間の発音やイントネーションは含まれていません。公開音声コーパスを用いて Nemotron 3.5 ASR を再度測定しました。FLEURS(人間が読み上げた文)から言語ごとに30文、speechocean762(中国語話者が読んだ英語に発音評価スコアが付与されたコーパス)から100文であり、ファイル全体を一度に文字起こしする方式、デフォルトのチャンク1,120ms、8GB級ノートPC用GPUです。

データ 指標 平均 中央値 空の結果 中央推論時間
FLEURS 韓国語 文字エラー率 5.8% 3.6% 0 0.296秒
FLEURS 日本語 文字エラー率 14.7% 14.7% 0 0.296秒
FLEURS 中国語 文字エラー率 18.2% 14.6% 0 0.305秒
FLEURS 英語 単語エラー率 10.0% 5.7% 0 0.291秒
speechocean762 非ネイティブ英語 単語エラー率 38.8% 25.0% 12/100 0.248秒

非ネイティブ英語を発音評価の総得点(0〜10)で分けると、エラー率に大きな差が出ました。

総得点区間 文数 単語エラー率(平均) 中央値
6未満 15 80.4% 100.0%
6以上8未満 31 54.0% 60.0%
8以上 54 18.4% 11.8%
チャンク 韓国語 CER 英語 WER 非ネイティブ英語 WER(空の結果)
1,120ms 5.8% 10.0% 38.8% (12)
560ms 5.9% 10.5% 39.7% (7)
320ms 5.6% 12.6% 42.1% (9)
160ms 6.2% 13.3% 44.8% (10)
80ms 6.1% 13.5% 44.7% (8)

英語と非ネイティブ英語は、1,120msから80msに短縮するとエラー率が3〜6%p増加しました。韓国語は5.6〜6.2%とほとんど差がなく、モデルカードの韓国語の値(7.12〜7.70%)もフラットです。空の結果は1,120msでのみ発生せず(非ネイティブ英語はむしろ1,120msで12個と最多)、上記の合成サンプルの1,120ms以上の現象は再現されませんでした。

5. 対話 LLM の結果:Gemma 4 12B 4-bit

学習者のレベル(CEFR A2)に合わせて「1〜2文で答え、簡単な質問を1つで終えよ」という指示と、「昨日のカフェで本を読んだ」というユーザーの発話を4つの言語で送信し、言語ごとに5回ストリーミングで受信しました。 最初のトークンはリクエスト送信後最初の文字が返るまで、 最初の文は最初の句読点が出力されるまで(音声合成を開始できる時点)です。

言語 最初のトークン(秒、中央値 / 範囲) 最初の文の終了(秒) 応答トークン 生成速度 (tok/s)
英語 0.074 / 0.068~0.080 0.203 21 85.7
日本語 0.074 / 0.067~0.119 0.100 23 85.6
中国語 0.067 / 0.054~0.127 0.129 13 84.2
韓国語 0.076 / 0.074~0.129 0.160 27 85.6

思考モードにより応答が完全に空になりました。 最初の測定では20回すべて回答が空でした。元の応答を確認すると、 content は空文字列であり、 reasoning_content に Role: Friendly conversation partner for a Japanese learner... Constraint 1: ... のような英語の分析が蓄積され、80トークンの予算が思考だけで使い果たされていました。このモデルが llama.cpp のチャットテンプレートでデフォルトで思考から開始するためであり、サーバーオプション(--reasoning-budget 0)とリクエストオプション(chat_template_kwargs: {enable_thinking: false})で無効にすることで正常になりました。 音声対話では思考モードを必ず無効にする必要があります。 有効にしたままにすると最初の音声が何秒も遅れ、予算が短い場合は回答が全く出力されません。

6. 測定で判明した問題

6-1. 日本語:音声は正しいが表記の違いで減点される

日本語の中間文でエラー率15%が出ましたが、音声が間違っていたわけではありません。

文
原文 私はたいてい七時に起きて**、**簡単な朝ご飯を食べて**、**地下鉄で会社に行きます。
認識 私は大抵7時に起きて簡単な朝ご飯を食べて地下鉄で会社に行きます。

たいてい 対 大抵, 七 対 7、句読点の有無は同じ言葉の異なる表記です。発音練習サービスが認識結果を目標の文と 文字列類似度で比較する場合、学習者が完璧に話してもこのような表記の違いで減点される可能性があります。中国語の数字(七 対 7)でも同様の問題が予想されます。修正方法としては、比較前に数字や表記を正規化するか、文字ではなく発音(読み上げ)基準で比較することです。

6-2. デプロイされたサーバーが最新コードより古い場合がある

ある環境で中国語の合成が 404 Not Found で失敗しました。サーバーコードの中国語の音声プリセットは新しいコードには存在しますが、デプロイされたイメージには存在しなかったためです。新しい機能が動作しない場合は、 コードではなくデプロイされたイメージのバージョンを先ず確認する必要があります。

6-3. GPU サーバーごとにドライバーのバージョンが異なるとイメージが起動しない

CUDA 13 向けにビルドされた vLLM イメージが、ドライバー 570 系統(CUDA 12.8 まで)で Error 804: forward compatibility was attempted on non supported HW により起動できませんでした。同じイメージがドライバー 595 系統では動作します。CUDA 13.x はドライバー 580 以上を要求します。複数のサーバーを併用する場合は、 ドライバーのバージョンをサーバーごとに確認し、イメージの CUDA バージョンと合わせる必要が あります。本記事の LLM 測定は CUDA 12 用イメージ(llama.cpp)で構成しました。

6-4. 測定ツールで直面した罠

症状 原因 解決策
測定スクリプトが実行されずサーバーのみ起動している kubectl run --overrides がコマンドラインの --command を上書きする サーバーはデフォルトコマンドに任せ、測定コードは kubectl exec で実行
合成時間が nan レスポンスヘッダー名が小文字であるにもかかわらず大文字小文字を区別して読み込んでいる ヘッダーキーを小文字に正規化
コンテナが OOMKilled モデルをロードする瞬間の最大メモリが制限を超過 制限を増やす。制限はコンテナ内でのみ機能するためサーバーには影響なし
コンテナが Pending ノードのメモリリクエストの合計がすでに高く、リクエスト 6Gi のコンテナ2つが同時に起動できない 測定を順次実行
kubectl run -i が1分でタイムアウト イメージの取得時間がデフォルトのタイムアウト(1分)を超える --pod-running-timeout を増やす
LLM の応答がすべて空 思考モードがデフォルトで有効になり、80トークンをすべて思考に費やす サーバーとリクエストの両方で思考を無効化
バックエコーエラー率が1より大きい 22,050Hz を 16,000Hz に変換する比率を誤り(8,000Hz)、音声が2倍速になった 比率を 320/441 に修正。ツールではなくテストコードのバグだった
ライブラリと言語が一致しない(Unknown prompt key: 'None') ファイルパスで指定した場合、一時入力リストに言語フィールドがないバージョン起因の問題 一時リスト言語を書き込む回避コードを追加(暫定措置)

ここでの最大の教訓はバックエコーエラー率の事例です。 測定コードのバグがモデルの欠陥のように見えることがあります。 エラー率が1を超える値が出た場合は、モデルではなく入力(サンプリングレート、長さ、言語指定)をまず疑うべきです。

7. 1ターンの遅延はどのくらいか

ユーザーの発話終了時点から最初の音声が出るまでの合計は以下の通りです。

(말 끝 판단) + ASR + LLM 첫 문장 + TTS 첫 문장 + 전송

パーツごとの実測値を文の長さで繋ぎ合わせた 計算上の推定値です(最初から最後まで通して測定したわけではありません)。LLM の最初の文は上記の測定で実際に生成された文であり、TTS の時間は3-1の式(合成 ≈ 0.475 × オーディオ長 + 0.23秒)にその文の読み上げ長さを代入しました。

言語 ASR(3〜7秒の発話) LLM 最初の文の終了 最初の文の例 TTS(計算値) 合計
日本語 0.15~0.3 0.10 いいですね!(約1.1秒分) 約 0.75 約 1.0〜1.2秒
中国語 0.16~0.25 0.13 听起来很舒服!(約1.5秒) 約 0.94 約 1.2〜1.3秒
韓国語 0.22~0.4 0.16 와, 정말 좋았겠네요!(約2.1秒) 約 1.2 約 1.6〜1.8秒
英語 0.16~0.26 0.20 That sounds like a very relaxing way…!(約3.2秒) 約 1.75 約 2.1〜2.2秒

この表には発話終了判定(VAD)とネットワーク転送が含まれていません。発話終了を0.3〜0.5秒と仮定すると、その分が加算されます。この仮定値が発話途中の途切れというコストにどれだけ影響するかは、すぐ下で人間が読み上げた文を用いて測定しました。公開されている値の範囲は、NVIDIA ブループリント推奨の200〜500ms、Pipecatデフォルトの0.2秒、LiveKitの0.5秒(ストリーミングターン検出器0.3秒)、OpenAIの例の500msであるため、仮定はこの範囲内に収まっています。同一ドキュメントの目標遅延(発話終了から応答開始まで)は600〜1,500msであり、大型 GPU とストリーミング TTS を使用したブループリントのサーバー終端遅延は0.86〜0.93秒(ベンダー数値)です。本記事の韓国語の合計に発話終了判定を加算した約1.9〜2.3秒が大きい理由は、本記事の TTS がストリーミングではないためと読み取れます(公開事例における TTS の最初の音声までは0.07〜0.37秒)。学習者は言い淀みが多く、短い判定では発話が途中で切れてしまう可能性がありますが、これを扱った研究は閲覧可能な資料から見つかりませんでした(未確認)。

発話終了判定時間はどれくらいであるべきか(読み上げ音声の実測)

発話終了判定は、ユーザーが一定時間静寂状態であれば発話が終了したとみなす仕組みであり、その時間が文中の自然なポーズよりも短いと発話の途中で切れ、長いと応答がその分遅れます。人間が読み上げた FLEURS の文(言語ごとに60個、平均10〜14秒)から Silero VAD(6.2.3、閾値0.5、CPU 1スレッド)で音声区間を検出し、1文中の隣接する音声区間の間隔を「文中のポーズ」としてカウントしました。スクリプトと元データは docs/experiments/2026-10-07-vad-turn-gaps/ にあり、GPU を使わず CPU 1スレッドで実行しました。

言語 文中のポーズ数 ポーズ中央値 p90 最大 ポーズが 300ms 以上の文 500ms 以上 700ms 以上 1,000ms 以上
韓国語 87 352ms 608ms 1,152ms 51.7% 28.3% 8.3% 1.7%
英語 75 288ms 608ms 928ms 40.0% 13.3% 6.7% 0.0%
日本語 88 336ms 672ms 1,120ms 50.0% 21.7% 10.0% 1.7%
中国語 102 288ms 544ms 1,536ms 48.3% 21.7% 8.3% 1.7%

8. 面接で出そうな質問

確認できなかった事項

参考資料

確認したバージョンと日付

2026-10-06時点。voxcpm 2.0.3、Qwen3-ASR-1.7B、Qwen3-ForcedAligner-0.6B、Nemotron 3.5 ASR Streaming 0.6B、Magpie TTS Multilingual 357M、NeMo 3.0.0、Gemma 4 12B QAT q4_0、llama.cpp b11429。

ログインするといいねできます

コメント

まだコメントはありません。

ログインするとコメントできます