FFmpeg + Whisper 工作流程
部分內容由 LLM 生成,尚未經過人工驗證。
本文介紹如何結合 FFmpeg 與 Whisper 建立完整的音訊轉錄工作流程:從影片/音訊檔案提取音軌,轉換為 Whisper 最佳化格式,最後產生帶時間戳的文字稿。
工作流程概覽
flowchart LR
A[影片/音訊檔案] --> B[FFmpeg 提取音訊]
B --> C[轉換為 WAV]
C --> D[Whisper 轉錄]
D --> E[時間戳 + 文字]
為什麼需要 FFmpeg 預處理?
Whisper 可以直接處理多種音訊格式,但預先使用 FFmpeg 轉換有以下優點:
| 優點 | 說明 |
|---|---|
| 統一格式 | 避免格式相容性問題 |
| 減少檔案大小 | 移除不必要的視訊軌 |
| 最佳化參數 | 16kHz 單聲道是 Whisper 訓練時的格式 |
| 批次處理 | 標準化流程便於自動化 |
Step 1:FFmpeg 音訊提取與轉換
基本轉換(推薦格式)
ffmpeg -i input.mp4 -vn -acodec pcm_s16le -ar 16000 -ac 1 output.wav| 參數 | 說明 |
|---|---|
-vn | 移除視訊軌 |
-acodec pcm_s16le | 16-bit PCM 編碼(無損) |
-ar 16000 | 取樣率 16kHz(Whisper 最佳化) |
-ac 1 | 單聲道 |
保留原始音質
ffmpeg -i input.mp4 -vn -acodec pcm_s16le -ar 44100 -ac 2 output.wav從網路串流提取
# 從 HLS 串流提取音訊
ffmpeg -i "https://example.com/stream.m3u8" -vn -acodec pcm_s16le -ar 16000 -ac 1 output.wav
# 限制下載時長(例如前 10 分鐘)
ffmpeg -i "https://example.com/stream.m3u8" -t 00:10:00 -vn -acodec pcm_s16le -ar 16000 -ac 1 output.wav音訊格式轉換對照
| 來源格式 | 轉換指令 |
|---|---|
| MP4 影片 | ffmpeg -i video.mp4 -vn -ar 16000 -ac 1 output.wav |
| MKV 影片 | ffmpeg -i video.mkv -vn -ar 16000 -ac 1 output.wav |
| MP3 音訊 | ffmpeg -i audio.mp3 -ar 16000 -ac 1 output.wav |
| M4A 音訊 | ffmpeg -i audio.m4a -ar 16000 -ac 1 output.wav |
| FLAC 音訊 | ffmpeg -i audio.flac -ar 16000 -ac 1 output.wav |
Step 2:Whisper 轉錄
基本轉錄
whisper output.wav --model base --language zh產生字幕檔
# SRT 格式
whisper output.wav --model medium --language zh --output_format srt
# 所有格式
whisper output.wav --model medium --language zh --output_format all --output_dir ./transcripts高精度轉錄
whisper output.wav --model large --language zh --device cuda一行指令完成(管線)
Linux/macOS
ffmpeg -i input.mp4 -vn -ar 16000 -ac 1 -f wav - | whisper - --model base --language zh管線方式需要 Whisper 支援從 stdin 讀取,某些版本可能不支援。建議使用兩步驟方式確保穩定性。
批次處理腳本
Bash 腳本(Linux/macOS)
#!/bin/bash
INPUT_DIR="./videos"
OUTPUT_DIR="./transcripts"
MODEL="medium"
LANG="zh"
mkdir -p "$OUTPUT_DIR"
for file in "$INPUT_DIR"/*.mp4; do
filename=$(basename "$file" .mp4)
echo "Processing: $filename"
# 轉換為 WAV
ffmpeg -i "$file" -vn -ar 16000 -ac 1 "$OUTPUT_DIR/$filename.wav" -y
# Whisper 轉錄
whisper "$OUTPUT_DIR/$filename.wav" \
--model $MODEL \
--language $LANG \
--output_format all \
--output_dir "$OUTPUT_DIR"
# 清理暫存 WAV
rm "$OUTPUT_DIR/$filename.wav"
done
echo "Done!"常見問題排解
音訊品質問題
# 提高取樣率(如果原始音訊品質較高)
ffmpeg -i input.mp4 -vn -ar 44100 -ac 1 output.wav長音訊處理
# 分段處理(每 30 分鐘一段)
ffmpeg -i long_audio.mp4 -vn -ar 16000 -ac 1 -f segment -segment_time 1800 output_%03d.wav記憶體不足
# 使用較小模型
whisper output.wav --model tiny --language zh
# 或使用 CPU(較慢但穩定)
whisper output.wav --model base --language zh --device cpu