Linux-сервер

Автоматические субтитры с faster-whisper на CPU-сервере: пакетные SRT, упрощённый китайский и ffmpeg

6 шагов 13 мин чтения 72 просмотров 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 ГБ
smallХорошая для чёткой речиВысокаяоколо 1–2 ГБ
mediumОчень хорошаяВ несколько раз медленнее smallоколо 2–3 ГБ
large-v3Лучшая, особенно для китайского и речи с акцентомСамая низкаяоколо 3–5 ГБ

Начните с 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, загруженный вместе с видео.

Частые вопросы

Сколько времени занимает распознавание?

Это зависит от модели и процессора. На современном многоядерном сервере модель small обычно обрабатывает аудио быстрее реального времени; medium и large-v3 работают в несколько раз медленнее. Прежде чем обрабатывать большие архивы, сделайте замер на коротком фрагменте.

Текст повторяется или содержит фразы, которых никто не произносил

Обычно это происходит на длинных участках тишины или музыки без речи. Не отключайте vad_filter, попробуйте модель покрупнее и проверьте, что звук не слишком тихий и не искажён.

Можно ли перевести субтитры?

Whisper умеет переводить речь сразу на английский (task="translate" в model.transcribe). Для других языков переведите текст SRT с помощью языковой модели, например локальной из статьи запуск локальной LLM с Ollama.

Если проблема не решена, создайте тикет — техническая поддержка IMIDC работает 24/7. Укажите IP сервера, версию ОС, CPU и объём RAM, выполненную команду и полный текст ошибки, чтобы мы быстрее нашли причину.

Помог ли вам данный ответ?

Похожие руководства