Skip to main content
skill Claude Code GitHub Copilot

podcast-generation · microsoft — Claude Code skill: what it does, how to install

Generates podcast-style audio narratives using Azure OpenAI GPT Realtime Mini over WebSocket. Integrates a FastAPI backend with a React audio player.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add microsoft/skills --skill podcast-generation -a claude-code
Open on GitHub

What podcast-generation does

This skill guides AI coding assistants through implementing text-to-speech audio narratives. The architecture relies on Python's AsyncOpenAI client connecting directly to Azure OpenAI via WebSocket. The backend listens for streaming audio deltas, gathers raw 24kHz 16-bit mono PCM chunks, and converts them to WAV files using scripts/pcm_to_wav.py.

On the frontend, it supplies React code to decode base64 WAV payloads into playable blobs. Six voice profiles are supported: alloy, echo, fable, onyx, nova, and shimmer. Along with audio, the workflow captures text transcript events in parallel.

You need an Azure OpenAI deployment named gpt-realtime-mini, an API key, and an endpoint URL without /openai/v1/. Install this if your stack runs FastAPI with React and needs low-latency spoken narrative generation.

What it helps with

  • stream audio narratives from Azure OpenAI Realtime API over WebSocket
  • convert raw 24kHz PCM chunks to playable WAV format in Python
  • play base64-encoded audio responses inside a React interface
  • capture live transcript deltas alongside voice output

Example prompts for the agent

  • Generate a podcast audio narrative from this markdown note using Azure Realtime
  • Set up a FastAPI WebSocket client for gpt-realtime-mini using the onyx voice
  • Write React code to convert base64 audio chunks into a playable sound

How to install podcast-generation

1Skills CLI (Vercel)

npx skills add microsoft/skills --skill podcast-generation -a claude-code

2Manually: put the files in place

~/.claude/skills/podcast-generation/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/podcast-generation/

From the same set18

The whole set →
Planner microsoft Planner explores requirements and the codebase, then drafts an implementation plan without changing files. Use it when you want to map the work before coding starts. Claude Code GitHub Copilot 406installs frontend-design-review microsoft This skill reviews and creates frontend interfaces with checks for design quality, accessibility, and design-system use. Use it for UI reviews, PRs, and responsive layouts. Claude Code GitHub Copilot 237installs deploy microsoft Executes validated IaC templates against Azure and verifies resource health. Runs automatically at Phase 4 of the azure-app-onboard orchestrator. Claude Code GitHub Copilot 126installs microsoft-docs microsoft microsoft-docs answers questions about Microsoft technologies using official documentation. Use it for tutorials, settings, quotas, limits, and concept explanations. Claude Code GitHub Copilot 118installs cloud-solution-architect microsoft Equips your AI agent with Azure Architecture Center guidance. It helps select architecture styles and validate system designs against Well-Architected Framework pillars. Claude Code GitHub Copilot 117installs mcp-builder microsoft Guide for building Model Context Protocol servers in TypeScript, Python, or C# to connect LLMs with custom APIs. Claude Code GitHub Copilot 108installs skill-creator microsoft A guide for creating and updating AI coding skills, with a focus on Azure SDKs and Microsoft Foundry. Use it when a skill needs a clear structure. Claude Code GitHub Copilot 106installs continual-learning microsoft A skill that teaches AI agents to remember mistakes, tool patterns, and project conventions between sessions. Without it, each run starts fresh; with it, agents compound their knowledge and work more accurately. Claude Code GitHub Copilot 79installs

Other versions of podcast-generation

Similar

spinning-up-deep-rl Alireza Rezvani A deep RL knowledge base for Claude Code, covering algorithms, policy gradients, and silent bugs. Use it when building or checking RL experiments. Claude Code 8installs ai-elements official Vercel Labs This skill guides React AI interfaces built with ai-elements and shadcn/ui. Use it for chat views, streaming responses, tool calls, and reasoning panels. CX Codex GP ChatGPT 7installs ai-gateway official Vercel Labs Guides model routing, failover lists, and caching with Vercel AI Gateway. Useful when managing multiple providers through AI SDK 6. CX Codex GP ChatGPT 6installs v0-dev official Vercel Labs Generates React components with v0, integrates them into Next.js projects via CLI, and automates deployments using the v0 SDK. CX Codex GP ChatGPT 5installs ai-generation-persistence official Vercel Labs Shows how to store LLM outputs with IDs, metadata, and addressable URLs. Useful when an app needs generation or chat history that survives a page refresh. CX Codex GP ChatGPT 5installs ideate official OpenAI This skill turns a Product Design brief into three visual directions. Use it to explore interface variants, remixes, and new product concepts. CX Codex GP ChatGPT 5installs skill-creator official anthropics Creates and refines skills, then tests them with prompts, evaluations, and performance checks. Claude Code Claude.ai 414,180installs writing-for-agents Matt Pocock Guidance for writing skills and agent-facing documents. Use it when editing AGENTS.md, CLAUDE.md, or reference files reached from them. Claude Code 466,719installs

Questions about podcast-generation

How to install podcast-generation in Claude Code?

Run npx skills add microsoft/skills --skill podcast-generation -a claude-code in your project terminal.

What does the podcast-generation skill do?

It provides full-stack implementation patterns for real-time speech generation using Azure OpenAI's Realtime WebSocket endpoint, FastAPI, and React.

Which environment variables are required?

Configure AZURE_OPENAI_AUDIO_API_KEY, AZURE_OPENAI_AUDIO_DEPLOYMENT set to gpt-realtime-mini, and AZURE_OPENAI_AUDIO_ENDPOINT without /openai/v1/.

Source text

SKILL.md · MIT
---
name: podcast-generation
description: Generate AI-powered podcast-style audio narratives using Azure OpenAI's GPT Realtime Mini model via WebSocket. Use when building text-to-speech features, audio narrative generation, podcast creation from content, or integrating with Azure OpenAI Realtime API for real audio output. Covers full-stack implementation from React frontend to Python FastAPI backend with WebSocket streaming.
---

# Podcast Generation with GPT Realtime Mini

Generate real audio narratives from text content using Azure OpenAI's Realtime API.

## Quick Start

1. Configure environment variables for Realtime API
2. Connect via WebSocket to Azure OpenAI Realtime endpoint
3. Send text prompt, collect PCM audio chunks + transcript
4. Convert PCM to WAV format
5. Return base64-encoded audio to frontend for playback

## Environment Configuration

```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
```

**Note**: Endpoint should NOT include `/openai/v1/` - just the base URL.

## Core Workflow

### Backend Audio Generation

```python
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)
```

### Frontend Audio Playback

```javascript
// 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 Options

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

## Realtime API Events

- `response.output_audio.delta` - Base64 audio chunk
- `response.output_audio_transcript.delta` - Transcript text
- `response.done` - Generation complete
- `error` - Handle with `event.error.message`

## Audio Format

- **Input**: Text prompt
- **Output**: PCM audio (24kHz, 16-bit, mono)
- **Storage**: Base64-encoded WAV

## References

- **Full architecture**: See [references/architecture.md](references/architecture.md) for complete stack design
- **Code examples**: See [references/code-examples.md](references/code-examples.md) for production patterns
- **PCM conversion**: Use [scripts/pcm_to_wav.py](scripts/pcm_to_wav.py) for audio format conversion

© microsoft · MIT · microsoft/skills

See also

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor