150 分鐘的音訊。原版 Whisper 跑完要半小時。

換一個 CLI 工具,不到 2 分鐘。

不是換了更大的 GPU,不是換了更新的模型,甚至底層用的還是同一個 Whisper large-v3。差別只在一件事:原版 Whisper 處理音訊的方式,從一開始就是錯的。


問題不在模型,在排隊

OpenAI 的 Whisper 是語音轉文字的標竿。準確度夠高、多語言支援完整、開源。但它有一個設計決定讓推論速度被鎖死——逐段處理。

你丟一段 150 分鐘的 podcast 給 Whisper,它會先切成 30 秒的小段,然後一段一段餵進模型。處理完第一段,才處理第二段。300 段音訊,排成一條直線,乖乖等。

這就像超市只開了一個結帳櫃台。不管後面排了多少人,一次只能結一個。你的 A100 GPU 有 80GB 的顯示記憶體,但每次只塞 30 秒的音訊進去——剩下的算力全部閒置。

insanely-fast-whisper 做的事情很直觀:把 24 個櫃台同時打開。


三個加速的疊加

速度不是來自某個神奇的演算法突破,而是三件已經存在的技術正確地疊在一起。每一個都不新,但組合起來效果是指數級的。

第一層:Batched Inference。 原版一次處理 1 段,這個工具一次送 24 段進 GPU 並行計算。GPU 本來就是為了平行運算設計的——上千個核心同時動,你卻只派一個任務給它,這是對硬體最大的浪費。把 batch size 從 1 拉到 24,GPU 利用率從個位數直接拉滿。

第二層:Flash Attention 2。 這是 Tri Dao 寫的演算法,專門解決 Transformer 注意力機制的記憶體問題。標準的注意力計算是 O(N²) 的記憶體複雜度——音訊越長,記憶體吃得越兇,到某個長度就直接爆掉。Flash Attention 2 把它壓到 O(N),而且因為減少了顯示記憶體的讀寫次數,速度也跟著上來。

用個比喻:標準注意力像是每次要查字典都把整本字典從書架搬到桌上,查完再搬回去。Flash Attention 是在書架旁邊放一張小桌子,就地查完,不搬了。省的是搬運時間。

第三層:fp16 半精度。 現代 GPU 的 Tensor Core 對半精度浮點數的吞吐量是全精度的兩倍。Whisper 的推論品質在 fp16 下幾乎沒有損失,但速度直接翻倍。這不是什麼黑魔法,只是模型本來就不需要那麼高的數值精度。

三層疊起來,150 分鐘音訊從 30 分鐘壓到 98 秒。比基於 CTranslate2 的 Faster Whisper 還快 5 到 7 倍。

有夠猛。


裝起來不到五分鐘

1
2
pipx install insanely-fast-whisper
pipx runpip insanely-fast-whisper install flash-attn --no-build-isolation

第一行裝主程式,第二行裝 Flash Attention 2。用 pipx 是因為它會建立隔離的虛擬環境,不會把你的系統 Python 搞亂。

系統需求:NVIDIA CUDA GPU(Ampere 架構以上才支援 Flash Attention 2,也就是 A100、RTX 30 系列、40 系列),或者 Apple Silicon Mac 走 MPS。Python 3.8 以上。

最基本的用法就一行:

1
insanely-fast-whisper --file-name audio.mp3

Mac 使用者加個 --device-id mps。想要更快但只需要英語的話,換 distil-whisper 模型:

1
insanely-fast-whisper --file-name audio.mp3 --model-name distil-whisper/large-v2

有個很實用的翻譯模式:任何語言的音訊直接轉成英文文字。日語會議、法語訪談、中文 podcast——一行指令搞定。

1
insanely-fast-whisper --file-name japanese.mp3 --task translate

殺手功能:分辨誰在說話

轉錄文字是基本功。真正讓這個工具值得用的功能是 Speaker Diarization——自動辨識「誰在說話」,輸出裡會標上 SPEAKER_00、SPEAKER_01。

1
insanely-fast-whisper --file-name meeting.mp3 --hf-token hf_xxxxx --num-speakers 3

這背後用的是 pyannote-audio,一個專門做說話者辨識的模型。你需要 Hugging Face 的 token,而且要先到 pyannote 的 model card 上接受使用條款。一次性的麻煩,接受完就不用再管了。

會議記錄、訪談逐字稿、法律聽證——這些場景下,「誰說了什麼」跟「說了什麼」一樣重要。手動標記說話者是最痛苦的部分,自動搞定省下的時間是以小時計的。

輸出預設是 JSON。要字幕的話,內建的轉換腳本可以直接轉成 SRT 或 WebVTT:

1
python convert_output.py output.json -f srt

什麼時候不該用

誠實邊界得畫清楚。

這是離線批次處理工具,不支援即時串流。你沒辦法拿它來做直播字幕或即時翻譯。想做即時的,往 Whisper Streaming 或 RealtimeSTT 方向找。

distil-whisper 很快但只支援英語。中文、日語、法語——得乖乖用 large-v3,速度會慢一些(但依然比原版快很多)。

它繼承了 Whisper 本身的所有限制:口音重的音訊準確度下降、背景噪音太多會出問題、低品質錄音(電話錄音、環境收音)效果打折。工具可以讓模型跑得更快,但沒辦法讓模型變得更準。


這背後的事情其實只有一件

回頭看,insanely-fast-whisper 做的事情幾乎沒有原創性。Batched inference 是 GPU 計算的基本操作,Flash Attention 2 是別人寫的,fp16 是硬體本來就支援的。這個工具的全部功勞,就是把三件已經存在的東西正確地接在一起。

但這恰好是工程裡最值錢的能力。

大部分效能問題不是因為缺少更好的演算法,而是因為現有的好東西沒有被用上。你的 GPU 有 80GB 顯示記憶體,但你只用了 2GB。你的模型支援半精度推論,但沒人設 flag。注意力機制有更快的實作,但預設值沒有開。

踩坑踩得最痛的不是「技術不存在」,是「技術存在但你不知道」。

insanely-fast-whisper 的啟示很單純:在追求新模型之前,先問一個問題——你現在手上的東西,真的有被正確使用嗎?

原始碼:GitHub — Vaibhavs10/insanely-fast-whisper
相關模型:openai/whisper-large-v3 · distil-whisper · Flash Attention 2 論文