iT邦幫忙

2026 iThome 鐵人賽

DAY 7
0
AI Engineering

30 天打造高齡智慧健康照護 AI Companion系列 第 7

Day 07|讓 AI 邊聽邊回答:打造 Streaming Voice Pipeline

  • 分享至 

  • xImage
  •  

前幾天已經把 STT、LLM 和 TTS 串起來,AI Companion 終於可以完成一輪完整語音對話。

目前流程是:

Microphone
↓
VAD
↓
Speech End
↓
Final STT
↓
LLM
↓
TTS
↓
Playback

雖然已經可以對話,但目前大部分步驟仍然需要依序等待。

尤其是:

等 LLM 完整回答
↓
TTS 才開始
↓
語音生成完成
↓
Playback

所以今天開始把整條 Pipeline 往 Streaming 架構調整,讓 AI 不需要等完整回答全部產生完,就能更早開始說話。

Day 02 的 Rolling Transcription

Day 02 曾經做過 Rolling Transcription。

當時每隔 2 秒,把目前累積的音訊重新交給 Whisper:

0~2 秒 → Whisper
0~4 秒 → Whisper
0~6 秒 → Whisper

因此使用者還在說話時,就能看到持續更新的 Partial Transcript。

不過這並不是真正的 Streaming ASR。

它本質上還是:

每隔固定時間,把目前累積的音訊重新辨識一次。

所以比較接近 Pseudo-Streaming

Streaming ASR 是什麼?

真正的 Streaming ASR 會持續接收新的 Audio Chunk:

Microphone
↓
Audio Chunk
↓
Audio Chunk
↓
Audio Chunk
↓
Streaming ASR
↓
Partial Transcript

模型會保留前面已經處理過的狀態,再繼續處理新的音訊,而不是每次重新從頭辨識整段。

可以簡單理解成:

Rolling
→ 一直重新聽前面

Streaming ASR
→ 記住前面處理到哪,再繼續往下聽

這會是之後即時語音互動很重要的一層。

LLM Token Streaming

除了 ASR,LLM 也可以改成 Streaming。

原本是:

LLM
↓
完整回答
↓
TTS

例如一定要等:

今天天氣不錯,如果有空的話,可以出去走走。

全部生成完成後,TTS 才開始工作。

改成 Token Streaming 後,LLM 會持續回傳文字:

今天
今天天氣
今天天氣不錯
今天天氣不錯,如果有空的話……

這樣後面的模組就不一定要等完整回答。

不能每個 Token 都直接丟給 TTS

如果每產生幾個字就呼叫一次 TTS,最後的語音會非常破碎。

因此中間需要加入 Sentence / Chunk Buffer

例如:

今天天氣不錯。

偵測到句子邊界後,就先把這一段送進 TTS。

接著 LLM 繼續生成:

如果有空,可以出去走走喔。

再處理第二段。

這裡就會遇到一個取捨:

Chunk 太短
→ 第一段出來很快
→ 但語音容易破碎

Chunk 太長
→ 語音比較自然
→ 但等待時間增加

所以 Chunk 怎麼切,也是 Streaming Pipeline 裡很重要的一部分。

TTS 分段生成

目前使用的 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

語音被切成多段之後,就需要確保播放順序不會亂掉。

因此加入 Playback Queue:

Audio 1
Audio 2
Audio 3
↓
Playback Queue
↓
依序播放

當 Audio 1 正在播放時:

LLM
→ 繼續生成文字

TTS
→ 繼續生成 Audio 2

Playback
→ 正在播放 Audio 1

三個階段就可以部分重疊工作,而不是每一步都完全等上一個步驟結束。

Streaming 的重點不是讓模型變快

原本的 Sequential Pipeline:

LLM 完成
↓
TTS 完成
↓
Playback

Streaming 之後:

LLM 生成第一段
↓
TTS 生成第一段
↓
立即播放

同時後面的內容繼續生成。

所以 Streaming 不一定讓 LLM 或 TTS 本身運算速度變快,而是讓不同階段可以更早開始工作。

這也是降低:

Speech End → First Audio

等待時間的重要方式。

今天的 Streaming Voice Pipeline

目前整體方向整理成:

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 不需要等完整回答才開始說話。

下一步:Barge-in

現在 AI 已經開始往「邊生成、邊說話」前進。

下一步想解決另一個很重要的問題:

如果 AI 還在講話,但使用者已經想說下一句了呢?

Day 08 準備加入 Barge-in,讓使用者可以直接打斷 AI,停止正在播放的語音並重新進入 Listening,讓整體互動更接近真正的對話。


上一篇
Day 06|語音對話到底慢在哪?拆解 AI Companion 的延遲
下一篇
Day 08|別等 AI 說完:加入 Barge-in 即時打斷
系列文
30 天打造高齡智慧健康照護 AI Companion21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言