经 Azure OpenAI Realtime API(gpt-realtime-mini)把文本叙事实时合成为播客级人声:WebSocket 连接 → 下发文稿 → 流式收 PCM 音频块与逐字稿 → 拼接转 WAV → base64 回传前端播放。合成全在 Azure 端完成,本地只发提示、收音频流。
何时使用
适用:
- 把一段文稿/脚本/文章转成自然朗读的播客或口播音频。
- 需要边生成边拿逐字稿(音画对齐、字幕)。
- 用户说「文本生成播客」「给这段文稿配音」「文字转语音」「Realtime 语音合成」等。
不该用(负边界):
- 无 Azure 凭据(缺
AZURE_OPENAI_AUDIO_API_KEY/ENDPOINT/DEPLOYMENT):所有调用不可用,先让用户自行配置,切勿由你读写 key。 - 要求精确逐字音色克隆 / 指定真人声纹 → 用 ElevenLabs 等专用克隆服务,不走本流程。
- 长篇离线批量 TTS(无需流式、追求最低单价)→ 回退批式 TTS API;Realtime 偏交互与低延迟,长音频成本与稳定性不占优。
步骤
- 配好环境变量(见下)。注意
ENDPOINT只填基础域名,不要带/openai/v1/。 - 把 HTTPS 端点转成 WebSocket:
https://→wss://,并在末尾补/openai/v1。 client.realtime.connect(model="gpt-realtime-mini")建连。session.update设output_modalities=["audio"]与instructions(旁白人设/语气);如需指定音色,在 session 里设voice。conversation.item.create塞入待朗读文本(input_text),再response.create()触发生成。- 流式消费事件:
response.output_audio.delta(base64 PCM 块,解码累积)、response.output_audio_transcript.delta(逐字稿)、response.done(结束跳出)、error(读event.error.message)。 - 拼接 PCM → 转 WAV(24kHz / 16-bit / mono)→ base64 回前端,前端转 Blob 播放。
指令
环境配置(.env):
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
音色可选(session 的 voice):alloy(中性) / echo(温暖) / fable(富表现) / onyx(低沉) / nova(亲和) / shimmer(清亮)。
关键事件:response.output_audio.delta(音频块)、response.output_audio_transcript.delta(文本)、response.done(完成)、error(错误)。
音频格式:输入=文本;输出=PCM(24kHz、16-bit、单声道);存储=base64 WAV。
示例
后端生成(Python,关键约束已内联):
from openai import AsyncOpenAI
import base64
# HTTPS 端点转 WebSocket URL(务必补 /openai/v1)
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": "You are a narrator. Speak naturally.",
})
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(24kHz 采样率)
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 url = URL.createObjectURL(base64ToBlob(response.audio_data, "audio/wav"));
new Audio(url).play();
注意事项
- 端点别带
/openai/v1/,WebSocket URL 才在末尾补/openai/v1;两处弄反是最常见接不上的原因。 - 凭据由用户配置,你不要读写 key。
- 流式事件要逐类处理,
response.done才算完整,error必读event.error.message。 - PCM 转 WAV 务必对齐 24kHz / 16-bit / mono,参数错会变速变调或噪声。
- Realtime 面向低延迟交互,长音频成本/稳定性不占优;纯批量长文 TTS 另选方案。
- 精细剪辑、混音、配乐不是本流程的活,交后续音频编辑环节。
互见
- related:
fal-ai-media-generation—— 同为 AI 媒体生成,覆盖图像/视频/音频多模态,可作通用 TTS 回退或图视配套。 - related:
minimax-media-cli—— 另一条媒体生成命令行通道,音视频生成互为备选。 - combines_with:
demo-video-generator—— 本技能产出口播音轨 + 演示视频渲染,组合成带旁白的成片。
采编自 sickn33/antigravity-awesome-skills(MIT)。