Linux 伺服器

faster-whisper 自動生成字幕:CPU 伺服器批次轉 SRT、簡體中文輸出與 ffmpeg 燒錄字幕

6 個步驟 8 分鐘閱讀 75 次閱讀 0
本文目錄

字幕能讓短影片在靜音狀態下也便於觀看,幫助平台理解你的內容,還能把通話錄音、會議和直播轉換成可檢索的文字。Whisper 是一款開源語音識別模型,對中文、英文以及幾十種其他語言都有很好的識別效果;faster-whisper 則能在普通 CPU 伺服器上高效執行它。本文介紹如何安裝 faster-whisper、選擇模型大小、將音訊和影片批次轉換為 SRT 字幕檔案、獲得規範的簡體中文輸出,以及用 ffmpeg 將字幕燒錄進影片。

轉寫完全在你的伺服器上進行,錄音檔案不會離開伺服器。每個模型首次使用時會從 Hugging Face 下載模型檔案,這一步需要伺服器能夠訪問網際網路;也可以從其他機器複製模型資料夾。

步驟 1:安裝 faster-whisper

# 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 用於提取音訊和燒錄字幕。

步驟 2:選擇模型大小

模型準確度CPU 執行速度記憶體佔用(int8,約)
base基礎,嘈雜音訊中會漏詞很快1 GB 以下
small清晰語音效果良好快約 1–2 GB
medium很好比 small 慢數倍約 2–3 GB
large-v3最佳,尤其適合中文和帶口音的語音最慢約 3–5 GB

建議先從 small 開始,轉寫一段 5 分鐘的樣本並計時,再根據你的內容判斷 medium 或 large-v3 帶來的準確度提升是否值得多花的時間。

步驟 3:建立轉寫指令碼

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 會跳過靜音和沒有人聲的音樂片段,既能提高速度,也能避免在無聲部分憑空生成文字。

步驟 4:轉寫單個檔案和整個資料夾

# 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 提取音訊。

步驟 5:輸出規範的簡體中文

識別普通話時,Whisper 有時會輸出繁體字或缺少標點。可以固定識別語言,並提供一句簡短的簡體中文示例句作為初始提示詞(initial prompt),模型會沿用它的風格:

WHISPER_LANG=zh WHISPER_PROMPT="以下是普通話的句子,請使用簡體中文和標點符號。" \
  /opt/whisper/bin/python /opt/whisper/transcribe.py livestream-0612.mp4

同樣的技巧也適用於產品名稱和專業術語:把正確的寫法放進提示詞,模型就會照此使用。

步驟 6:將字幕燒錄進影片

# 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 和記憶體配置、執行的命令以及完整的報錯輸出,方便工程師快速定位。

這篇文章有幫助嗎?

相關教程