2026 年語音 Agent 開發實力:Whisper 結合即時對話模型的串接最佳實踐
CPU 即可,常駐記憶體
small
低延遲互動、家用裝置、邊緣運算
0.1 ~ 0.2
INT8 量化,單卡多路
medium
一般商用客服、會議記錄
0.3 ~ 0.6
GPU 併發,需動態批次
large-v3 系列 / turbo 變體
高精度需求、多語混雜、專業術語
0.8 ~ 1.5
獨立 GPU 池,搭配投機解碼
要注意的是,「辨識準確率最高的模型」不等於「最適合語音 Agent 的模型」。在即時對話場景裡,large 模型多出來的幾十個百分點準確率,往往換來的是 300 毫秒以上的額外延遲,使用者感受到的是「這個助理反應很慢」,而不是「它聽得比較準」。反過來說,如果你用 small 模型但搭配強力的領域提示詞(initial_prompt)與後處理詞彙修正,實際體驗常常更好。
即時對話模型的崛起:Realtime API 與開源 Omni 模型的雙軌並行
2024 到 2026 這幾年,對話模型端最大的變化是「原生語音輸入輸出」變成了一等公民。以 OpenAI Realtime 系列、Gemini Live API 為代表的雲端服務,提供了 WebSocket 或 WebRTC 的雙向串流介面,可以直接吃音訊、吐音訊;同時,開源陣營的 Omni 模型(可同時處理文字、音訊、影像的統一模型)也快速成熟,讓自架方案的門檻大幅下降。
但這裡有個很關鍵的實務判斷:什麼時候該用原生語音模型,什麼時候該用「Whisper + 文字 LLM」的組合?
這篇文章的主軸,就是這個混合式架構。接下來的章節,我們會從資料流開始,一層一層往下降。
二、串接架構總覽:從麥克風到喇叭的完整資料流
要優化延遲,你必須先知道延遲發生在哪裡。語音 Agent 的資料流可以拆成六個階段,每一段都有自己的時間預算。很多團隊的問題在於:他們只優化了最顯眼的 LLM 推論,卻忽略了音訊緩衝與端點判斷這兩個「隱形殺手」。
三段式架構 vs 端到端架構的取捨
先建立一個清晰的架構圖像。一個標準的三段式語音 Agent 長這樣:
麥克風 → 音訊前處理 → VAD → Whisper 串流解碼
穩定轉錄文字
即時對話模型(LLM)
↙ ↘
文字輸出 工具呼叫
句子切分 → 串流 TTS → 音訊後處理 → 喇叭
端到端架構則是把中間全部壓縮成一個模型:音訊進、音訊出,中間沒有文字介面。它的優勢是理論延遲最低(少了 ASR 穩定等待與 TTS 首包的時間),劣勢是你失去了文字層的所有控制點——你沒辦法在文字層做敏感詞過濾、沒辦法記錄結構化日誌、沒辦法輕鬆換掉某一個環節、也沒辦法用同一套提示詞工程去調行為。
我的實務建議是:先做三段式,把延遲壓到你滿意的水準,再評估是否值得為最後那 100~200 毫秒切換到端到端。多數情況下,你優化三段式的緩衝與端點策略,得到的體驗提升會遠大於直接換架構。
延遲預算(Latency Budget)怎麼拆
一個自然的語音對話,使用者講完到聽到回應,心理上可接受的門檻大約是 500 到 800 毫秒。超過 1 秒就會明顯感覺到「卡」,超過 1.5 秒使用者會開始懷疑對方是不是沒聽到。以下是我慣用的延遲預算表:
階段
典型耗時
優化空間
麥克風採集 + 前處理(降噪、AGC、重採樣)
20 ~ 50 ms
低,但緩衝區設錯會爆增
VAD 端點判斷
100 ~ 400 ms
高,是最大槓桿之一
Whisper 串流解碼至穩定文字
100 ~ 300 ms
高,取決於模型與推論後端
LLM 首個 token
200 ~ 600 ms
高,取決於提示詞長度與服務
TTS 首包音訊
100 ~ 300 ms
中高,取決於是否句子切分
網路往返(含客戶端)
50 ~ 200 ms
中,靠邊緣節點
把這些加起來,你會發現如果不做任何優化,輕鬆就突破 1.5 秒。而優化的關鍵思路是「流水線化」而不是「壓縮單點」——也就是讓 VAD 在使用者還在講話時就開始判定、讓 Whisper 在使用者還沒講完就開始解碼、讓 LLM 在收到第一個穩定片段就開始生成、讓 TTS 在 LLM 吐出第一個句子就開始合成。這才是把總延遲從加法變成「幾乎取最大值」的核心手法。
三、Whisper 端的實戰最佳實踐
Whisper 原本是為「整段音訊批次轉錄」設計的模型,它的架構是 30 秒固定視窗、編碼器-解碼器結構。要拿它來做即時串流,必須做一些工程上的改造。這一章就是談這些改造。
串流化與 VAD:不要等講完才轉錄
最直覺但最糟的做法是:偵測到使用者停止說話後,把整段音訊丟給 Whisper,等它輸出完整文字。這樣光是等待時間就毀了一切。
正確做法是滑動視窗 + 局部一致性(Local Agreement)。具體來說,維護一個不斷增長的音訊緩衝區,每隔一小段時間(例如 200~400 毫秒)就對當前緩衝區做一次 Whisper 推論。因為 Whisper 每次都會重新解碼整段,所以前面的文字會不斷被「重寫」。我們需要一套規則來決定:哪些文字已經足夠穩定,可以送給 LLM?
業界常用的策略是 LocalAgreement-2:連續兩次推論結果中,前綴完全一致的部分才標記為「已確認」,其餘標記為「臨時假設」。這樣可以大幅降低文字抖動對 LLM 的干擾。
# 偽程式碼:LocalAgreement-2 的核心邏輯
confirmed_text = ""
hypothesis = ""
def on_new_audio(chunk):
buffer += chunk
new_hyp = whisper.transcribe(buffer)
找出與上一次假設的最長共同前綴
common = longest_common_prefix(hypothesis, new_hyp)
共同前綴扣掉已確認部分,即為新確認內容
if len(common) > len(confirmed_text):
newly_confirmed = common[len(confirmed_text):]
confirmed_text += newly_confirmed
emit_to_llm(newly_confirmed)
hypothesis = new_hyp
搭配 VAD 就更完整了。VAD 的角色有兩個:決定何時開始累積音訊,以及決定何時判定使用者講完(端點偵測)。前者可以避免把靜音送進 Whisper(省算力、也避免幻覺),後者則決定何時觸發最終轉錄與 LLM 生成。
VAD 的選擇上,Silero VAD 是目前最廣泛使用的開源方案,輕量且準確;WebRTC VAD 更輕但對噪音較敏感;近兩年也出現一些基於小型神經網路的專用 VAD,在吵雜環境下表現更好。關鍵是 VAD 的「靜音尾端容忍時間」(hangover)要調對——太短會把使用者的自然停頓誤判為講完,太長則整體延遲增加。一般建議 300~600 毫秒,並依場景微調。
模型選擇與量化部署
如果你要自架 Whisper,2026 年的首選推論後端大致是這幾個:
量化方面,INT8 通常能帶來 1.5 到 2 倍的速度提升,而準確率下降在大多數語音場景中幾乎不可察覺。但要注意:音訊特徵提取(log-Mel spectrogram)這一段不要亂動,運算精度太低的量化有時會讓高頻細節丟失,反而讓辨識變差。比較穩的做法是編碼器用 FP16、解碼器用 INT8,或整體 INT8 但在特徵層保持 FP32。
幻覺抑制與提示詞工程
Whisper 最惡名昭彰的問題就是幻覺。當你餵給它靜音、純噪音、或音樂時,它會非常有自信地輸出「謝謝觀看」「字幕由 XX 提供」「請訂閱頻道」之類的內容——因為它的訓練資料大量來自帶字幕的影音。在語音 Agent 場景裡,這種幻覺會直接導致助理莫名其妙地回答不相關的內容。
我在生產環境中會同時套用以下幾層防護:
黑名單過濾:對輸出文字做正則比對,過濾典型的幻覺樣式。
另一方面,initial_prompt 是提升領域準確率最被低估的工具。你可以在裡面塞入該場景常見的專有名詞、人名、產品名稱、縮寫,Whisper 會傾向產生符合提示風格的文字。例如在醫療客服場景,塞入「高血壓、血糖、回診、處方箋」等詞,辨識率會有感提升。但要小心提示詞不要太長,否則會佔用上下文並增加延遲,一般建議控制在 100~200 字以內。
四、即時對話模型的串接技巧
Whisper 吐出來的穩定文字要送進對話模型,這裡有幾個容易做錯的地方:什麼時候送、送多少、怎麼處理插話、以及上下文要記什麼。
語意端點偵測與插話處理
傳統的 VAD 端點偵測只看「有沒有聲音」,但人類講話經常停頓——「我想問一下……那個……關於退貨的部分」。如果只靠靜音長度判斷,你可能在使用者講到一半就搶答了,體驗極差。
語意端點偵測(Semantic Endpointing)的做法是:把目前的轉錄文字送給一個輕量模型(或直接讓對話模型判斷),詢問「這句話語意上完成了嗎?」。如果語意未完成,即使 VAD 判定靜音,也再多等一段時間。這可以大幅降低「搶話」的比例。
實作上,我通常會用一個三層的判斷:
而插話處理(Barge-in)是語音 Agent 最容易被忽略、卻最影響體驗的一環。當助理正在說話、使用者突然插話時,系統必須:
立刻停止 TTS 播放(客戶端要能即時清空播放佇列)。
取消正在進行的 LLM 生成(若已 streaming)。
把「助理實際已經播放出來的那部分文字」寫回對話歷史,而不是「模型原本打算講的全部內容」。
重新進入 ASR 與端點判斷流程。
第 3 點特別重要。很多團隊的 bug 就出在這裡:助理被插話後,歷史裡記的還是完整的回答,導致下一輪對話模型以為自己已經講過了,於是回覆變得跳躍、不連貫。正確做法是維護一份「已送出至 TTS 的文字」與「已被使用者聽到(已播放)的文字」兩種狀態,並以實際播放為準寫入歷史。
上下文管理與工具呼叫
語音對話的上下文管理跟文字聊天很不一樣。有幾個原則:
第一,語音歷史要更積極地壓縮。因為語音對話往往冗長、重複、充滿語氣詞,直接全部塞進 context 會快速膨脹。建議的做法是保留最近 N 輪的完整對話,較早的部分做摘要(summary)。好的摘要要保留「使用者提到的實體、意圖、已完成的動作、待辦事項」。
第二,工具呼叫的結果要口語化。語音場景最忌諱把 API 回傳的 JSON 直接念出來。正確流程是:LLM 產生工具呼叫 → 系統執行 → 把結果以結構化方式回饋給 LLM → LLM 生成一段自然的語音回覆。千萬不要讓 TTS 去唸「status: success, order_id: 12345, eta: 3 days」。
第三,工具呼叫要有語音專屬的延遲設計。如果一個工具要跑 2 秒,使用者會聽到 2 秒的沉默。解法是讓 LLM 先產生「填補語」(filler),例如「我幫你查一下喔……」,在等待期間先播放,同時非同步執行工具。這不是作弊,這是人類客服本來就會做的事。
# 偽程式碼:帶填補語的工具呼叫流程
async def handle_turn(user_text, history):
stream = llm.stream(user_text, history, tools=TOOLS)
async for event in stream:
if event.type == "filler":
await tts.speak(event.text) # 先播「我查一下」
elif event.type == "tool_call":
result = await execute_tool(event) # 非同步執行
stream.submit_result(result) # 回饋給 LLM
elif event.type == "text":
await tts.speak_streaming(event.text)
第四,要注意提示詞的「語音化」。你應該在系統提示中明確要求模型:「輸出會被 TTS 朗讀,請避免使用 Markdown、清單符號、表情符號、括號補充說明、超連結。數字請寫成易讀形式。」這些細節如果沒要求,使用者會聽到「星號、星號、重點、星號」這種災難。
五、TTS 與語音回流的整合
語音 Agent 的另一半是輸出。TTS 這一段的優化目標只有一個:首包延遲越低越好,且不能被 LLM 的生成速度拖住。
串流 TTS 與句子切分策略
最糟的做法是等 LLM 生成完整段回覆,再一次性送給 TTS。這會讓延遲變成「LLM 全部生成時間 + TTS 全部合成時間」。
正確做法是句子級切分 + 串流合成:LLM 一邊 streaming 輸出,我們一邊偵測句子邊界(句號、問號、驚嘆號、換行,或語意上完整的子句),一旦湊出一個完整句子,立刻送進 TTS 開始合成與播放。後續句子在前一句播放的同時繼續生成與合成,形成流水線。
這裡有個取捨:切得太細,語調會破碎、不自然;切得太粗,延遲會拉高。我的經驗是,以「句號 / 問號 / 驚嘆號」為主要切點,並設定一個最小長度門檻(例如 12 個字)與最大長度上限(例如 60 個字)。如果是逗號很長的句子,可以在逗號處切,但要確保語調銜接自然——這就取決於 TTS 引擎是否支援「上一句的韻律狀態延續」。
音訊緩衝與打斷機制的實作細節
音訊管線上最容易出問題的地方是緩衝。以下幾個細節務必要注意:
getUserMedia 的 echoCancellation 選項。在框架選擇上,2026 年常見的做法是用 WebRTC(例如 LiveKit、Daily、Pipecat 等)來處理即時音訊傳輸,把 AEC、抖動緩衝、裝置切換這些髒活交給底層處理,應用層專注在 ASR/LLM/TTS 的串接邏輯上。如果你的場景是 Web 前端,WebRTC 幾乎是必然選擇;如果是電話語音(SIP/PSTN),則需要透過媒體閘道把音訊轉接進來。
六、效能優化、成本控制與可觀測性
系統上線之後,真正的挑戰才開始。你需要知道它現在好不好、哪裡慢、成本多少、什麼時候會壞。
該量測哪些延遲指標
以下是語音 Agent 必備的觀測指標,建議全部以 P50 / P95 / P99 三個分位數記錄:
ASR 首字延遲:從音訊進入到第一個穩定文字輸出。
插話成功率:使用者插話後,系統在 300 毫秒內停止播放的比例。
WER(詞錯率):用標註資料集定期回歸測試。
幻覺率:靜音或噪音輸入下產生非空輸出的比例。
成本控制的幾個關鍵手段
語音 Agent 的成本結構跟純文字應用差很多,因為 ASR 與 TTS 都是按音訊秒數計價或吃 GPU 的。以下是我常用的手段:
一、用 VAD 過濾靜音。很多團隊直接把整段通話音訊送進 ASR,但通話中有大量靜音與等待。開啟 VAD 後只送有語音的部分,ASR 成本可以降低 30% 到 60%。
二、ASR 分級。用小型模型處理即時串流,只在偵測到「需要高精度」時(例如使用者念了一串訂單編號)才呼叫大型模型重新轉錄該片段。
三、TTS 快取。系統常見的固定話術(問候語、等待語、錯誤提示)可以預先合成並快取成音訊檔,完全省下即時合成成本與延遲。
四、對話歷史壓縮。如前所述,定期摘要可以顯著降低 LLM 的輸入 token 數量,這在長期對話中節省非常可觀。
五、動態批次與 GPU 共享。自架推論時,把多路連線的請求合併成批次處理,能讓 GPU 利用率從 20% 提升到 70% 以上。
七、常見坑與除錯清單
以下是我在輔導團隊時,最常反覆看到的問題。建議你把這份清單當成上線前的檢查表。
成本失控:沒開 VAD、沒快取、沒壓縮歷史。按上面的順序逐一處理。
八、結語:2026 年的語音 Agent 開發者該具備什麼
語音 Agent 看起來只是「把 ASR、LLM、TTS 串起來」,但實際上它是一門橫跨音訊訊號處理、即時系統、分散式架構與對話設計的綜合工程。2026 年的開發者如果只會呼叫 API,很難做出真正有競爭力的產品;真正拉開差距的,是那些理解緩衝區為什麼要這樣設、端點偵測為什麼要分三層、插話為什麼要區分「生成」與「播放」兩種狀態的人。
回顧這篇文章的脈絡:Whisper 仍然是目前最穩健的語音入口,但它必須被串流化、必須搭配 VAD、必須抑制幻覺、必須用提示詞工程提升領域準確率;即時對話模型則決定了 Agent 的「智力」,但它的上下文管理、工具呼叫、填補語設計都需要針對語音場景重新思考;TTS 與音訊管線決定了最終體驗的「體感延遲」,而這往往是被忽略卻最致命的一環。
如果你正在規劃 2026 年的語音產品,我的建議是:先建立完整的可觀測性,再談優化。沒有量測的優化都是猜測。把端到端延遲、插話成功率、搶話率、幻覺率這四個指標釘在你的儀表板上,然後依照這篇文章的順序,一層一層往下調。你會發現,把延遲從 1.8 秒壓到 700 毫秒,帶來的使用者留存提升,往往比換一個更強的大模型還要明顯。
語音是人類最自然的介面,而 2026 年的技術終於讓它能被做得足夠好。剩下的,就是工程細節的功夫了。希望這篇整理能幫你在這條路上少踩幾個坑,做出真正讓人願意「一直講下去」的語音 Agent。