podcast-generation

Générez des récits audio au format podcast alimentés par l'IA grâce au modèle GPT Realtime Mini d'Azure OpenAI via WebSocket. À utiliser pour créer des fonctionnalités text-to-speech, générer des récits audio, produire des podcasts à partir de contenu existant, ou intégrer l'API Azure OpenAI Realtime pour une sortie audio réelle. Couvre l'implémentation full-stack du frontend React au backend Python FastAPI avec streaming WebSocket.

npx skills add https://github.com/microsoft/skills --skill podcast-generation

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

  1. Configurer les variables d'environnement pour l'API Realtime
  2. Se connecter via WebSocket à l'endpoint Realtime d'Azure OpenAI
  3. Envoyer un prompt textuel, collecter les chunks audio PCM + transcription
  4. Convertir le PCM au format WAV
  5. 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 base64
  • response.output_audio_transcript.delta - Texte de transcription
  • response.done - Génération terminée
  • error - Gérer avec event.error.message

Format audio

  • Entrée : Prompt textuel
  • Sortie : Audio PCM (24 kHz, 16-bit, mono)
  • Stockage : WAV encodé en base64

Références

Skills similaires