Подкастер расшифровывает выпуски вручную: Whisper на своём сервере
Каждый новый выпуск — это не только запись и монтаж, но и текст: субтитры для видеоверсии, транскрипт для сайта, цитаты для соцсетей. Если расшифровывать вручную, час разговора превращается в три-четыре часа перепечатки, а если отдавать это платному сервису распознавания речи, счёт растёт вместе с количеством выпусков и минут в каждом — и так каждый месяц, пока подкаст жив. Есть третий путь: развернуть открытую систему распознавания речи на собственном сервере и расшифровывать сколько угодно аудио без оплаты за минуту и без отправки записей куда-либо за пределы своей инфраструктуры.
Содержание
Почему расшифровка становится узким местом подкаста
На старте, пока выпусков десять-пятнадцать, ручная расшифровка кажется терпимой рутиной: включил запись, поставил на паузу через каждые несколько предложений, напечатал. Проблема в том, что подкаст, который выходит регулярно, довольно быстро превращается в архив из полусотни, а потом и нескольких сотен часов аудио — и расшифровка из разовой задачи становится постоянной статьёй расходов времени или денег.
Два типичных пути, которыми идут подкастеры, у обоих есть свой потолок:
- Расшифровывать вручную — надёжно по качеству (человек понимает контекст, сленг, имена), но линейно съедает время: чем больше выпусков, тем больше часов уходит на перепечатку, и это время нельзя переложить ни на что, кроме найма человека.
- Отдавать платному сервису автоматической расшифровки — быстро, но каждая минута аудио стоит денег, и при регулярном выпуске это превращается в постоянный счёт, который растёт вместе с архивом. К тому же запись разговора — часто с гостями, которые не давали согласия на передачу голоса третьей стороне, — уезжает на чужие серверы.
Третий путь — собственный сервер с открытой системой распознавания речи. Дальше зашитых затрат на аренду сервера расшифровка ничего не стоит: хоть один выпуск в месяц, хоть три в неделю, хоть весь архив разом.
Что за технология и почему это не то же самое, что облачный сервис
Whisper — открытая модель распознавания речи, вокруг которой за последние годы выросло целое семейство инструментов: сама модель, её более быстрые переработки вроде faster-whisper (тот же принцип распознавания, но оптимизированная под скорость и память реализация) и whisper.cpp (лёгкая версия на C++, которая может работать даже без GPU). Все они решают одну задачу — превращают аудиодорожку в текст с таймкодами — и все они открытые: их можно скачать и развернуть у себя, без обращения к чужому API и без оплаты за минуту.
Ключевое отличие от облачного сервиса не в самом алгоритме распознавания (модели пересекаются или близки по происхождению), а в том, где происходит обработка и кто за неё платит:
- Облачный сервис: вы отправляете аудиофайл на чужой сервер, ждёте результат, платите за каждую минуту обработанного звука. Запись гостя, договорённости на камеру, неудобные паузы — всё это на время обработки лежит на чужой инфраструктуре.
- Свой сервер: аудио никогда не покидает вашу инфраструктуру, обработка идёт на арендованных вами мощностях, а стоимость — это фиксированная плата за сервер независимо от того, сколько минут вы расшифровали в этом месяце.
Важная честная оговорка: открытые модели распознавания речи — не волшебная палочка. Качество расшифровки зависит от чистоты звука, дикции, шума на записи, скорости речи и языка. На типичном подкасте с приличным микрофоном и без сильного шума результат обычно вполне пригоден для черновика субтитров и транскрипта после лёгкой правки, но ожидать идеальной пунктуации, безошибочных имён собственных и стопроцентного разделения перекрывающихся реплик не стоит — как и от любого автоматического распознавания речи вообще, независимо от того, платное оно или открытое.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверКакой сервер нужен под задачу
Распознавание речи — вычислительно тяжёлая задача, но не требует топового железа, если вы согласны, что расшифровка часового выпуска займёт не секунды, а какое-то заметное время. Здесь работает простой компромисс: чем мощнее сервер (особенно если с видеокартой), тем быстрее идёт обработка, но и дороже аренда.
| Сценарий | Конфигурация | Комментарий |
|---|---|---|
| Пара выпусков в месяц, расшифровка не срочная | 4 vCPU, 8 ГБ RAM | Работает без GPU, обработка выпуска займёт дольше, чем сам выпуск длится |
| Регулярный подкаст, еженедельный выпуск | 4-8 vCPU, 16 ГБ RAM | Комфортный запас, чтобы расшифровка не мешала другим задачам на том же сервере |
| Расшифровка архива целиком, много выпусков одновременно | Сервер с GPU | Видеокарта на порядок ускоряет обработку и оправдана, когда нужно быстро прогнать большой архив |
Для одиночного подкастера, который расшифровывает выпуски по мере выхода, вполне достаточно обычного VPS без GPU — вы не привязаны к дедлайну в духе «расшифровка нужна через пять минут», расшифровку можно запустить фоново, пока вы монтируете следующий эпизод. Если же стоит задача единовременно прогнать через распознавание весь накопленный архив, разумно на время арендовать сервер с видеокартой, обработать всё разом и вернуться на обычный VPS для текущих выпусков — благо аренда почасово или помесячно не привязывает вас к конфигурации навсегда.
Диск особо считать не нужно: сами аудиофайлы весят немного (час подкаста в сжатом формате — обычно десятки, не сотни мегабайт), модель распознавания занимает от сотен мегабайт до пары гигабайт в зависимости от выбранного размера, текстовые расшифровки — единицы килобайт на выпуск. 40-80 ГБ диска с запасом хватит надолго.
Установка: разворачиваем faster-whisper на сервере
Дальше — практический путь на Ubuntu 24.04, с faster-whisper как самым практичным вариантом для подкастера: разумный баланс скорости и точности, работает и на CPU, и на GPU без пересборки под конкретное железо.
Обновляем систему и ставим Python и зависимости:
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3 python3-venv python3-pip ffmpeg git
ffmpeg обязателен — именно он на лету конвертирует любой формат аудио (mp3, wav, аудиодорожку из видеофайла) в то, что понимает модель.
Создаём отдельное виртуальное окружение, чтобы не тащить зависимости в системный Python:
python3 -m venv ~/whisper-env
source ~/whisper-env/bin/activate
pip install --upgrade pip
pip install faster-whisper
Первый тестовый прогон на коротком файле:
python3 - <<'EOF'
from faster_whisper import WhisperModel
model = WhisperModel("medium", device="cpu", compute_type="int8")
segments, info = model.transcribe("episode-test.mp3", language="ru")
for segment in segments:
print(f"[{segment.start:.1f}s -> {segment.end:.1f}s] {segment.text}")
EOF
Здесь "medium" — размер модели (у Whisper и его производных есть несколько размеров, от совсем маленьких и быстрых до крупных и точных — на практике для подкаста на русском чаще имеет смысл начинать со среднего размера и смотреть, устраивает ли качество). compute_type="int8" — режим квантования, который снижает нагрузку на CPU за счёт небольшой потери точности; на сервере с GPU вместо device="cpu" указывается device="cuda", а compute_type обычно выбирают "float16".
Если сервер с видеокартой, дополнительно нужны драйверы NVIDIA и CUDA-библиотеки — это отдельный шаг настройки, который стоит планировать заранее, если решаете арендовать GPU-сервер под разовую обработку архива.
Рабочий процесс: от аудиофайла до готового транскрипта
На практике поток для подкастера выглядит так: экспортировали финальный микс эпизода → запустили расшифровку на сервере → получили черновой текст с таймкодами → прогнали через лёгкую правку → выгрузили в нужный формат.
Скрипт, который на выходе сразу даёт файл с субтитрами в формате SRT (годится для YouTube и большинства видеоплеерах) и обычный текстовый транскрипт:
from faster_whisper import WhisperModel
import datetime
model = WhisperModel("medium", device="cpu", compute_type="int8")
segments, info = model.transcribe("episode-042.mp3", language="ru", vad_filter=True)
def to_srt_time(seconds):
td = datetime.timedelta(seconds=seconds)
total_ms = int(td.total_seconds() * 1000)
h, rem = divmod(total_ms, 3600000)
m, rem = divmod(rem, 60000)
s, ms = divmod(rem, 1000)
return f"{h:02}:{m:02}:{s:02},{ms:03}"
with open("episode-042.srt", "w", encoding="utf-8") as srt, \
open("episode-042.txt", "w", encoding="utf-8") as txt:
for i, segment in enumerate(segments, start=1):
srt.write(f"{i}\n{to_srt_time(segment.start)} --> {to_srt_time(segment.end)}\n{segment.text.strip()}\n\n")
txt.write(segment.text.strip() + " ")
Параметр vad_filter=True включает отсечение тишины и пауз перед распознаванием — это заметно сокращает время обработки на выпусках с долгими паузами или музыкальными вставками между сегментами разговора.
Отдельный практический вопрос — разделение реплик по говорящим (диаризация). Сам Whisper и его производные этого не делают — они расшифровывают речь, но не определяют, кто именно говорит. Для подкаста с двумя-тремя участниками это решается отдельным инструментом (например, pyannote.audio), который размечает аудио по говорящим, а дальше результат сопоставляется с текстом расшифровки по таймкодам. Это дополнительный шаг настройки и отдельная модель, и результат разметки по говорящим на практике требует более внимательной проверки, чем сама расшифровка текста — не стоит рассчитывать, что дальше правка не понадобится вовсе.
Обработку выпусков удобно поставить на автомат — например, скрипт, который следит за папкой с новыми аудиофайлами и запускает расшифровку по мере их появления:
#!/bin/bash
WATCH_DIR="/home/podcaster/episodes/new"
DONE_DIR="/home/podcaster/episodes/transcribed"
for file in "$WATCH_DIR"/*.mp3; do
[ -e "$file" ] || continue
name=$(basename "$file" .mp3)
source ~/whisper-env/bin/activate
python3 ~/scripts/transcribe.py "$file" "$DONE_DIR/$name"
mv "$file" "$DONE_DIR/"
done
Такой скрипт можно повесить на cron раз в час — выложили новый эпизод в папку, а через час на сервере уже лежит черновой транскрипт и файл субтитров, без ручного запуска команд.
Что дальше делать с готовым текстом
Готовая расшифровка — не конечная цель сама по себе, а сырьё для нескольких практических задач, которые у подкастера обычно и были причиной расшифровывать выпуски:
- Субтитры для видеоверсии. Файл SRT, полученный на предыдущем шаге, напрямую загружается в YouTube или монтажную программу. Здесь особенно заметна разница между ручной расшифровкой и автоматической: субтитры с точными таймкодами вручную делать долго, а автоматическая расшифровка сразу даёт разметку по времени.
- Публикация транскрипта на сайте подкаста. Текстовая версия выпуска — это дополнительная страница сайта, которую индексируют поисковики, а значит, дополнительный путь, которым на подкаст могут прийти новые слушатели через поиск по теме разговора, а не по названию подкаста.
- Полнотекстовый поиск по архиву выпусков. Когда расшифрованы все выпуски, у вас появляется возможность искать по всему архиву: в каком именно выпуске гость упоминал конкретную книгу или термин. Для этого транскрипты стоит хранить не только как отдельные файлы, но и в едином месте с возможностью поиска — вплоть до простой полнотекстовой базы на том же сервере.
- Цитаты и нарезки для соцсетей. Наличие текста с таймкодами сильно ускоряет поиск удачной фразы для короткого клипа — вместо того чтобы пересматривать весь выпуск, достаточно пролистать текст.
Если параллельно с расшифровкой вы уже думаете о том, где хранить и раздавать сами аудиофайлы эпизодов, у этой задачи тоже есть вариант без ежемесячной платы за хостинг подкаста — свой RSS и свои файлы на сервере закрывают эту часть тем же подходом: один раз настроить, дальше не платить за каждую единицу контента. А если хочется разобраться в самой настройке распознавания речи глубже, чем в рамках одной статьи, — отдельный разбор установки Whisper для распознавания речи на сервере и сравнение faster-whisper и whisper.cpp помогут выбрать конкретную реализацию под свои приоритеты — то ли скорость, то ли минимальные требования к железу.
Похожую задачу, только в другом контексте, решают и другие профессии, которым нужна регулярная расшифровка разговоров, — например, коуч, расшифровывающий записи встреч на своём сервере тем же путём: без передачи чужих голосов на сторону и без счёта за каждую минуту.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Нужна ли видеокарта, чтобы расшифровывать подкаст?
Нет, обязательной она не является. Обычный VPS без GPU справляется с расшифровкой, просто время обработки будет больше, чем на сервере с видеокартой. Для одного-двух выпусков в неделю фоновой обработки без GPU обычно достаточно.
Насколько точной будет расшифровка?
Зависит от качества записи, шума, дикции говорящих и языка — точных цифр здесь никто честно не назовёт, и у разных выпусков одного и того же подкаста результат может заметно отличаться. На чистой студийной записи расшифровка обычно годится как черновик с минимальной правкой, на записи с шумом или наложением голосов правки потребуется больше.
Может ли система сама разделять реплики по говорящим?
Сама модель распознавания речи — нет, она только превращает звук в текст. Разделение по говорящим (диаризация) — отдельная задача и отдельный инструмент, который нужно настраивать дополнительно, а результат разметки требует более внимательной проверки, чем сам текст.
Что если подкаст выходит не на русском языке?
Открытые модели распознавания речи, о которых речь в статье, поддерживают множество языков, включая смешанные выпуски, где участники переходят с одного языка на другой. Качество распознавания при этом может отличаться от языка к языку — рекомендуется протестировать на конкретном материале перед тем, как полагаться на расшифровку как на готовый результат.
Что если аудиофайл в формате, который не mp3?
ffmpeg, который используется под капотом, понимает практически любой распространённый аудио- и видеоформат, включая аудиодорожку, извлечённую напрямую из видеозаписи выпуска — отдельно конвертировать файл перед расшифровкой не нужно.
Можно ли расшифровывать сразу весь накопленный архив, а не по одному выпуску?
Да, скрипт из статьи легко оборачивается в цикл по папке с файлами. Для разовой обработки большого архива стоит на время арендовать более мощный сервер (в идеале с GPU), прогнать всё разом и затем вернуться на обычную конфигурацию для текущих выпусков.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →