Розробка AI-генерації голосових подкастів під ключ

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1564 послуг
Розробка AI-генерації голосових подкастів під ключ
Середній
~5 днів
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1361
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    957
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1189
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    646
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    929

За даними Edison Research, подкасти слухають понад 100 млн осіб у США щомісяця, але виробництво якісного аудіоконтенту залишається вузьким місцем для медіа. Стандартний цикл випуску — від написання сценарію до фінального монтажу — займає 4–6 годин на один 5-хвилинний випуск. Наша команда з багаторічним досвідом у NLP та TTS, понад 10 реалізованих проектів для медіа та EdTech, пропонує повністю автоматизований пайплайн, який скорочує цей процес до 3–5 хвилин. За час роботи ми накопичили експертизу, що дозволяє запускати голосові подкасти з нуля за 1–2 тижні. У цій статті — технічні деталі реалізації: від генерації діалогового скрипту за допомогою LLM до фінального мастерингу.

Голосовий подкаст зі статті вручну — 4-6 годин роботи диктора, звукорежисера та редактора. Ми автоматизуємо цей пайплайн за 1-2 тижні: від тексту до готового MP3 з діалогами та музикою. Наш підхід у 20 разів швидший за ручне виробництво та значно знижує витрати — економія на дикторах і звукорежисерах може досягати 70%.

Як ми перетворюємо текст на подкаст?

Спочатку стаття проходить через LLM (GPT-4o або локальна модель) для генерації розмовного скрипту. Ми використовуємо few-shot промпти з прикладами ваших випусків, щоб зберегти стиль. Потім кожен шматок тексту синтезується через OpenAI TTS API (див. TTS) — підтримуємо до 4 різних голосів в одному подкасті, включаючи ведучого та експерта. Фінальна збірка обрізає паузи, додає джингл та нормалізує гучність (LUFS -16).

Чому синтез мови — лише частина задачі?

Консистентність голосу. Якщо в статті пряме звернення до спікера, ми автоматично призначаємо йому постійний голос, щоб слухач не плутався. Управління темпом. Подкаст не повинен звучати як аудіокнига — ми налаштовуємо швидкість вимови ключових термінів (наприклад, абревіатури повільніше). Тривалість. LLM часто генерує занадто довгі репліки — ми постобробляємо скрипт, дроблячи абзаци на сегменти по 40-50 секунд з паузами. Музичне оформлення. Додаємо інтелектуальний підбір фонової музики під настрій розділу (напружена аналітика vs розслаблене інтерв'ю).

Pipeline генерації подкасту

Код нижче показує core-логіку: прийняти статтю, згенерувати скрипт, синтезувати та змонтувати. Це база, яку ми адаптуємо під ваші формати.

from openai import AsyncOpenAI
from pydub import AudioSegment
import io

client = AsyncOpenAI()

class PodcastGenerator:
    def __init__(self):
        self.hosts = {
            "main": {"voice": "alloy", "style": "conversational"},
            "expert": {"voice": "nova", "style": "analytical"},
        }

    async def generate_podcast_from_article(
        self,
        article: str,
        title: str,
        duration_target: int = 5  # минут
    ) -> bytes:
        # 1. Трансформируем статью в разговорный скрипт
        script = await self.create_podcast_script(article, title, duration_target)

        # 2. Синтезируем каждую реплику
        audio_segments = []
        for segment in script["segments"]:
            host = self.hosts[segment["speaker"]]
            audio = await self.synthesize_segment(
                text=segment["text"],
                voice=host["voice"]
            )
            audio_segments.append((audio, segment.get("pause_after_ms", 300)))

        # 3. Монтируем
        return self.assemble_podcast(audio_segments)

    async def create_podcast_script(
        self,
        article: str,
        title: str,
        duration_target: int
    ) -> dict:
        word_count = duration_target * 130  # ~130 слов/мин в подкасте

        response = await client.chat.completions.create(
            model="gpt-4o",
            messages=[{
                "role": "system",
                "content": f"""Преврати статью в разговорный подкаст-скрипт.
                Целевой хронометраж: {duration_target} минут (~{word_count} слов).
                Структура: вступление (ведущий main), основная часть, выводы.
                Стиль: разговорный, без канцелярита, как живой разговор.
                Верни JSON: {{"title": "...", "segments": [{{"speaker": "main|expert", "text": "..."}}]}}"""
            }, {
                "role": "user",
                "content": f"Тема: {title}\n\nСтатья:\n{article[:4000]}"
            }],
            response_format={"type": "json_object"}
        )
        return json.loads(response.choices[0].message.content)

    async def synthesize_segment(self, text: str, voice: str) -> bytes:
        response = await client.audio.speech.create(
            model="tts-1-hd",
            voice=voice,
            input=text,
            response_format="mp3"
        )
        return response.content

    def assemble_podcast(
        self,
        segments: list[tuple[bytes, int]],
        intro_jingle: bytes = None
    ) -> bytes:
        combined = AudioSegment.empty()

        if intro_jingle:
            combined += AudioSegment.from_mp3(io.BytesIO(intro_jingle))

        for audio_bytes, pause_ms in segments:
            segment = AudioSegment.from_mp3(io.BytesIO(audio_bytes))
            combined += segment
            combined += AudioSegment.silent(duration=pause_ms)

        output = io.BytesIO()
        combined.export(output, format="mp3", bitrate="128k")
        return output.getvalue()

Вибір TTS-моделі ми робимо на основі трьох параметрів: натуральність (MOS), p99 latency та вартість токена. Для російськомовних подкастів оптимальним є OpenAI TTS з голосами alloy та nova. Якщо потрібен повний контроль над інтонацією, використовуємо Tortoise-TTS з донавчанням на ваших записах.

Порівняння підходів до генерації подкастів

Критерій Ручне створення Наша автоматизація Конкуренти (ElevenLabs, Play.ht)
Час на випуск 5 хв 4–6 год 3–5 хв 10–15 хв
Діалоги Запис двох дикторів Автоматична зміна голосів Тільки один голос без сценарію
Кастомізація стилю Повна Через few-shot промпти Обмежена (темп, тон)
Музика Окремий монтаж Вбудований підбір Вимагає зовнішнього редактора
Вартість 100 випусків Висока Низька Середня

Що входить у реалізацію?

У проект входить:

  • Генератор скрипту з валідацією фактів (RAG з вашою базою)
  • Синтез мови на TTS-моделі (OpenAI, ElevenLabs або локальна)
  • Інтелектуальний монтаж: паузи, акценти, музика
  • REST API для інтеграції з вашою CMS
  • Документація пайплайну та інструкція з експлуатації
  • Навчання редакторів: як налаштовувати голоси та темп

Опціонально додаємо: динамічне розміщення рекламних блоків, аналітику дослуховуваності, підтримку багатомовності.

Процес роботи: від статті до готового епізоду

  1. Аналітика — аудит вашого контенту, вибір сценарію (один ведучий, діалог, інтерв'ю).
  2. Дизайн скрипту — налаштування few-shot промптів під голос бренду.
  3. Синтез мови — прогін тестових випусків, оцінка натуральності (Mean Opinion Score > 4.0).
  4. Інтеграція — підключення до CMS через API або Webhook.
  5. Запуск — розгортання на вашому сервері або AWS/GCP (SageMaker, Vertex AI).
  6. Підтримка — моніторинг latency, коригування скрипту при зміні тематики.

Терміни та гарантія

  • MVP одного формату (наприклад, дайджест) — 1–2 тижні.
  • Повноцінний продукт з кількома форматами та розкладом — 3–4 тижні.
  • Гарантуємо: середня latency генерації < 2 с на сегмент, відсутність перекосів гучності, 99.9% uptime API (при вашому хостингу).

Ми вже реалізували подібні рішення для 10+ медіа та EdTech-проектів. Якщо хочете оцінити, скільки коштуватиме генерація ваших випусків — пишіть, надішлемо варіанти під ваш обсяг. Щоб отримати демонстрацію роботи пайплайну на ваших даних, зв'яжіться з нами для консультації — обговоримо деталі безкоштовно.

Формати та застосування

Формат Тривалість Застосування
News briefing 2–3 хв Щоденні новини
Article summary 5–10 хв Медіа, блоги
Report digest 10–20 хв B2B, аналітика
Full audio course 30–60 хв EdTech

Розпізнавання та синтез мовлення: перша лінія проблеми

Ми стикаємося із замовником, який має 40 000 годин записів кол-центру й хоче транскрибувати їх за тиждень — це типова задача розпізнавання мови ASR. Штатний хмарний ASR (Google Speech-to-Text) видає WER 28% на галузевій лексиці, а ціна при таких обсягах стає непідйомною. Завдання — знизити WER нижче 10% і перейти на self-hosted інференс. Така ситуація повторюється в кожному другому проєкті, і ми маємо напрацьований патерн рішення.

Типові технічні проблеми та їх усунення

WER не сходиться до потрібної метрики. Найчастіше винна не архітектура, а дані: шумні аудіо без нормалізації рівня (–23 LUFS замість стандарту), змішані мови в одному каналі, акцент, специфічна доменна лексика. Whisper large-v3 з коробки дає WER 8–12% на чистій українській і провалюється до 25–35% на записах з PSTN-артефактами та вузькосмуговим кодеком G.711.

Діаризація ламається при більш ніж двох спікерах. pyannote/speaker-diarization-3.1 працює стабільно при 2–3 мовцях, але DER (Diarization Error Rate) зростає з 6% до 18–22% при 5+ учасниках конференції. Проблема посилюється перехресними репліками: за замовчуванням min_duration_on=0.1 обрізає короткі вставки. Рішення — збільшити min_duration_on до 0.3 та додати overlap detection через pyannote-overlap-detection.

Клонування голосу — латентність чи якість. XTTS v2 (Coqui) дає натуральний голос, але при потоковій генерації stream_chunk_size=20 перший аудіочанк прилітає через 1.4–2.0 с — неприйнятно для інтерактивних сценаріїв. StyleTTS2 та Kokoro швидші, але вимагають точного підготовки референсного аудіо. Ми навчилися вирішувати цю дилему за допомогою гібридного підходу: на старті використовуємо Silero TTS (50–100 мс TTFB), а після отримання перших 3 секунд аудіо перемикаємо на XTTS для кращої натуральності.

Як вибрати ASR-модель під ваші дані?

Модель WER (українська, чистий запис) WER (PSTN, кодек G.711) Швидкість інференсу (фактор real-time) Вартість інференсу (1 год аудіо, A10G)
Whisper large-v3 8–10% 25–35% ~0.1x (55 с на 40 хв) ~$0.50
Whisper medium 12–15% 30–40% ~0.3x ~$0.15
Wav2Vec2 XLSR-53 15–18% 28–35% ~0.8x ~$0.08
Whisper large-v3 + fine-tune 4–7% 10–15% ~0.1x ~$0.50

faster-whisper (CTranslate2) швидший за оригінальний Whisper у 4 рази при однаковому WER. Для продакшену ми завжди використовуємо його.

Практичний приклад: fine-tuning Whisper на доменній лексиці

Фінтех-компанія з 12 000 дзвінків/день. Початковий WER на українській з банківською лексикою — 22% (Google STT). Після fine-tuning whisper-medium на 200 годинах розмічених записів через Hugging Face transformers + Seq2SeqTrainer з learning_rate=1e-5, warmup_steps=500 — WER впав до 7.3%. Інференс на одній A10G через faster-whisper з compute_type=float16 обробляє 40-хвилинний дзвінок за 55 секунд. Підсумкова вартість інференсу — $0.50 за годину аудіо, що в 6 разів дешевше за хмарне рішення. Проєкт виконано за 6 тижнів, включаючи підготовку даних і валідацію.

Техніка fine-tuning описана в офіційній документації Whisper на Hugging Face.

Як донавчити Whisper на доменних даних?

Коли загальна модель не справляється, fine-tuning — перший інструмент. Мінімальний датасет для помітного покращення — 20–30 годин розміченого аудіо в цільовому домені. Розмітку можна отримати через ітеративний процес: прогнати через базову модель → вручну виправити 10–15% помилок → перенавчити → повторити.

training_args = Seq2SeqTrainingArguments(
    per_device_train_batch_size=16,
    gradient_accumulation_steps=2,
    learning_rate=1e-5,
    warmup_steps=500,
    max_steps=5000,
    fp16=True,
    predict_with_generate=True,
    generation_max_length=225,
)

При fine-tuning обов’язково заморожуйте encoder перші 1000 кроків (model.freeze_encoder()), інакше акустичні ознаки роз’їдуться раніше, ніж decoder адаптується до нової лексики.

Синтез мовлення: що обрати для вашого сценарію?

Модель Латентність (TTFB) Натуральність MOS Клонування Мови
XTTS v2 1.2–2.0 с 4.1–4.3 Так, 3 с референсу 17
StyleTTS2 0.3–0.6 с 4.0–4.2 Так, вимагає адаптації en, + fine-tune
Kokoro-82M 0.08–0.15 с 3.7–3.9 Ні en, ja
Silero TTS 0.05–0.1 с 3.4–3.6 Ні ru, en, de, та ін.
Edge-TTS ~0.4 с (cloud) 4.0 Ні 100+

Для інтерактивних ботів з вимогою TTFB < 300 мс — Silero або Kokoro. Для озвучення контенту, де важлива натуральність — XTTS v2 з потоковою віддачею через WebSocket. Ми гарантуємо, що підібрана модель відповідатиме вашим вимогам до латентності та якості — це підтверджено на 50+ реалізованих проєктах.

Наш досвід та гарантії

10+ років досвіду в NLP та speech processing. 50+ успішних проєктів для fintech, telecom, медицини. Сертифіковані моделі (Model Card + bias audit). Ми гарантуємо зниження WER до цільового рівня, інакше повертаємо кошти.

Що входить у роботу з нами?

Клієнт отримує:

  • Документацію: model card, інструкцію з розгортання, API-специфікацію (OpenAPI 3.0)
  • Код: готові скрипти для інференсу, пайплайни обробки (Docker Compose + Kubernetes маніфести за потреби)
  • Доступи: до self-hosted інстансів, графіки моніторингу (Grafana + Prometheus)
  • Навчання: 2 сесії для вашої команди (налаштування, експлуатація, troubleshooting)

Ми також надаємо сертифікат відповідності моделі (Model Card + bias report), що підсилює довіру до рішення.

Процес роботи та терміни

  1. Аудит-сесія – беремо 2–4 години ваших записів, проганяємо через кілька моделей, вимірюємо WER/CER, дивимося на розподіл помилок (лексичні, акустичні, мова). Займає 1–2 дні.
  2. Вибір архітектури – під ваш throughput: один GPU для 1000 хв/день або кластер з балансувальником для 100 000+ хв/день.
  3. Реалізація – Docker-контейнер з FastAPI або Triton Inference Server для батчованого інференсу. Інтеграція з чергою Kafka.
  4. Тестування – A/B тест на продакшн-даних, порівняння з baseline (Google/Azure STT).
  5. Деплой – CI/CD (GitHub Actions + ArgoCD), моніторинг (Grafana + WER/CER алерти).

Терміни:

  • Базова інтеграція готової моделі – 1–2 тижні.
  • Fine-tuning з підготовкою даних та валідацією – 4–8 тижнів.
  • Повна розробка голосового пайплайну (ASR + діаризація + TTS + моніторинг) – 2–4 місяці.

Зв'яжіться з нами для безкоштовної консультації — оцінимо ваш проєкт за 2 дні. Або замовте пілотний fine-tuning на 20 годинах ваших даних і отримайте перші результати вже за 2 тижні.