Вступление
Подкастеры тратят часы на ручную расшифровку и подготовку шоунотов. Средний часовой эпизод — около 10 000 слов текста. Даже с современными ASR-системами Word Error Rate (WER) достигает 20% на записях с несколькими спикерами. Мы используем Whisper large-v3 от OpenAI: модель с 1550 миллионами параметров, обученная на 680 000 часов многоязычных данных. Она снижает WER до 4–8% на чистых студийных записях, а после дообучения (fine-tuning) — до 3–5%. Связка с GPT-4o позволяет за 5–10 минут получить готовые шоуноты с временными метками.
Как Whisper large-v3 справляется с шумом?
Whisper large-v3 превосходит предыдущие версии благодаря архитектуре encoder-decoder с вниманием на 128 токенов контекста. На зашумлённых записях — уличный шум, эхо, перекрёстные диалоги — модель устойчивее за счёт обучения на синтетических шумах. Для специфических акцентов или радиопомех мы применяем fine-tuning: дообучаем модель на 1–2 часах ваших данных с использованием LoRA-адаптеров. Это поднимает точность на 10–15% без переобучения всей модели.
Почему стоит автоматизировать суммаризацию?
Ручное написание шоунотов для одного подкаста может занимать 2–3 часа. GPT-4o с правильным chain-of-thought промптом справляется за 30 секунд, выделяя до 10 ключевых тем и генерируя краткое описание. Сокращение затрат на редактуру — до 80% по сравнению с наймом копирайтера. При этом качество не уступает: модель учитывает временные метки и тематические переходы.
Сравнение моделей транскрибации
| Модель | WER (чистое аудио) | Скорость (1 час на GPU) | Особенности |
|---|---|---|---|
| Whisper large-v3 | 4–8% | 3–4 мин | Лучшая точность, open-source |
| Google Speech-to-Text | 10–15% | 2–3 мин | Хорошая интеграция с GCP |
| Wav2Vec 2.0 | 12–18% | 1–2 мин | Требует дообучения под язык |
Whisper large-v3 в два раза точнее Wav2Vec 2.0 по WER и обрабатывает аудио длиной до 12 часов без потери контекста. В отличие от Google API, модель можно развернуть локально — полный контроль над данными и конфиденциальность.
Детальный пайплайн обработки
- Загрузка аудиофайла или RSS-ленты. Для RSS мониторинг настроен на опрос фида каждые 6 часов.
- Предобработка: нормализация громкости (LUFS -16) и спектральное шумоподавление через библиотеку noisereduce.
- Транскрибация Whisper large-v3 с параметрами language="ru", word_timestamps=True.
- Диаризация спикеров через pyannote-audio: разделение на голоса, привязка к сегментам.
- Генерация шоунотов через GPT-4o с промптом, содержащим транскрипт (до 6000 токенов) и временные метки.
- Формирование RSS-фида с новыми элементами и публикация через API вашей CMS.
import whisper
from openai import AsyncOpenAI
async def transcribe_and_summarize_podcast(audio_path: str) -> dict:
# Транскрибация
model = whisper.load_model("large-v3")
result = model.transcribe(
audio_path,
language="ru",
task="transcribe",
verbose=False,
word_timestamps=True
)
transcript = result["text"]
segments = result["segments"] # [{start, end, text}, ...]
# Генерация shownotes через GPT-4o
client = AsyncOpenAI()
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": "Создай shownotes для подкаста: краткое описание эпизода (3-5 предложений), ключевые темы списком, временные метки для основных тем в формате MM:SS."
}, {
"role": "user",
"content": transcript[:6000]
}]
)
# Временные метки ключевых тем
chapters = extract_chapters(segments)
return {
"transcript": transcript,
"shownotes": response.choices[0].message.content,
"chapters": chapters,
"duration_sec": segments[-1]["end"] if segments else 0
}
def extract_chapters(segments: list) -> list[dict]:
"""Выделяем тематические блоки по паузам и семантике"""
chapters = []
# Ищем паузы > 3 секунды как границы глав
for i in range(1, len(segments)):
gap = segments[i]["start"] - segments[i-1]["end"]
if gap > 3.0:
chapters.append({
"timestamp": int(segments[i]["start"]),
"text": segments[i]["text"][:80]
})
return chapters
Интеграция с RSS-лентой
Для подкастов с регулярными выпусками настраиваем RSS-мониторинг. Новый эпизод автоматически скачивается, транскрибируется, и шоуноты публикуются на сайте.
import feedparser
import httpx
async def process_podcast_feed(rss_url: str) -> list[dict]:
feed = feedparser.parse(rss_url)
results = []
for entry in feed.entries[:5]: # последние 5 эпизодов
audio_url = next(
(enc.href for enc in entry.enclosures if enc.type.startswith("audio")),
None
)
if not audio_url:
continue
async with httpx.AsyncClient() as client:
audio_data = await client.get(audio_url)
with open(f"/tmp/{entry.id}.mp3", "wb") as f:
f.write(audio_data.content)
result = await transcribe_and_summarize_podcast(f"/tmp/{entry.id}.mp3")
result["title"] = entry.title
result["published"] = entry.published
results.append(result)
return results
Что вы получаете?
Полный пайплайн транскрибации и суммаризации, готовый к продакшену. Включены: анализ вашего контента, выбор оптимальной модели (Whisper large-v3 или fine-tuned версия), настройка диаризации, интеграция с вашим сайтом через RSS или API, документация в репозитории, обучение команды. Поддержка после запуска — 1 месяц с гарантией стабильного WER не выше 10% после адаптации. Опыт команды — более 7 лет в NLP и 50+ реализованных проектов по обработке аудио.
Типичные ошибки и как их избежать
Низкое качество записи — главная причина высокого WER. Используйте студийные микрофоны и избегайте реверберации. Для длинных эпизодов (более 2 часов) контекстное окно GPT-4o ограничено 128K токенов, поэтому мы разбиваем аудио на части по 30 минут с перекрытием в 5 секунд для склейки. Алгоритм выделения глав по паузам требует калибровки: мы настраиваем порог тишины под ваш темп речи — от 2 до 4 секунд.
Сроки и стоимость
Разработка типового пайплайна занимает от 1 до 4 недель. Стоимость рассчитывается индивидуально после анализа ваших записей — учётом длительности, частоты выпусков и необходимых интеграций. Получите консультацию: свяжитесь с нами для бесплатной оценки проекта.
Мы гарантируем стабильную работу и точность. Оценим ваш проект и предложим оптимальную архитектуру — пишите, обсудим детали.







