faster-whisper:更快的 Whisper 轉寫引擎

faster-whisper 基於 CTranslate2 重新實作 Whisper 推理,適合在本機或伺服器上做更快、更省顯存的語音轉文字。

faster-whisper 是 SYSTRAN 維護的 Whisper 推理實作。它使用 CTranslate2 作為後端,在保持 Whisper 使用方式接近的同時,讓推理速度、顯存占用和部署彈性更適合工程場景。

如果你已經用過 openai/whisper,可以把 faster-whisper 理解成一個更偏生產環境的替代方案:介面仍然圍繞模型載入、音訊轉寫、分段結果展開,但底層執行效率更高,也更容易依照 CPU、GPU、量化和批次處理策略做取捨。

它解決什麼問題

Whisper 的效果很好,但原版實作直接部署時經常會遇到幾個問題:

  1. 長音訊轉寫耗時明顯。
  2. GPU 顯存占用偏高。
  3. CPU 環境可用,但速度不一定理想。
  4. 批次處理大量音影片時,吞吐不容易提升。

faster-whisper 主要就是圍繞這些問題做最佳化。專案 README 中說明,在相同精度下,它可以比 openai/whisper 快到 4 倍,並且記憶體占用更低;如果使用 8-bit 量化,速度還可以進一步提升。

安裝

一般 Python 環境裡可以直接安裝:

1
pip install faster-whisper

如果要使用 GPU,需要確認本機 CUDA、cuDNN 與 CTranslate2 版本相容。這裡最容易踩坑的是顯示卡驅動和 CUDA runtime 版本不一致:程式碼本身可能沒問題,但執行時會在載入模型或首次推理時失敗。

基本用法

最小範例很直接:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from faster_whisper import WhisperModel

model_size = "large-v3"

model = WhisperModel(model_size, device="cuda", compute_type="float16")

segments, info = model.transcribe("audio.mp3", beam_size=5)

print("Detected language '%s' with probability %f" % (info.language, info.language_probability))

for segment in segments:
    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))

這裡有幾個關鍵參數:

參數 作用
model_size 選擇 Whisper 模型規格,例如 smallmediumlarge-v3
device 推理裝置,常見值是 cudacpu
compute_type 計算精度,例如 float16int8_float16int8
beam_size 解碼搜尋寬度,通常越大越穩,但速度越慢

如果你的目標是本機快速轉寫,通常可以先從 mediumlarge-v3 開始測試。顯存緊張時,再考慮量化。

CPU 和 GPU 怎麼選

有 NVIDIA GPU 時,優先用:

1
model = WhisperModel("large-v3", device="cuda", compute_type="float16")

顯存不夠時可以換成:

1
model = WhisperModel("large-v3", device="cuda", compute_type="int8_float16")

沒有 GPU 時,可以在 CPU 上跑:

1
model = WhisperModel("small", device="cpu", compute_type="int8")

CPU 模式更適合輕量任務、後台低頻任務,或者沒有顯示卡的伺服器。要處理大量長音訊,GPU 仍然更合適。

批次轉寫

faster-whisper 也提供批次轉寫能力。批次處理適合大量短音訊,或者需要提升 GPU 吞吐的場景:

1
2
3
4
5
6
7
8
from faster_whisper import WhisperModel, BatchedInferencePipeline

model = WhisperModel("turbo", device="cuda", compute_type="float16")
batched_model = BatchedInferencePipeline(model=model)
segments, info = batched_model.transcribe("audio.mp3", batch_size=16)

for segment in segments:
    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))

batch_size 不是越大越好。它會提高吞吐,但也會增加顯存壓力。實際部署時建議從 4、8、16 這樣的值逐步測試,找到機器能穩定承受的點。

VAD 和詞級時間戳

語音轉文字經常會遇到長靜音、背景噪音和字幕對齊問題。faster-whisper 內建了一些實用參數,可以直接在轉寫時啟用。

啟用 VAD:

1
segments, info = model.transcribe("audio.mp3", vad_filter=True)

取得詞級時間戳:

1
2
3
4
5
segments, info = model.transcribe("audio.mp3", word_timestamps=True)

for segment in segments:
    for word in segment.words:
        print("[%.2fs -> %.2fs] %s" % (word.start, word.end, word.word))

VAD 適合處理會議錄音、Podcast、直播回放這類包含長靜音的音訊。詞級時間戳則適合生成字幕、做逐字稿校對,或者後續接入播放器高亮。

模型怎麼選

模型選擇主要看三件事:準確率、速度、機器資源。

場景 建議
快速測試 smallmedium
中文內容品質優先 large-v3
GPU 顯存緊張 int8_float16 或更小模型
CPU 跑後台任務 小模型加 int8
批次短音訊 嘗試 BatchedInferencePipeline

如果是中文語音,建議優先測試 large-v3。如果機器壓力太大,再降低模型規格或使用量化。不要一開始就只看速度,轉寫品質下降後,人工校對時間可能會把省下來的推理時間抵消掉。

適合的使用場景

faster-whisper 很適合這些任務:

  1. 影片字幕生成。
  2. Podcast、會議、課程錄音轉文字。
  3. Bilibili、YouTube 等影片的本機轉寫流程。
  4. 批次音訊歸檔和檢索。
  5. 把語音內容接入 RAG、知識庫或搜尋系統。

它不直接解決說話人分離、摘要、章節切分這些上層問題,但可以作為穩定的轉寫層。後面可以再接 pyannote 做說話人分離,接 LLM 做摘要和結構化整理。

部署建議

實際使用時,可以按這個順序調試:

  1. 先用一段 1 到 3 分鐘的音訊確認環境能跑通。
  2. 再換成目標語言和目標音質的樣本測試準確率。
  3. 確認顯存占用,再決定是否啟用量化。
  4. 長音訊先切分,避免一次性任務失敗後重跑成本過高。
  5. 輸出結果同時保存 TXT 和 SRT,後續校對更方便。

如果是伺服器任務,最好把模型載入放在服務啟動階段,不要每次請求都重新載入模型。模型載入本身會消耗時間,頻繁載入也容易讓顯存管理變得不穩定。

小結

faster-whisper 的價值在於把 Whisper 變成更適合長期使用的轉寫元件。它不是換一個模型,而是換一套更高效的推理後端和工程介面。

對於個人工作流,可以用它快速把影片、會議、課程音訊變成文字。對於伺服器端任務,可以透過 GPU、量化、批次處理和 VAD 做效能調校。只要機器環境配置正確,它會比原版 Whisper 更適合承擔穩定、批次的語音轉文字工作。

專案地址:https://github.com/SYSTRAN/faster-whisper

记录并分享
使用 Hugo 建立
主題 StackJimmy 設計