字幕能讓短影片在靜音狀態下也便於觀看,幫助平台理解你的內容,還能把通話錄音、會議和直播轉換成可檢索的文字。Whisper 是一款開源語音識別模型,對中文、英文以及幾十種其他語言都有很好的識別效果;faster-whisper 則能在普通 CPU 伺服器上高效執行它。本文介紹如何安裝 faster-whisper、選擇模型大小、將音訊和影片批次轉換為 SRT 字幕檔案、獲得規範的簡體中文輸出,以及用 ffmpeg 將字幕燒錄進影片。
# Debian / Ubuntu
apt install -y python3-venv ffmpeg
python3 -m venv /opt/whisper
/opt/whisper/bin/pip install --upgrade pip
/opt/whisper/bin/pip install faster-whisper "av<19" # PyAV 19 is not yet compatible with faster-whisper 1.2
使用獨立的虛擬環境,可以將這些庫與系統 Python 隔離。ffmpeg 用於提取音訊和燒錄字幕。
| 模型 | 準確度 | CPU 執行速度 | 記憶體佔用(int8,約) |
|---|---|---|---|
| base | 基礎,嘈雜音訊中會漏詞 | 很快 | 1 GB 以下 |
| small | 清晰語音效果良好 | 快 | 約 1–2 GB |
| medium | 很好 | 比 small 慢數倍 | 約 2–3 GB |
| large-v3 | 最佳,尤其適合中文和帶口音的語音 | 最慢 | 約 3–5 GB |
建議先從 small 開始,轉寫一段 5 分鐘的樣本並計時,再根據你的內容判斷 medium 或 large-v3 帶來的準確度提升是否值得多花的時間。
cat > /opt/whisper/transcribe.py <<'EOF2'
import os, sys
from faster_whisper import WhisperModel
def ts(t):
ms = int(round(t * 1000))
h, ms = divmod(ms, 3600000)
m, ms = divmod(ms, 60000)
s, ms = divmod(ms, 1000)
return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}"
size = os.environ.get("WHISPER_MODEL", "small")
lang = os.environ.get("WHISPER_LANG") or None # e.g. zh, en; empty = auto-detect
prompt = os.environ.get("WHISPER_PROMPT") or None
model = WhisperModel(size, device="cpu", compute_type="int8", cpu_threads=os.cpu_count())
for path in sys.argv[1:]:
segments, info = model.transcribe(path, language=lang, initial_prompt=prompt,
beam_size=5, vad_filter=True)
out = os.path.splitext(path)[0] + ".srt"
with open(out, "w", encoding="utf-8") as f:
for i, seg in enumerate(segments, 1):
f.write(f"{i}\n{ts(seg.start)} --> {ts(seg.end)}\n{seg.text.strip()}\n\n")
print(f"{path}: language={info.language} -> {out}")
EOF2
vad_filter 會跳過靜音和沒有人聲的音樂片段,既能提高速度,也能避免在無聲部分憑空生成文字。
# One file, automatic language detection
/opt/whisper/bin/python /opt/whisper/transcribe.py /data/videos/demo.mp4
# A whole folder with the medium model, in the background, with a log
cd /data/videos
WHISPER_MODEL=medium nohup /opt/whisper/bin/python /opt/whisper/transcribe.py *.mp4 > transcribe.log 2>&1 &
tail -f transcribe.log
每個輸入檔案旁邊都會生成一個同名的 .srt 檔案。faster-whisper 可直接讀取大多數音影片格式;對於特別大的檔案,可以先用 ffmpeg -i in.mp4 -vn -ac 1 -ar 16000 in.wav 提取音訊。
識別普通話時,Whisper 有時會輸出繁體字或缺少標點。可以固定識別語言,並提供一句簡短的簡體中文示例句作為初始提示詞(initial prompt),模型會沿用它的風格:
WHISPER_LANG=zh WHISPER_PROMPT="以下是普通話的句子,請使用簡體中文和標點符號。" \
/opt/whisper/bin/python /opt/whisper/transcribe.py livestream-0612.mp4
同樣的技巧也適用於產品名稱和專業術語:把正確的寫法放進提示詞,模型就會照此使用。
# Hard subtitles (always visible), keeping the original audio
ffmpeg -i demo.mp4 -vf "subtitles=demo.srt:force_style='FontSize=20,Outline=1'" -c:a copy demo-sub.mp4
# Or add them as a selectable subtitle track (MP4)
ffmpeg -i demo.mp4 -i demo.srt -c copy -c:s mov_text demo-softsub.mp4
如果是中文字幕,請確認伺服器上已安裝中文字型(例如 apt install fonts-noto-cjk),否則文字會顯示為方框。包括 YouTube 在內的大多數平台,也支援將 .srt 檔案與影片一起上傳。
取決於模型和 CPU。在較新的多核伺服器上,small 模型的處理速度通常快於音訊的實際時長;medium 和 large-v3 則要慢數倍。處理大批次存檔之前,請先用一段短樣本實測耗時。
這通常發生在長時間靜音或只有音樂的片段中。請保持 vad_filter 開啟,嘗試更大的模型,並檢查音訊是否音量過小或失真。
Whisper 可以直接將語音翻譯成英文(在 model.transcribe 中設定 task="translate")。如需翻譯成其他語言,可以用大語言模型翻譯 SRT 文本,例如使用 Ollama 執行本地大模型中部署的本地模型。
如果按以上步驟操作後問題仍未解決,請提交工單聯絡 IMIDC 7×24 技術支援,並附上伺服器 IP、系統版本、CPU 和記憶體配置、執行的命令以及完整的報錯輸出,方便工程師快速定位。