Реализация AI-генерации голосовых подкастов
AI-генерация подкастов превращает текстовый контент (статьи, отчёты, новости) в готовые аудиовыпуски с натуральной речью и опциональным музыкальным оформлением. Подходит для изданий, корпоративных коммуникаций, образовательных платформ.
Pipeline генерации подкаста
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()
Форматы и применение
| Формат | Продолжительность | Применение |
|---|---|---|
| News briefing | 2–3 мин | Ежедневные новости |
| Article summary | 5–10 мин | Медиа, блоги |
| Report digest | 10–20 мин | B2B, аналитика |
| Full audio course | 30–60 мин | EdTech |
Сроки: генератор подкастов из статей — 1–2 недели. Автоматизированный pipeline с расписанием — 3–4 недели.







