Субтитры позволяют смотреть короткие видео без звука, помогают платформам понимать ваш контент и превращают записи звонков, встреч и прямых эфиров в текст, по которому можно искать. 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 ГБ |
| small | Хорошая для чёткой речи | Высокая | около 1–2 ГБ |
| medium | Очень хорошая | В несколько раз медленнее small | около 2–3 ГБ |
| large-v3 | Лучшая, особенно для китайского и речи с акцентом | Самая низкая | около 3–5 ГБ |
Начните с 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, загруженный вместе с видео.
Это зависит от модели и процессора. На современном многоядерном сервере модель small обычно обрабатывает аудио быстрее реального времени; medium и large-v3 работают в несколько раз медленнее. Прежде чем обрабатывать большие архивы, сделайте замер на коротком фрагменте.
Обычно это происходит на длинных участках тишины или музыки без речи. Не отключайте vad_filter, попробуйте модель покрупнее и проверьте, что звук не слишком тихий и не искажён.
Whisper умеет переводить речь сразу на английский (task="translate" в model.transcribe). Для других языков переведите текст SRT с помощью языковой модели, например локальной из статьи запуск локальной LLM с Ollama.
Если проблема не решена, создайте тикет — техническая поддержка IMIDC работает 24/7. Укажите IP сервера, версию ОС, CPU и объём RAM, выполненную команду и полный текст ошибки, чтобы мы быстрее нашли причину.