AI-система транскрибації та сумаризації подкастів під ключ
Вступ
Подкастери витрачають години на ручне розшифрування та підготовку шоунотів. Середній годинний епізод — близько 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 тижнів. Вартість розраховується індивідуально після аналізу ваших записів — з урахуванням тривалості, частоти випусків та необхідних інтеграцій. Отримайте консультацію: зв'яжіться з нами для безкоштовної оцінки проєкту.
Ми гарантуємо стабільну роботу та точність. Оцінимо ваш проєкт і запропонуємо оптимальну архітектуру — пишіть, обговоримо деталі.







