技術

在 CPU 上執行串流語音轉文字:將 NVIDIA Nemotron 整合至桌面應用程式

OpenWhispr 如何透過本機 WebSocket 上的快取感知串流模型,在不使用 GPU 和雲端的情況下邊說邊顯示文字,以及讓它可靠運作所需的工程實作。

OpenWhispr

OpenWhispr

工程

2026年7月18日
目錄

串流語音轉文字不必等待錄音結束,而是在你說話時同步轉錄。從版本1.7.6開始,OpenWhispr完全在裝置端完成這項工作:NVIDIA Nemotron 串流模型(600M參數、INT8量化)透過本機sherpa-onnx WebSocket伺服器在CPU上執行;部分結果抵達時聽寫預覽會即時更新,停止時則立即將串流文字提交為正式轉錄。 不需 GPU、不需 Python 環境,音訊也不會離開裝置。

本文記錄具體工程實作:舊版即時預覽為何遲緩、快取感知串流究竟是什麼、整套管線如何放入Electron應用程式、版本鎖定錯誤為何造成全面誤解碼,以及我們如何從每次重新解碼整段錄音,改為直接提交串流。模型之間的比較請參閱 Parakeet vs Whisper vs Nemotron

最後更新於2026年7月18日。實作細節對應 OpenWhispr 1.7.6 發布的串流轉錄功能;文中內容都可在開放原始碼儲存庫中查核。

事實速查(第一手來源)

問題:在批次模型上建立即時預覽

OpenWhispr一直都有轉錄預覽:聽寫時用一個小視窗顯示模型聽到的內容。1.7.6之前,我們採用讓批次模型看起來即時的唯一辦法:緩衝約1.5秒麥克風音訊、完整轉錄該區塊、附加文字,然後重複。

這種方式有三個結構性問題。第一是延遲:緩衝區填滿前文字無法出現,因此預覽總會落後1.5秒加上推論時間。第二是邊界:跨越兩個區塊的單字會被切斷,而區塊各自轉錄,雙方都無法修正。第三是上下文:第五塊不知道第四塊說了什麼,模型每1.5秒都要重新判斷同一類歧義。

縮短區塊會顯得更快,卻因上下文減少、邊界增加而大幅降低準確率。重疊區塊能修復邊界,卻要重複轉錄同一段音訊。真正需要的是為轉錄音訊串流而訓練的模型,這就是Nemotron。

快取感知串流究竟是什麼

快取感知串流模型會在區塊之間保留內部狀態。 下一段音訊抵達時,編碼器不會重讀先前全部語音,只處理新影格,並查詢已計算上下文的快取。它和讓聊天機器人更快的KV快取原理相同,只是套用在語音編碼器上。

這種設計帶來兩個結果。計算量不再隨錄音長度成長:無論錄到10秒或10分鐘,每塊成本都一樣,因此純CPU串流處理成為可能。上下文也會延續:模型利用先前全部語音解決歧義,後續音訊提供新證據時會修正較早的詞。文字在你說完後稍微「穩定」一下,不是故障,而是模型用更充分的依據修正判斷。

延遲預算可以調整。Nemotron提供80ms(最快,每步上下文最少)到1.12s(準確率最高,在leaderboard資料集上平均6.93% WER,與最佳批次模型相差約一個百分點)的區塊。訓練採用NVIDIA cache-aware FastConformer和transducer解碼器;其 工程文章 深入說明了相關原理。

OpenWhispr 內部架構

OpenWhispr 中的即時串流路徑

Microphone16kHz PCM via AudioWorklet
Local WebSocket127.0.0.1, float32 frames
Nemotron 0.6Bsherpa-onnx, INT8, CPU
Partial resultsJSON per chunk
Live previewText replaced in place
  • One persistent stream for the whole recording — the encoder cache carries context across chunks.
  • Everything is on-device: the WebSocket server is a local sherpa-onnx binary, not a cloud endpoint.
  • A clean flush at stop commits the streamed text as the final transcript; anything less falls back to a full re-decode.

管線刻意保持簡單。AudioWorklet以16kHz擷取麥克風PCM,將影格轉換為float32傳輸格式,再透過WebSocket推送至sherpa-onnx online伺服器。OpenWhispr在本機啟動這個原生二進位,並透過127.0.0.1通訊,每次錄音維持一條長連線。伺服器以INT8權重執行Nemotron並傳回JSON部分結果;預覽視窗會原地取代全文,而不是不斷附加。

為何採用獨立伺服器程序,而不是在程序內推論?為了隔離。原生推論執行環境可能當機;ONNX核心一次錯誤的記憶體配置不該拖垮整個桌面應用程式。輔助程序當機只需重新連線,不會丟失聽寫。它也讓原生程式碼完全離開Electron主程序:應用程式負責通訊協定,輔助程序負責運算。

同一模式也用於我們的 本機說話者分離 ——一套sherpa-onnx工具鏈,多種工作,全都在裝置端完成。

實作過程踩過的坑

執行環境版本比預想更重要。 Nemotron需要sherpa-onnx 1.13.4或更新版本才能準確解碼。在為Parakeet打包的舊版執行環境上,它不會明顯報錯,而是直接產生錯誤轉錄。修正很普通:升級並重新鎖定各平台二進位。普遍教訓是,對模型執行環境而言,「能執行」與「結果正確」是兩項測試,只有後者算數。

串流會失敗,所以舊路徑必須保留。 連接埠可能被占用、模型檔案可能遺失,伺服器也可能在錄音中結束。若長連線無法啟動,預覽會自動退回緩衝區塊路徑——較慢,但不會空白。offline模型(Parakeet、Whisper)原本就保留分塊預覽;登錄檔中的每個模型宣告執行環境為online或offline,應用程式據此選擇。

部分結果需要不同的呈現方式。 分塊路徑附加文字,串流假設卻會自行修正,因此UI在每個部分結果抵達時取代整段預覽。若把會改變的假設不斷附加,就會產生斷續的重複文字——這是我們很早修復的真實UX問題。

直接提交串流:從兩次解碼到一次

第一版只把串流結果當成預覽:停止聽寫後,應用程式會從頭重新解碼完整錄音,並貼上那份結果。這樣很穩妥,因為最終處理能看到完整上下文;但每次聽寫都要付出兩次解碼的成本,而且你已看著文字穩定下來,仍得等待幾乎總是相同的第二意見。

因此我們在同一版本中把串流設為真實來源。無論預覽視窗是否開啟,聽寫都會走長連線;停止時,應用程式清空模型尾端,直接提交串流文字,不再進行第二次解碼。結束延遲只剩一次尾端清空,每次聽寫的CPU成本約減半。

安全網沒有消失,而是成為備援機制。停止清空會感知截斷,只要結果仍在抵達便延長期限。若連線中斷或結果被截斷,應用程式會捨棄串流,改用傳統的「先錄音、後轉錄」方式處理完整錄音。只有同時快速且正確時才會走快速路徑。

效能與資源占用

  • 模型: Nemotron Speech Streaming EN 0.6B(632MB)和Nemotron 3.5 ASR Streaming 0.6B(650MB、15種可轉錄語言、自動偵測)——INT8 ONNX,只下載一次並在本機快取。
  • 執行環境: sherpa-onnx 1.13.4,自包含的原生二進位。不需Python、PyTorch或CUDA。
  • 硬體: 現代筆電CPU可即時處理;Apple Silicon和較新的x86都能輕鬆跟上說話速度。
  • 體感: 部分文字落後語音遠不到1秒;停止時一次尾端清空即可提交轉錄,不需再次解碼。

這條路徑完全不接觸網際網路。應用程式透過127.0.0.1與伺服器通訊(Windows上另以限定範圍的防火牆規則阻止網路存取該連接埠),模型檔案位於本機快取,音訊從不離開裝置。這與 我們的本機轉錄架構其餘部分採用相同的隱私標準。

坦白的限制

  • 串流處理以少量準確率換取即時性。 在相同基準上,串流約為~6.9%,NVIDIA最佳英語批次模型為5.91%。現在正式轉錄來自串流,因此這確實是一項取捨。若只在意最終結果,offline Parakeet仍是準確率較高的選擇。
  • 語言涵蓋範圍小於Whisper。 多語言模型有15種可直接轉錄語言,Whisper則有99種。華語和泰語串流目前尚未提供。
  • 部分文字會改變。 假設會隨上下文修正。我們認為看著它逐漸穩定是一項優點;若覺得分心,可關閉預覽,聽寫仍和以前完全相同。
  • 磁碟會再占用650MB 如果已安裝offline模型,這就是為不同工作最佳化第二套引擎的代價。

在 OpenWhispr 中選擇模型

你的需求選擇
聽寫時即時預覽英語文字Nemotron Speech Streaming EN 0.6B
即時預覽西班牙語、日語、阿拉伯語、印地語等Nemotron 3.5 ASR Streaming 0.6B
英語準確率最高,不需要即時文字Parakeet Unified EN 0.6B
使用NVIDIA範圍外的語言Whisper (turbo 或 large)

這些模型都可在「設定」的下拉選單中選取;完整的容量與取捨資訊請見 模型頁面。OpenWhispr免費、開放原始碼,並支援macOS、Windows與Linux。

常見問題

什麼是串流語音轉文字?

串流(online)語音轉文字會在說話尚未結束時處理音訊,並在固定延遲範圍內輸出部分結果,通常是80毫秒到約1秒。Whisper 等批次(offline)模型則會等錄音結束,再一次處理全部內容。即時字幕、語音代理程式,以及邊說邊顯示的聽寫預覽,都有賴串流處理。

沒有 GPU,也能在本機執行串流語音轉文字嗎?

可以。NVIDIA Nemotron 串流模型有600M參數,以約650MB的INT8量化ONNX檔案提供,透過不需Python或PyTorch的原生二進位執行環境sherpa-onnx,可在現代CPU上即時執行。OpenWhispr為macOS、Windows與Linux提供這套設定。

什麼是快取感知串流 ASR?

這是 NVIDIA cache-aware FastConformer 架構:模型會在音訊區塊之間保留編碼器內部狀態。每個新區塊只處理一次,並使用先前語音的快取內容,而非重新編碼彼此重疊的音訊視窗。如此一來,低延遲串流辨識便足夠輕量,能在筆電CPU上執行。

即時預覽文字為何顯示後還會改變?

串流模型會隨著更多音訊抵達而修正假設。單字邊界或同音字有時只能靠後文判斷,因此部分結果會在原處取代。這是刻意的設計。停止聽寫時,OpenWhispr會清空模型尾端,並將穩定後的串流文字寫入轉錄;若清空程序中斷或結果遭截斷,應用程式會自動重新解碼完整錄音,絕不會把不穩定的串流結果貼出去。

串流轉錄是否比批次處理不準確?

會略低,因為串流模型無法看到未來的音訊。Nemotron 英語串流模型在 Open ASR Leaderboard 資料集上使用1.12秒區塊時,平均字詞錯誤率為6.93%。這已非常接近批次模型,但仍落後 NVIDIA 最佳英語批次模型的5.91%。選擇串流模型,就是以這點差距換取即時文字和停止即得的轉錄;若最高準確率更重要,可改選offline Parakeet模型。

OpenWhispr 的串流模式支援哪些語言?

目前有兩個 Nemotron 模型:僅英語模型,以及支援自動語言偵測的 Nemotron 3.5。後者有15種可直接轉錄的語言(英語、西班牙語、法語、義大利語、葡萄牙語、荷蘭語、德語、土耳其語、俄語、阿拉伯語、印地語、日語、韓語、越南語、烏克蘭語)。Parakeet 和 Whisper 等 offline 模型涵蓋更多語言,但預覽使用緩衝區塊,而不是即時串流。