Linux 服务器

faster-whisper 自动生成字幕:CPU 服务器批量转 SRT、简体中文输出与 ffmpeg 烧录字幕

6 个步骤 8 分钟阅读 18 次阅读 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 和内存配置、执行的命令以及完整的报错输出,方便工程师快速定位。

这篇文章有帮助吗?

相关教程