LabHub
はじめる
学ぶ 学習パス コース

音声 AI エージェント — 聞いて、調べて、話すパイプライン

話す — 最初の音までの時間と「読み上げ用テキスト」づくり

LabHubで続きを見る

一言でいうと

TTSの速度は、RTF(合成時間 ÷ 音の長さ)で測ります。RTFが1より小さくても、答え全体を一度に合成すると、最初の音が遅れます。文(または節)単位に切って、最初の断片から合成すると、最初の音が何倍も早まります。そして、TTSは書かれたとおりに読みます。「911」は「九百十一」、「14:30」は「十四、三十」、引用表示の「[kb-hours]」は「ビー・アワーズ」になります。画面用の文を耳で聞く文に変える段階が、別に必要です。

なぜ必要なのか

LabHubの会話練習では、TTSに1文あたり2.3秒かかりました(2026-09-23に実測、GPUサーバー)。答えをすべて受け取ってから丸ごと合成するため、モデルが5文書くと12秒待たなければなりませんでした。そのファイルのコメントが言うように、「その瞬間、会話ではなく朗読」になります。このコースのTTSはCPUではるかに速いですが(後述)、原理は同じです。最初の音までの時間は、最初の断片の長さに比例します。

どう動くのか

PiperとVITS。このイメージのTTSは、Piperのen_US ljspeech mediumの音声です。文をespeak-ngで音素に変換したあと、VITS(Kim et al., 2021)のニューラルネットワークが波形を直接作ります。出力は22,050 Hzです(モデルカード)。学習データのLJ Speechは、1人が読んだ約13,100個のクリップで、パブリックドメインです。VITSは、合成のたびにノイズ項を引くので、同じ文でも毎回少し違う波形が出ます。採点ツールがWAVをサンプル単位で比較しない理由です。

RTFと最初の音。CPU 2コアのPod(nuc1)で、このモデルのRTFは約0.04でした。10秒分を0.4秒で作ります。同じモデルのint8量子化版は、ファイルが3分の1なのにRTFが0.12で、3倍遅くなりました。動的量子化は、計算する間に整数と実数を行き来するコストがかかり、このCPU・この演算子の組み合わせでは、そのコストが利益より大きかったのです。サイズだけを見て選んではいけない例です。丸ごと合成すると、3文の答えの最初の音は、全体の合成が終わったときに出ますが、文に切って最初の文だけを先に合成すれば、その時間だけ待てば済みます。

文の分割。ピリオドごとに切ると、「Dr. Rivera」や「$3.50」で壊れます。ルールはこうです。終わりの記号の後ろに空白と大文字(または文章の終わり)が来てはじめて文の終わりで、「Dr.」・「Mr.」・「No.」のように後ろに名前・数字が来る略語は終わりではありません。「a.m.」は文の終わりになることもあります(「…at 7:30 a.m. Results take…」)。

LLMとの重ね合わせ。LLMのストリームから文が入ってくるたびに断片を切ってTTSに渡せば、LLMが次の文を書いている間に、前の文を合成します。小さなモデルは「短く答えて」をよく破るので、文が長くなることがあります。そのため、文の終わりがなくても、カンマの前の節(5単語以上)か12単語目で切って、最初の断片の長さをコードが決めます。注意点が1つあります。このPodのCPUは2コアで、LLMサーバーも2スレッドを使います。重ねて動かすと、2つの仕事が同じコアを分け合います。最初の音は早まりますが、それぞれは単独で動くときより遅くなります。重ね合わせの利益は、余裕のあるコアがあるときに最も大きくなります(モジュール8で測ります)。

読み上げ用テキストの作成(テキスト正規化)。このイメージのTTSで合成して、ASRで書き起こし直してみると、何が間違うのかが見えます(実測): 「Call 911」→「NINE HUNDRED ELEVEN」、「at 14:30 [kb-hours]」→「FOURTEEN THIRTY B HOURS」、「09:00」→「NINE ZERO ZERO」。そのため、合成の前に引用表示を消し、24時間表記の時刻を午前・午後に(14:30 → two thirty p m)、長い数字は1桁ずつに(911 → nine one one)、金額は言葉に($80 → eighty dollars)変換します。効果はTTS → ASR往復のWERで測ります。人の耳の代わりに、ASRを聞き手として使うのです。

伝送形式。合成した22.05 kHzの音は、伝送レイヤーが約束した形(16 kHz・s16le・20 ms)に変換して出力します。22050を16000であるかのようにそのまま送ると、1.38倍遅くて低い音になります。

現場での姿

TTSの最初の音の遅延で、よく見落とされるのが最初の合成の準備時間です。モデルを読み込んだあとの最初の呼び出しは、計算グラフを準備するため遅くなります。そのためサービスは、起動時に短い文を1回合成しておきます(このコースの模範解答が、先に「warm up」を呼ぶ理由)。LabHubがASRに無音を送ってあらかじめ載せておくのと、同じ考えです。

読み上げ用テキストの作成は、言語と地域に左右されます。「14:30」を、アメリカ英語では「two thirty p m」と、イギリスの放送では「half past two」と読みます。日付(「9/10」)は、国ごとに意味が違います。そのため、ルールを1か所に集め、新しい形を見るたびに、往復WERのテストに1行ずつ足します。このコースのルールは、アメリカ英語の音声1つのための最小限です。

次のラボですること

1文を合成してRTFを測り、略語と小数で壊れない文の分割を作ります。3文のテキストの最初の音を、丸ごとと文単位で比べ、LLMストリームを断片に切ってTTSと重ねて動かします。読み上げ用テキストに変換する関数を作って、往復WERで効果を測り、合成した音を16 kHz 20 msのフレームに変換します。