Local AI · DGX Spark
AI 聽寫潤飾
按住說話,放開就是整理好的文字——或直接幫你翻譯。
本地 STT + LLM 潤飾,中英夾雜也聽得懂,輸出永遠是繁體。
實際介面・Playwright 實機截圖
為什麼要自己蓋一個
口述打字常常是「呃、那個、禮拜三……不對,是禮拜四」的流水帳,逐字稿能用,但不通順、還帶著講話中途改口的痕跡。丟給雲端做語音轉文字或翻譯,又得多繞一手隱私。
DGX Spark 上把本地語音辨識和 LLM 接起來,錄音當下就在地端把口說整理成通順文字,不用等雲端服務。
難的是拿捏:潤到通順,但不能改掉原意,還要接得住講到一半改口、中英文夾雜的狀況。
原理:一段話的旅程
從按下麥克風到一段可編輯文字,中間發生五件事。
麥克風收音
按住主按鈕開始說話,鬆開結束這段錄音,不需要額外按停止鍵。
瀏覽器端 VAD 斷句
偵測到 550ms 靜音就自動切一段,單段錄音上限 7 秒,純靜音的片段直接丟棄、不送出去。
本地 STT 轉文字
Qwen3-ASR-1.7B 直接輸出繁體逐字稿並累積成原始逐字稿,取代了早期跑在 CPU 上的 whisper 方案。
本地 LLM 潤飾/翻譯
依使用者選擇的模式,把整份逐字稿重新潤飾成通順文字,或整段翻譯。每次都是「整份重潤」,所以講到一半改口(「禮拜三……不對,禮拜四」)也能被自動修正;輸出走 SSE 串流逐 token 吐字。
靜默微調呈現
背景重潤完成後,畫面只 diff 替換真正變動的地方並淡色一閃,不會整段畫面重刷,閱讀不被打斷;結果是 contenteditable,可以直接編輯、複製。
原理深掘:VAD 斷句與整份重潤迴圈
聽寫本身不難,難的是在雜訊、口誤、中英夾雜之間,用最短延遲產出一份乾淨、還會自我修正的文字。以下是工具實際跑的 VAD 與重潤規則(TL_* 是程式碼裡的規則命名)。
麥克風 RMS 取樣
能量式 VAD(50ms tick)
noiseFloor 自適應 floor×3
範圍 0.012–0.09
VAD 斷句
靜音即切段
連續靜音 550ms 切段
260–7000ms・峰值<0.03 丟棄
Qwen3-ASR-1.7B
語音辨識(GPU)
中英 code-switch
OpenCC s2twp → 繁體
rawText 累積
依序合併
sequence queue 防亂序
依 idx 補位排隊
整份重潤 LLM
qwythos:9b・/no_think
debounce 350ms
max_tokens=clamp(len×2.2,160,3072)
SSE → diff patch
靜默微調
AbortController 中斷舊請求
只替換有變區段
三條自我修正規則
TL_CORR 自我修正:「不對/應該是/I mean」回頭套用最終版TL_NOISE 防幻聽:丟棄書名/歌名/外語片段等無關雜訊TL_TRAD 強制繁體:輸出一律收斂為繁體(台灣用語)
實測數據
8.7 秒中英混講 → 辨識約 1.2 秒(GPU)
9B 串流潤飾約 22 tok/s
對照組 faster-whisper small(CPU) 同句誤判為德語
Playwright 假麥克風全鏈路自動化驗證
550ms
VAD 靜音斷句門檻
~1s
停頓後出字延遲
108px
主按鈕尺寸(拇指友善)
關鍵設計決策
整份重潤,而非逐句修正
每次潤飾都重新看過整段逐字稿,使用者講話中途改口也能被自動修正過來,而不是卡在第一次講的版本。
靜默微調 UI
背景重潤後只 diff 替換變動的區塊並淡色一閃,不整段重刷畫面,閱讀體感更穩定,不會一直被打斷。
雙重防幻聽
客戶端先用音量峰值門檻擋掉太小聲或雜訊片段,LLM 再用規則丟棄明顯無關的內容,兩層一起防止聽寫「無中生有」。
強制輸出繁體
不管辨識或潤飾用了什麼模型,最終輸出統一收斂成繁體中文,不用使用者再手動轉換。
技術架構
Frontend
PTT 按住說話
滑動切換潤飾/翻譯
contenteditable 可直接編輯
VAD
瀏覽器端斷句
550ms 靜音切句
單段上限 7 秒
STT
Qwen3-ASR-1.7B
直接輸出繁體
取代早期 CPU whisper 方案
LLM
本地模型潤飾/翻譯
SSE 串流逐 token 輸出
整份重潤保留最新意圖
線上工具已上鎖(Basic Auth)・本頁分享架構與設計