FFmpeg + Whisper 工作流程

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_s16le16-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

相關主題