PawAI
語音開發歷程總整理
一、 專案概述與系統核心理念
語音系統是 PawAI 最核心的互動入口,承載了機器狗與使用者高達 70% 的互動比例。我們的目標是讓原本只能遙控的 Unitree Go2,進化成具備「聽、想、說」能力的居家陪伴夥伴。
為了解決「硬體資源受限 (Jetson 8GB)」與「即時互動零延遲要求」的衝突,我們設計了一個具備高度容錯與備援機制的 11-stage 端到端 (End-to-End) 閉環架構。系統將使用者的自然語音轉換為大腦可解析的文字與意圖事件,再將大腦生成的文字回覆,透過動態語音合成自然地播放出來並連動肢體動作。
二、 系統架構、選型歷程與容錯機制
語音管線分為三大核心節點,我們在開發過程中進行了大量的模型實測,最終確立了「雲端主力 + 本地備援」的容錯架構。
1. ASR 語音轉文字與意圖節點 (The Ears)
- 核心節點:
stt_intent_node - 執行環境:Jetson 邊緣運算平台(負責實體收音與本地模型運算)+ RTX 8000 伺服器(負責雲端主力模型運算)。
- 開發歷程與 A/B 測試:
- 早期嘗試全本地部署(如 Whisper),但在 Go2 馬達噪音環境下準確率驟降(最佳僅 64%)。嘗試極輕量模型 Sherpa-onnx 則出現「瓦斯 l l e」等亂碼幻覺。
- 最終架構 —— 三層容錯 Provider Chain:
- 主力 (雲端):SenseVoice Cloud。運算速度極快(延遲僅 350-400ms),辨識效果與準確度極高,且具備獨家「情緒辨識」能力。
- 次級 (邊緣):SenseVoice Local。
- 備援 (離線):Faster-Whisper (int8 量化)。確保網路完全斷線時,PawAI 仍具備基礎聽覺。
2. LLM 大腦決策中心 (The Brain)
- 核心節點:
llm_bridge_node - 執行環境:雲端 API + Jetson CPU。
- 開發歷程與 A/B 測試:
- 開發期曾實測多款本地模型(如 Qwen 0.5B/1.5B/7B),但發現 7B 模型會讓 Jetson 頻繁 OOM(記憶體耗盡),而小模型在「講笑話、說故事」等擬真閒聊情境下語感生硬,且意圖映射有偏差。
- 最終架構 —— 主副腦與規則防呆:
- 主腦:
gpt-5.4-mini。處理主要對話與決策,JSON 輸出極度穩定,P50 延遲僅 1.16s。 - 副腦:
gemini-3-flash-preview。當主腦超時或異常時無縫切換。 - 離線保底:
RuleBrain。若逢完全斷線,由基於模板的純規則引擎接管,確保基礎動作安全。
- 主腦:
3. TTS 語音合成節點 (The Mouth)
- 核心節點:
tts_node - 執行環境:雲端 API + Jetson CPU。
- 開發歷程與 A/B 測試:
- 曾寄望於 CosyVoice 與 Qwen3-TTS 帶來豐富情感,但生成式 AI 長句延遲極高(高達 75 秒)且易產生注音文幻覺,無法滿足即時互動。
- 最終架構 —— 動態雙軌路由 (Dual-Route):
- 高品質通道 (Quality Lane):針對 ≥12 字的長句或帶有情緒標籤(如
[excited])的句子,路由至 Gemini 3.1 Flash TTS 進行高擬真情緒渲染。 - 極速通道 (Fast Lane):針對安全關鍵字或短句,路由至 Edge-TTS,確保極速回應。
- 本地備援:配置 Piper 模型,確保斷線時依然能發聲。
- 高品質通道 (Quality Lane):針對 ≥12 字的長句或帶有情緒標籤(如
三、 技術痛點與獨家解決方案
在打造 11-stage 閉環架構時,我們克服了多項致命的工程挑戰:
- 語音自激防護 (Echo Gate):
- 痛點:麥克風會錄到機器狗自己喇叭發出的聲音,導致無限迴圈對話。
- 解法:系統監聽
/state/tts_playing狀態。在發聲期間與結束後的 1.0 秒冷卻期內,強制拋棄麥克風的收音,完美斬斷自激迴圈。
- ASR 靜音幻覺抑制:
- 痛點:Whisper 在安靜環境下極易產生「字幕by索蘭婭」等無意義的靜音幻覺。
- 解法:導入 OpenCC 繁簡轉換並設立嚴格的黑名單過濾機制,大幅節省後端 LLM 運算資源與 API 成本。
- 缺乏環境感知的瞎聊 (Context Injection):
- 痛點:大腦缺乏視覺與時間觀念,無法做出貼心提醒。
- 解法:開發「動態情境注入」。在送出對話前,攔截關鍵字並異步呼叫氣象署 API,或接收 ROS2 視覺節點的提示,將現實資料無縫塞入 System Prompt。
- 長句生成延遲 (Chunking):
- 痛點:TTS 處理長篇故事會讓使用者乾等。
- 解法:實作平行切片 (Chunking),並強制將開頭的情緒標籤複製到每一個 Chunk 中,確保語氣連貫且能實現「邊聽邊播」。
四、 核心程式檔案與通訊協定
系統各節點職責分明,並透過嚴格的合約進行溝通:
核心模組清單
stt_intent_node.py:負責收音、VAD 截斷、呼叫 ASR 轉譯及 Echo Gate 實作。intent_classifier.py:負責初步意圖分類與 Whisper 幻覺黑名單過濾。llm_bridge_node.py:管理大腦路由,處理 GPT、Gemini 與 RuleBrain 的切換邏輯。tts_node.py:實作 TTS 雙軌路由、快取 (Cache) 機制與本地 Piper 備援、平行 Chunking。vad_node.py:實作 Energy VAD 邏輯,控管靜音等待與緩衝時間。llm_contract.py:定義系統資料結構與合約。
輸出資料規格 (LLM Contract)
各節點嚴格遵循 JSON 規格,確保大腦決策與硬體執行的精準對接:
JSON
{
"intent": "greet",
"reply_text": "[excited] 你好!我是 PawAI,你專屬的居家互動機器狗!",
"selected_skill": "hello",
"reasoning": "使用者主動打招呼,應以開心語氣回應並做出打招呼動作。",
"confidence": 0.98
}五、 展示對話與未來展望
** Demo 展示情境**
- 「早安伸個懶腰,我等等要出門上課,請問現在的天氣如何?」(驗證情境注入與 LLM 邏輯)
- 「講一個關於大野狼的故事。」(驗證 Quality Lane 情緒渲染與 Chunking 切片)
- 「糟糕!快停下!前面有樓梯!」(驗證 Fast Lane 瞬間安全反應)
** 未來優化方向**
- 升級 AI 神經網路 VAD:將現有的 Energy VAD 汰換為 Silero VAD,預期可將收音判斷的拖尾延遲縮短至 500ms 以內。
- 支援複合動作指令 (Composite Skills):修改
llm_contract.py,將單一動作升級為「動作陣列」,實現一邊起立、一邊開心踏步的生動連動。 - 外接硬體機構優化:設計專屬 3D 列印固定座,解決 Go2 大動作時 USB 喇叭線路實體鬆脫的 Silent Fail 問題。