让 AI 用真实声音朗读文本内容

利用 Azure OpenAI 的 Realtime API,将文字内容直接转化为自然流畅的真实语音。本技能演示了如何通过 WebSocket 连接,收集音频片段并将其转换为可播放的 WAV 格式,适合制作播客或旁白。

为什么需要这个技能

传统的文本转语音(TTS)往往带有机械感。借助 GPT Realtime Mini 模型,AI 能模拟更自然的语气和停顿,生成接近真人讲述的音频。

这对于需要快速制作有声书章节、播客片段,或者为视频内容生成高质量旁白的开发者来说,是极佳的解决方案。无需繁琐的录音设备,只要有一段文字,AI 即可化身专业主播。

适用场景

  • 快速生成课程介绍、播客开场白或视频旁白。
  • 将文档中的技术说明转化为易于理解的语音内容。
  • 为有声读物或儿童故事提供不同的角色配音(通过调整指令)。

核心工作流

1. 配置环境

首先设置 Azure OpenAI 的 API 密钥和资源端点。注意端点 URL 不应包含 /openai/v1/ 前缀。

AZURE_OPENAI_AUDIO_API_KEY=your_realtime_api_key
AZURE_OPENAI_AUDIO_ENDPOINT=https://your-resource.cognitiveservices.azure.com
AZURE_OPENAI_AUDIO_DEPLOYMENT=gpt-realtime-mini

2. 后端音频生成

使用 Python 连接 WebSocket,配置模型仅输出音频,并发送文本提示词。系统会流式传输 PCM 音频块和字幕片段。

from openai import AsyncOpenAI
import base64

# Convert HTTPS endpoint to 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:
    # Configure for audio-only output
    await conn.session.update(session={
        "output_modalities": ["audio"],
        "instructions": "You are a narrator. Speak naturally."
    })
    
    # Send text to narrate
    await conn.conversation.item.create(item={
        "type": "message",
        "role": "user",
        "content": [{"type": "input_text", "text": prompt}]
    })
    
    await conn.response.create()
    
    # Collect streaming events
    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

# Convert PCM to WAV (see scripts/pcm_to_wav.py)
pcm_audio = b''.join(audio_chunks)
wav_audio = pcm_to_wav(pcm_audio, sample_rate=24000)

3. 前端音频播放

在网页端,将接收到的 base64 编码的 WAV 数据转换为 Blob 对象并播放。

// Convert base64 WAV to playable 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();

语音选项

你可以尝试不同的语音模型来获取不同的声音特质:

Voice Character
alloy Neutral
echo Warm
fable Expressive
onyx Deep
nova Friendly
shimmer Clear

Realtime API 事件说明

  • response.output_audio.delta: 接收到一段 PCM 音频数据。
  • response.output_audio_transcript.delta: 接收到对应的转录文本。
  • response.done: 生成完成。
  • error: 发生错误时的事件。

音频格式说明

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

下载和安装

下载 podcast-generation 中文版 Skill ZIP

你可能还需要

暂无推荐