Local AI · DGX Spark
AI 英語口說對話
開口就能練口說,AI 用接近真人的速度接話。
全程地端語音對話,不必打字,也不必等雲端。
實際介面・Playwright 實機截圖
為什麼要自己蓋一個
想練英文口說,找真人陪練不好約時間,雲端語音助理又常常延遲明顯、還要顧慮語音資料的隱私。有沒有可能開口就聊,不用等?
在 DGX Spark 上把語音辨識、對話模型、語音合成串成一條全地端的 speech-to-speech 管線,講中文英文都行,開口就能對話。
難的是延遲:語音對話等超過一兩秒就不自然,每一段都得壓到接近真人的反應速度。
原理:一句話的旅程
從開口說話到聽到 AI 回覆,中間發生五件事。
麥克風即時串流
瀏覽器用 WebSocket 把聲音即時串流出去,不必等整段錄完才送出。
VAD 斷句
偵測到約 750ms 靜音才判定一句話講完——這個門檻經過調校,太短會截斷自然停頓,太長會讓人乾等。
本地 STT 辨識
Whisper large-v3-turbo 中英文自動辨識;串流中間的片段只當即時字幕顯示,等真正的 final 結果出來才送進下一步,避免 AI 搶著回半句話。
本地 LLM 對話
對話模型關閉 thinking 以壓低延遲,選模型時也以延遲優先,目前接的模型回應約 0.46 秒。
本地 TTS 念出回覆
Qwen3-TTS-12Hz-1.7B 把回覆念出來,同時前端顯示逐字稿,從開口到聽到第一個聲音約 4.25 秒。
原理深掘:即時 speech-to-speech 延遲鏈
語音對話只要每個環節各拖一點延遲,加總起來就會失去「像真人對話」的手感。以下是實際跑的事件流與延遲鏈路。
麥克風擷取
downsample → 16kHz Int16
input_audio_buffer.append
WebSocket 即時串流
Server VAD
turn_detection: server_vad
斷句等待可調 0.4–2.5 秒
session.update 即時生效不斷線
Whisper large-v3-turbo
語音辨識
中間 delta 僅供字幕
.completed 才視為 final
對話 LLM
QWEN2.5:7B・thinking 關閉
回應約 0.46 秒
Qwen3-TTS 合成
語音回覆
首個聲音約 4.25 秒
response.output_audio.delta 串流
AudioContext 排程播放
支援 barge-in
使用者開口即 stopPlayback
可隨時中斷搶話
延遲預算
VAD 斷句等待 0.4–2.5 秒(可調)→ Whisper large-v3-turbo 辨識 → LLM 回應 ~0.46 秒 → Qwen3-TTS 首音 ~4.25 秒
模型棧:QWEN2.5:7B・QWEN3-ASR-1.7B・QWEN3-TTS・中英雙語
中途辨識片段只進字幕、確定的 final 逐字稿才送進 LLM,避免對話對著半句話搶答
0.46s
LLM 回應時間
4.25s
首個回覆語音出聲時間
750ms
VAD 靜音斷句門檻
關鍵設計決策
全程本地 GPU,不經雲端
語音辨識、對話、語音合成都在自家 GPU 上跑,講話內容不會上傳到第三方服務。
HTTPS 全鏈路
瀏覽器麥克風需要 secure context 才能啟用,所以從前端到反向代理整條路徑都是 TLS。
修正 speculative transcription
串流辨識中途的片段只當字幕用,等 final 結果才送進 LLM,避免 AI 對還沒講完的句子搶答。
延遲優先選模型
對話模型的挑選以回應速度為主要標準,換到目前這顆後,回應時間壓到約 0.46 秒。
技術架構
Frontend
呼吸光球隨音量律動
WebSocket 即時串流
手機優先介面
VAD
瀏覽器端偵測
750ms 靜音判定斷句
避免截斷自然停頓
STT
Whisper large-v3-turbo
中英文自動辨識
final 結果才送進 LLM
LLM + TTS
本地對話模型(關閉 thinking)
Qwen3-TTS-12Hz-1.7B 語音合成
speech-to-speech 框架整合
線上工具已上鎖(Basic Auth)・本頁分享架構與設計