跳至主要内容

Whisper:影音轉錄字幕檔

faster-whisper 是 OpenAI Whisper 的加速實作,可以在本機把影片或音訊轉錄成字幕。

以前我都只用預設參數,後來請 LLM 幫我把幾個實用參數補上,轉錄品質明顯穩定許多。

環境準備

開始前需要三樣東西:

  1. Python:安裝時記得勾選「Add Python to PATH」,裝完在終端機輸入 python --version 確認裝好。
  2. faster-whisper 套件:在終端機執行 pip install faster-whisper 安裝。
  3. ffmpeg:負責讀取影音檔,系統要裝好並加進 PATH(Windows 可用 winget install ffmpeg 安裝)。
資訊

模型檔不用自己下載,第一次執行時程式會自動抓,請耐心等候。

載入模型

from faster_whisper import WhisperModel

model = WhisperModel("large-v3", device="cuda", compute_type="int8_float16")
參數用途
large-v3模型大小,越大越準、越吃資源也越慢。常見有 tinybasesmallmediumlarge-v3,電腦跑不動就往小的換。另外還有 turbo,是 large-v3 的精簡版,速度快 5~6 倍、準度接近但略低,求快可改用它
device="cuda"用 Nvidia GPU 跑(沒有獨立顯卡就改 "cpu",速度會比較慢)
compute_type="int8_float16"模型的運算精度,數字越精細越準、越吃顯卡記憶體。GPU 可用 "int8_float16""float16""int8";CPU 建議直接指定 "int8"

轉錄範例

segments, info = model.transcribe(
"input.mp4",
language="ja",
beam_size=5,
vad_filter=True,
vad_parameters=dict(min_silence_duration_ms=500),
condition_on_previous_text=False,
no_speech_threshold=0.6,
temperature=[0.0, 0.2, 0.4, 0.6],
word_timestamps=True,
)
參數用途
language="ja"指定影片語言(ja 是日文),語言代碼可在 Whisper 支援語言清單 查到
beam_size=5搜尋寬度,越大越準但越慢
vad_filter=True開啟語音活動偵測,自動跳過無人聲的片段
min_silence_duration_ms=500靜音超過 0.5 秒才切句,避免把一句話切得太碎
condition_on_previous_text=False不把前一段當提示,避免前面認錯字污染後面(上下文能力會變弱)
no_speech_threshold=0.6判定為「無語音」的門檻,過濾掉雜訊段落
temperature=[0.0, 0.2, 0.4, 0.6]卡住時自動換溫度重試,從最保守往上加
word_timestamps=True逐字時間戳,把句尾收斂到最後一個字,避免一句字幕卡很久

寫出 SRT

transcribe 回傳的是惰性 generator,可以邊跑邊寫檔,這樣轉錄過程中隨時都有部分成品:

def format_timestamp(seconds: float) -> str:
ms = int(round(seconds * 1000))
h, ms = divmod(ms, 3600_000)
m, ms = divmod(ms, 60_000)
s, ms = divmod(ms, 1000)
return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}"

with open("output.jp.srt", "w", encoding="utf-8") as f:
for i, seg in enumerate(segments, start=1):
f.write(f"{i}\n")
f.write(f"{format_timestamp(seg.start)} --> {format_timestamp(seg.end)}\n")
f.write(f"{seg.text.strip()}\n\n")

這裡輸出的是日文原文,接下來再翻成中文。

如何翻成中文

拿到日文 SRT 後,翻成中文有三條路:

  • 線上 Google 翻譯:把 SRT 丟到 translatesubtitles.co,貼上字幕、選好語言,一秒就翻完,不用裝任何東西。缺點是逐句翻譯、不吃上下文,遇到對話或專有名詞翻得很爛,而且字幕內容會上傳到第三方。適合不追求翻譯品質、大概看得懂就好的情境。

  • 線上 LLM:把逐字稿或 SRT 貼給 ChatGPT、Gemini 這類線上 LLM,可以快速翻譯、也能順便幫你總結內容、快速了解一支影片在講什麼,速度快、品質也比 Google 翻譯好。缺點是內容容易被審查(碰到敏感題材可能直接拒絕翻譯),一樣有上傳第三方的隱私問題。

  • 本地 LLM:在自己電腦上跑模型翻譯,有基本上下文、品質可接受、不會被審查、資料也不外流,做法見「Ollama:用本地 LLM 翻譯字幕」。