Учебник

Whisper: субтитры для видео и расшифровка переговоров

Ваши менеджеры тратят часы на ручную расшифровку записей встреч, а субтитры к видео заказывают фрилансерам за деньги. Whisper от OpenAI решает обе задачи бесплатно или за копейки: расшифровка аудио, готовые субтитры, поддержка русского и украинского. Без программиста - ставится за 10 минут. Разберём на примере стройфирмы: как превратить записи созвонов в протоколы и субтитры к рекламным роликам.

Макс Космов··7 мин чтения

У ваших менеджеров уходит по 2-3 часа на ручную расшифровку записей переговоров, а субтитры к рекламным роликам вы заказываете фрилансерам за 2000 рублей за 10 минут видео. И то, и другое можно автоматизировать за час без программиста. Whisper от OpenAI - open-source модель распознавания речи. Работает офлайн, поддерживает 100+ языков, выдаёт готовые субтитры в .srt. Для бизнеса это значит: протоколы встреч, субтитры к видео и перевод интервью без платных подписок.

Разберём на примере стройфирмы (пример, не реальный кейс автора): у вас есть записи созвонов с подрядчиками и рекламные ролики о ремонтах. Whisper превратит их в текстовые протоколы и субтитры за вечер.

Whisper 2026: модели и когда что выбирать

OpenAI выпустила несколько поколений Whisper. Актуальный набор на 2026 год:

large-v3: самая точная модель. Размер 1.5 ГБ. На видеокарте (RTX 3080 и выше) обрабатывает 1 час аудио за 10-15 минут. На процессоре - 2-3 часа. Рекомендуется для финального контента.

large-v3-turbo: ускоренная версия. Размер 0.8 ГБ. На видеокарте - около 4-5 минут на час аудио. Точность чуть хуже large-v3, но скорость вдвое выше. Оптимальный выбор при наличии видеокарты.

Turbo (whisper-large-v3-turbo): не путать с Turbo API-моделью. Это открытая модель ~800 MB, 8x быстрее large-v3 при 95% точности на чистом аудио. Хороший выбор для пакетной обработки.

medium: 769 MB, приемлемое качество на хорошем аудио, заметно хуже на акцентах и шуме. Для машин без видеокарты - компромисс между скоростью и качеством.

small / base / tiny: для реального использования не рекомендуются - слишком много ошибок на сложном материале.

Правило выбора: есть видеокарта с 8+ ГБ памяти - large-v3-turbo. Видеокарта с 4-6 ГБ - medium или Turbo. Только процессор и нужна скорость - medium через API (whisper-1).

Локальный запуск: установка и первая транскрипция

Для предпринимателя это звучит страшно, но делается за 10 минут. Устанавливаем Whisper и, при наличии видеокарты NVIDIA, добавляем поддержку CUDA для ускорения:

pip install openai-whisper

Torch нужен как зависимость. Если нет CUDA - установится CPU версия. С CUDA:

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install openai-whisper

Запускаем транскрипцию одной командой в терминале. Параметр --language ускоряет обработку и повышает точность:

whisper audio.mp3 --model large-v3-turbo --language Russian

Whisper скачивает модель при первом запуске (~800 МБ для large-v3-turbo, ~1.5 ГБ для large-v3). Кешируется в папке .cache/whisper/.

Вывод по умолчанию: создаёт файлы рядом с аудио:

  • audio.txt - чистый текст
  • audio.srt - субтитры с временными метками
  • audio.vtt - WebVTT формат
  • audio.json - JSON с временными метками для каждого сегмента
  • audio.tsv - TSV с временными метками

Параметр language: без него Whisper тратит несколько секунд на определение языка. На коротких записях иногда ошибается. Указывайте --language Russian явно - это быстрее и точнее.

Параметр task: по умолчанию transcribe - транскрипция на исходном языке. Режим --task translate переводит напрямую на английский. Удобно для английских субтитров из русского видео.

OpenAI API (whisper-1): загрузка аудио и временные метки

OpenAI API - вариант без локальной установки и без требований к железу. Модель whisper-1 через API.

Стоимость: $0.006 за минуту аудио. 1 час = $0.36. Дешевле большинства конкурентов.

Следующий пример отправляет аудиофайл в OpenAI Whisper API и получает текст с временными метками по каждому сегменту:

from openai import OpenAI

client = OpenAI(api_key="ваш_ключ")

with open("audio.mp3", "rb") as audio_file:
 transcript = client.audio.transcriptions.create(
 model="whisper-1",
 file=audio_file,
 language="ru",
 response_format="verbose_json",
 timestamp_granularities=["segment"]
 )

print(transcript.text)
for segment in transcript.segments:
 print(f"{segment.start:.2f} - {segment.end:.2f}: {segment.text}")

response_format варианты:

  • text - только текст, строкой
  • json - текст в JSON
  • verbose_json - текст + сегменты с временными метками
  • srt - готовые субтитры в SRT формате
  • vtt - готовые субтитры в VTT формате

Ограничение файла: максимум 25 MB на запрос. Для длинных файлов - нарезка на части (см. раздел про длинные файлы).

timestamp_granularities: ["segment"] даёт временные метки на уровне фраз (~5-15 секунд). ["word"] - на уровне каждого слова. Word-level нужен для точного кариоке, highlight-эффектов в видео, поиска по времени в расшифровке.

100+ языков: точность по русскому и украинскому

Whisper обучен на 680 000 часов аудио на 100+ языках. Качество распознавания сильно варьируется.

Доля ошибок (WER) по языкам (приблизительно, large-v3):

  • Английский (чистый): 3-5% ошибок
  • Русский (чистый): 5-8% ошибок
  • Украинский (чистый): 7-12% ошибок
  • Немецкий: 4-7% ошибок
  • Испанский: 3-6% ошибок

На 100 слов русской речи с хорошим микрофоном ожидайте 5-8 ошибок. С акцентом, шумом или специфической лексикой - хуже.

Почему явный language= помогает: без параметра Whisper анализирует первую минуту для определения языка. Если есть вставки на другом языке - модель может переключиться. Параметр language='ru' принудительно задаёт язык.

Особенности русского: Whisper хорошо справляется с литературным языком. Хуже - с жаргоном, аббревиатурами (ООО, ИП, API) и сложными именами. Числа и даты записывает словами, а не цифрами - для большинства задач это норма.

Украинский: large-v3 заметно лучше чем предыдущие версии, но всё ещё ниже русского по точности. Для критичного контента рекомендуется ручная проверка.

Работа с длинными файлами: разбивка на фрагменты

API whisper-1 принимает файлы до 25 MB. Локальный Whisper формально не ограничен, но на файлах от 4 часов возможны проблемы с памятью.

Следующий код разбивает длинный аудиофайл на части по 10 минут для отправки в API:

from pydub import AudioSegment
import math

audio = AudioSegment.from_mp3("long_podcast.mp3")
chunk_duration = 10 * 60 * 1000 # 10 минут в миллисекундах
chunks_count = math.ceil(len(audio) / chunk_duration)

for i in range(chunks_count):
 start = i * chunk_duration
 end = min((i + 1) * chunk_duration, len(audio))
 chunk = audio[start:end]
 chunk.export(f"chunk_{i:03d}.mp3", format="mp3")

Контекст между фрагментами: при разбивке модель не знает, что было в предыдущем фрагменте. Это ухудшает транскрипцию на границах. Параметр prompt позволяет передать последние 224 токена предыдущего фрагмента:

previous_text = "" # накапливаем текст предыдущих фрагментов

for chunk_file in chunk_files:
 with open(chunk_file, "rb") as f:
 result = client.audio.transcriptions.create(
 model="whisper-1",
 file=f,
 language="ru",
 prompt=previous_text[-500:] # последние ~200 токенов
 )
 previous_text += result.text

Стратегия перекрытия: делайте фрагменты с перекрытием 5-10 секунд, затем удалите дублирующийся текст. Это лучше сохраняет границы фраз.

Экспорт форматов: .srt, .vtt, .json и интеграция

.srt формат (SubRip Text) - самый распространённый формат субтитров:

1
00:00:01,000 --> 00:00:04,500
Первая строка субтитров.

2
00:00:04,600 --> 00:00:08,200
Вторая строка субтитров.

Импорт в инструменты монтажа:

  • DaVinci Resolve: Timeline - Import Subtitles - выбрать .srt
  • CapCut: Text - Auto Captions (встроенный Whisper) или импорт .srt
  • Descript: загружает аудио/видео, транскрибирует автоматически (на базе Whisper), экспортирует .srt
  • Premiere Pro: Captions - Import Captions From File
  • Final Cut Pro: Captions - Import Captions

.vtt формат (WebVTT) - для веб-плееров. Формат похож на .srt с минимальными отличиями.

.json с временными метками - для собственной обработки: поиск по времени, создание кликабельных транскриптов, аналитика.

Процесс создания субтитров: запись -> Whisper (локально или API) -> .srt -> проверка в текстовом редакторе (5-10 минут на 30-минутный ролик) -> импорт в монтажную программу.

Python-скрипт: пакетная транскрипция папки

Скрипт ниже обходит папку с аудиофайлами и сохраняет транскрипты в папку transcripts/. Запускается раз в день для автоматической обработки записей - например, всех созвонов за день:

import whisper
import os
from pathlib import Path

model = whisper.load_model("large-v3-turbo")

audio_extensions = {".mp3", ".wav", ".m4a", ".flac", ".ogg", ".mp4"}
input_dir = Path("./audio_files")
output_dir = Path("./transcripts")
output_dir.mkdir(exist_ok=True)

for audio_file in input_dir.iterdir():
 if audio_file.suffix.lower() not in audio_extensions:
 continue

 print(f"Транскрибирую: {audio_file.name}")

 result = model.transcribe(
 str(audio_file),
 language="ru",
 verbose=False
 )

 output_path = output_dir / (audio_file.stem + ".txt")
 with open(output_path, "w", encoding="utf-8") as f:
 f.write(result["text"])

 srt_path = output_dir / (audio_file.stem + ".srt")
 # сохранить SRT через сегменты result["segments"]

 print(f"Готово: {output_path.name}")

print("Все файлы обработаны")

Скрипт обрабатывает все аудио и видеофайлы из папки audio_files/, сохраняет .txt транскрипты в папку transcripts/. Запускается раз в день для автоматической обработки записей.

Ограничения и постобработка: имена, числа, термины

Whisper не идеален и требует понимания ограничений.

Имена собственные: транскрибируются фонетически, часто неверно. "Александр Новоселов" может стать "Александр Новосёлов" или "Александр Новоселёв". Решение: словарь замен (Python str.replace или regex) для часто встречающихся имён в конкретном проекте.

Числа: Whisper пишет числа словами - "сто двадцать три" вместо "123". Для медицинских, финансовых транскриптов где нужны цифры - постобработка через regex или специализированный нормализатор.

Технические термины: аббревиатуры типа API, SQL, CUDA распознаются непредсказуемо. Передача этих терминов в параметр prompt улучшает ситуацию: Через параметр initial_prompt передаём технические термины - это помогает Whisper правильно их распознавать:

result = model.transcribe(
 "tech_interview.mp3",
 language="ru",
 initial_prompt="Технические термины: API, SQL, Python, GPU, CUDA, Docker, Kubernetes"
)

Пунктуация: Whisper расставляет базовую пунктуацию, но длинные монологи без пауз дают мало знаков. Для красивого транскрипта - постобработка через LLM (Claude, GPT-4) с промптом: "Расставь пунктуацию и разбей на абзацы".

Стратегия проверки: для важных материалов (интервью для публикации, юридические расшифровки) - прослушать аудио параллельно с чтением транскрипта. Скорость проверки: 30 минут аудио = 15-20 минут проверки, если транскрипт хороший.

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

Whisper работает полностью офлайн или нужен интернет?

Локальная установка через pip - полностью офлайн после скачивания модели. Интернет нужен один раз при первом запуске для загрузки весов модели (800 МБ - 1.5 ГБ). После этого - никакого интернета. OpenAI API (whisper-1) - только онлайн, $0.006/мин.

Какая видеокарта нужна для нормальной скорости large-v3?

RTX 3080 (10 ГБ VRAM) - комфортная скорость, 10-15 минут на час аудио. RTX 3060 (12 ГБ) - аналогично. RTX 4070 и выше - 5-8 минут на час. 4 ГБ VRAM - работает с medium или large-v3-turbo с некоторым swap. Без видеокарты на процессоре (i7/i9) - 2-3 часа на час аудио, но это рабочий вариант для нечастой обработки.

Whisper точнее транскрибирует русский чем Yandex SpeechKit?

Yandex SpeechKit точнее на бытовом русском языке и профессиональных терминах, потому что специально оптимизирован. Whisper large-v3 сопоставим на чистых записях, хуже на диалектах и профессиональном жаргоне. Для русских подкастов с нормальной дикцией - разница минимальна.

Как передать контекст предыдущего сегмента для точного распознавания?

Параметр prompt в API или локальном whisper.transcribe(). Передаётся последние 200-500 символов предыдущего сегмента. Whisper использует это для поддержания согласованности: правильно пишет имена и термины, которые уже встречались в предыдущих фрагментах. Ограничение: prompt принимает до 224 токенов.

Можно ли транскрибировать видео напрямую без извлечения аудио?

Да. Whisper принимает MP4 и другие видеоформаты напрямую через CLI (whisper video.mp4) и через API (поддерживаются mp4, mpeg, mpga, m4a, wav, webm). Локально через Python - нужно ffmpeg в системе, но Whisper использует его автоматически. Извлекать аудио отдельно не нужно.

Что дальше

Это последняя статья блока «Звук, голос, музыка». Весь путь: от обзора AI-аудио экосистемы через ElevenLabs, Suno, Udio, дубляж и облачные API - до Whisper.

Другие разделы учебника: AI Компас - t.me/kosmoslab_ai, полный каталог - ai-uchebnik.ru.

AI Компас (t.me/kosmoslab_ai) - канал для предпринимателей в РФ и СНГ, которые применяют AI в своём бизнесе без программиста. Разбираем инструменты и схемы - без курсов и теории.