Génération de Podcasts avec GPT Realtime Mini
Générer des narratives audio réelles à partir de contenu textuel en utilisant l'API Realtime d'Azure OpenAI.
Démarrage rapide
- Configurer les variables d'environnement pour l'API Realtime
- Se connecter via WebSocket à l'endpoint Realtime d'Azure OpenAI
- Envoyer un prompt textuel, collecter les chunks audio PCM + transcription
- Convertir le PCM au format WAV
- Retourner l'audio encodé en base64 au frontend pour la lecture
Configuration de l'environnement
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
Note : L'endpoint ne doit PAS inclure /openai/v1/ - juste l'URL de base.
Flux de travail principal
Génération d'audio backend
from openai import AsyncOpenAI
import base64
# Convertir l'endpoint HTTPS en URL WebSocket
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:
# Configurer pour une sortie audio uniquement
await conn.session.update(session={
"output_modalities": ["audio"],
"instructions": "You are a narrator. Speak naturally."
})
# Envoyer le texte à narrer
await conn.conversation.item.create(item={
"type": "message",
"role": "user",
"content": [{"type": "input_text", "text": prompt}]
})
await conn.response.create()
# Collecter les événements streaming
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
# Convertir PCM en WAV (voir scripts/pcm_to_wav.py)
pcm_audio = b''.join(audio_chunks)
wav_audio = pcm_to_wav(pcm_audio, sample_rate=24000)
Lecture d'audio frontend
// Convertir WAV base64 en blob jouable
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();
Options de voix
| Voix | Caractère |
|---|---|
| alloy | Neutre |
| echo | Chaleureuse |
| fable | Expressive |
| onyx | Grave |
| nova | Amicale |
| shimmer | Claire |
Événements Realtime API
response.output_audio.delta- Chunk audio en base64response.output_audio_transcript.delta- Texte de transcriptionresponse.done- Génération terminéeerror- Gérer avecevent.error.message
Format audio
- Entrée : Prompt textuel
- Sortie : Audio PCM (24 kHz, 16-bit, mono)
- Stockage : WAV encodé en base64
Références
- Architecture complète : Voir references/architecture.md pour la conception complète de la stack
- Exemples de code : Voir references/code-examples.md pour les motifs de production
- Conversion PCM : Utiliser scripts/pcm_to_wav.py pour la conversion de format audio