OA0 = Omni AI 0
OA0 是一个探索 AI 的论坛
现在注册
已注册用户请  登录
OA0  ›  技能包  ›  podcast-generation:生成 AI 驱动的播客风格音频叙事

podcast-generation:生成 AI 驱动的播客风格音频叙事

 
  firewall ·  2026-02-15 15:40:49 · 3 次点击  · 0 条评论  

名称: podcast-generation
描述: 使用 Azure OpenAI 的 GPT Realtime Mini 模型通过 WebSocket 生成 AI 驱动的播客风格音频叙事。适用于构建文本转语音功能、音频叙事生成、从内容创建播客,或与 Azure OpenAI Realtime API 集成以输出真实音频。涵盖从 React 前端到 Python FastAPI 后端 WebSocket 流式传输的全栈实现。


使用 GPT Realtime Mini 生成播客

利用 Azure OpenAI 的 Realtime API,将文本内容转换为真实的音频叙事。

快速开始

  1. 配置 Realtime API 的环境变量
  2. 通过 WebSocket 连接到 Azure OpenAI Realtime 端点
  3. 发送文本提示,收集 PCM 音频块和转录文本
  4. 将 PCM 转换为 WAV 格式
  5. 将 base64 编码的音频返回给前端进行播放

环境配置

AZURE_OPENAI_AUDIO_API_KEY=你的实时API密钥
AZURE_OPENAI_AUDIO_ENDPOINT=https://你的资源.cognitiveservices.azure.com
AZURE_OPENAI_AUDIO_DEPLOYMENT=gpt-realtime-mini

注意:端点 URL 不应包含 /openai/v1/,只需基础 URL。

核心工作流

后端音频生成

from openai import AsyncOpenAI
import base64

# 将 HTTPS 端点转换为 WebSocket URL
ws_url = endpoint.replace("https://", "wss://") + "/openai/v1"

client = AsyncOpenAI(
    websocket_base_url=ws_url,
    api_key=api_key
)

audio_chunks = []
transcript_parts = []

async with client.realtime.connect(model="gpt-realtime-mini") as conn:
    # 配置为仅输出音频
    await conn.session.update(session={
        "output_modalities": ["audio"],
        "instructions": "你是一个旁白。请自然地说话。"
    })

    # 发送要叙述的文本
    await conn.conversation.item.create(item={
        "type": "message",
        "role": "user",
        "content": [{"type": "input_text", "text": prompt}]
    })

    await conn.response.create()

    # 收集流式事件
    async for event in conn:
        if event.type == "response.output_audio.delta":
            audio_chunks.append(base64.b64decode(event.delta))
        elif event.type == "response.output_audio_transcript.delta":
            transcript_parts.append(event.delta)
        elif event.type == "response.done":
            break

# 将 PCM 转换为 WAV (参考 scripts/pcm_to_wav.py)
pcm_audio = b''.join(audio_chunks)
wav_audio = pcm_to_wav(pcm_audio, sample_rate=24000)

前端音频播放

// 将 base64 编码的 WAV 转换为可播放的 Blob
const base64ToBlob = (base64, mimeType) => {
  const bytes = atob(base64);
  const arr = new Uint8Array(bytes.length);
  for (let i = 0; i < bytes.length; i++) arr[i] = bytes.charCodeAt(i);
  return new Blob([arr], { type: mimeType });
};

const audioBlob = base64ToBlob(response.audio_data, 'audio/wav');
const audioUrl = URL.createObjectURL(audioBlob);
new Audio(audioUrl).play();

语音选项

语音 特点
alloy 中性
echo 温暖
fable 富有表现力
onyx 深沉
nova 友好
shimmer 清晰

Realtime API 事件

  • response.output_audio.delta - Base64 音频块
  • response.output_audio_transcript.delta - 转录文本
  • response.done - 生成完成
  • error - 通过 event.error.message 处理错误

音频格式

  • 输入:文本提示
  • 输出:PCM 音频 (24kHz, 16-bit, 单声道)
  • 存储:Base64 编码的 WAV 格式

参考文档

3 次点击  ∙  0 人收藏  
登录后收藏  
目前尚无回复
0 条回复
About   ·   Help   ·    
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
Developed with Cursor