前幾天已經把 STT、LLM 和 TTS 串起來,AI Companion 終於可以完成一輪完整語音對話。
目前流程是:
Microphone
↓
VAD
↓
Speech End
↓
Final STT
↓
LLM
↓
TTS
↓
Playback
雖然已經可以對話,但目前大部分步驟仍然需要依序等待。
尤其是:
等 LLM 完整回答
↓
TTS 才開始
↓
語音生成完成
↓
Playback
所以今天開始把整條 Pipeline 往 Streaming 架構調整,讓 AI 不需要等完整回答全部產生完,就能更早開始說話。
Day 02 曾經做過 Rolling Transcription。
當時每隔 2 秒,把目前累積的音訊重新交給 Whisper:
0~2 秒 → Whisper
0~4 秒 → Whisper
0~6 秒 → Whisper
因此使用者還在說話時,就能看到持續更新的 Partial Transcript。
不過這並不是真正的 Streaming ASR。
它本質上還是:
每隔固定時間,把目前累積的音訊重新辨識一次。
所以比較接近 Pseudo-Streaming。
真正的 Streaming ASR 會持續接收新的 Audio Chunk:
Microphone
↓
Audio Chunk
↓
Audio Chunk
↓
Audio Chunk
↓
Streaming ASR
↓
Partial Transcript
模型會保留前面已經處理過的狀態,再繼續處理新的音訊,而不是每次重新從頭辨識整段。
可以簡單理解成:
Rolling
→ 一直重新聽前面
Streaming ASR
→ 記住前面處理到哪,再繼續往下聽
這會是之後即時語音互動很重要的一層。
除了 ASR,LLM 也可以改成 Streaming。
原本是:
LLM
↓
完整回答
↓
TTS
例如一定要等:
今天天氣不錯,如果有空的話,可以出去走走。
全部生成完成後,TTS 才開始工作。
改成 Token Streaming 後,LLM 會持續回傳文字:
今天
今天天氣
今天天氣不錯
今天天氣不錯,如果有空的話……
這樣後面的模組就不一定要等完整回答。
如果每產生幾個字就呼叫一次 TTS,最後的語音會非常破碎。
因此中間需要加入 Sentence / Chunk Buffer。
例如:
今天天氣不錯。
偵測到句子邊界後,就先把這一段送進 TTS。
接著 LLM 繼續生成:
如果有空,可以出去走走喔。
再處理第二段。
這裡就會遇到一個取捨:
Chunk 太短
→ 第一段出來很快
→ 但語音容易破碎
Chunk 太長
→ 語音比較自然
→ 但等待時間增加
所以 Chunk 怎麼切,也是 Streaming Pipeline 裡很重要的一部分。
目前使用的 Kokoro 並不是原生 Streaming TTS,因此這裡先採用 Chunked TTS。
原本是:
完整回答
↓
TTS
↓
完整 Audio
↓
Playback
現在改成:
Chunk 1 → TTS → Audio 1
Chunk 2 → TTS → Audio 2
Chunk 3 → TTS → Audio 3
第一段文字準備好,就可以先產生第一段聲音。
同時 LLM 還可以繼續生成後面的內容。
語音被切成多段之後,就需要確保播放順序不會亂掉。
因此加入 Playback Queue:
Audio 1
Audio 2
Audio 3
↓
Playback Queue
↓
依序播放
當 Audio 1 正在播放時:
LLM
→ 繼續生成文字
TTS
→ 繼續生成 Audio 2
Playback
→ 正在播放 Audio 1
三個階段就可以部分重疊工作,而不是每一步都完全等上一個步驟結束。
原本的 Sequential Pipeline:
LLM 完成
↓
TTS 完成
↓
Playback
Streaming 之後:
LLM 生成第一段
↓
TTS 生成第一段
↓
立即播放
同時後面的內容繼續生成。
所以 Streaming 不一定讓 LLM 或 TTS 本身運算速度變快,而是讓不同階段可以更早開始工作。
這也是降低:
Speech End → First Audio
等待時間的重要方式。
目前整體方向整理成:
Mic
↓
Rolling / Streaming ASR
↓
LLM Token Streaming
↓
Sentence / Chunk Buffer
↓
Chunked TTS
↓
Playback Queue
↓
AI 邊生成邊說
Day 02 的 Rolling Transcription 目前仍然可以保留作為近即時方案,而真正的 Streaming ASR 會繼續調整與比較。
今天則先把:
LLM Streaming
+
Chunk Buffer
+
Chunked TTS
+
Playback Queue
串起來,讓 AI 不需要等完整回答才開始說話。
現在 AI 已經開始往「邊生成、邊說話」前進。
下一步想解決另一個很重要的問題:
如果 AI 還在講話,但使用者已經想說下一句了呢?
Day 08 準備加入 Barge-in,讓使用者可以直接打斷 AI,停止正在播放的語音並重新進入 Listening,讓整體互動更接近真正的對話。