An AI-powered podcast generation library that creates conversational audio content from text-based sources. This pip-installable package processes documents, generates structured outlines, creates natural dialogue transcripts, and converts them into high-quality audio podcasts using LangGraph workflow orchestration.
Listen to a real podcast generated with this tool - a 4-person debate on the Situational Awareness Paper. Includes my own cloned voice π
Generated using the diverse_panel episode profile with 4 AI experts discussing the nuances of artificial general intelligence and situational awareness.
And here is a one-speaker version of it, like your real dedicated teacher.
# Library only (programmatic use)
uv add podcast-creator
# or pip install podcast-creator
# Full installation with web UI
uv add podcast-creator --extra ui
# or pip install podcast-creator[ui]
# Or install from source
git clone <repository-url>
cd podcast-creator
uv sync
# Don't have uv? Install it with:
# curl -LsSf https://astral.sh/uv/install.sh | sh
# or
# pip install uvInstallation Options:
- Library only:
pip install podcast-creator- For programmatic use without web interface - With UI:
pip install podcast-creator[ui]- Includes Streamlit web interface for visual management
# Copy the example environment file
cp .env.example .env
# Edit .env and add your API keys:
# - OpenAI API key for LLM models
# - ElevenLabs API key for high-quality TTS
# - Other provider keys as needed# Create templates and configuration files
podcast-creator init
# This creates:
# - prompts/podcast/outline.jinja
# - prompts/podcast/transcript.jinja
# - speakers_config.json
# - episodes_config.json
# - example_usage.py# Launch the Streamlit web interface
podcast-creator ui
# Custom port/host
podcast-creator ui --port 8080 --host 0.0.0.0
# The UI provides:
# - Visual profile management
# - Multi-content podcast generation
# - Episode library with playback
# - Import/export functionalityimport asyncio
from podcast_creator import create_podcast
async def main():
# One-liner podcast creation with episode profiles!
result = await create_podcast(
content="Your content here...",
episode_profile="tech_discussion", # π― Pre-configured settings
episode_name="my_podcast",
output_dir="output/my_podcast"
)
print(f"β
Podcast created: {result['final_output_file_path']}")
asyncio.run(main())import asyncio
from podcast_creator import create_podcast
async def main():
result = await create_podcast(
content="Your content here...",
briefing="Create an engaging discussion about...",
episode_name="my_podcast",
output_dir="output/my_podcast",
speaker_config="ai_researchers"
)
print(f"β
Podcast created: {result['final_output_file_path']}")
asyncio.run(main())Episode Profiles are pre-configured sets of podcast generation parameters that enable one-liner podcast creation for common use cases while maintaining full customization flexibility.
- 67% fewer parameters to specify for common use cases
- Consistent configurations across podcast series
- Faster iteration and prototyping
- Team collaboration with shared settings
- Full backward compatibility with existing code
| Profile | Description | Speakers | Segments | Use Case |
|---|---|---|---|---|
tech_discussion |
Technology topics with expert analysis | 2 AI researchers | 4 | Technical content, AI/ML topics |
solo_expert |
Educational explanations | 1 expert teacher | 3 | Learning content, tutorials |
business_analysis |
Market and business insights | 3 business analysts | 4 | Business strategy, market analysis |
diverse_panel |
Multi-perspective discussions | 4 diverse voices | 5 | Complex topics, debate-style content |
# 1. Simple profile usage
result = await create_podcast(
content="Your content...",
episode_profile="tech_discussion",
episode_name="my_podcast",
output_dir="output/my_podcast"
)
# 2. Profile with briefing suffix
result = await create_podcast(
content="Your content...",
episode_profile="business_analysis",
briefing_suffix="Focus on ROI and cost optimization",
episode_name="my_podcast",
output_dir="output/my_podcast"
)
# 3. Profile with parameter overrides
result = await create_podcast(
content="Your content...",
episode_profile="solo_expert",
outline_model="gpt-4o", # Override default
num_segments=5, # Override default
episode_name="my_podcast",
output_dir="output/my_podcast"
)from podcast_creator import configure
# Define your own episode profiles
configure("episode_config", {
"profiles": {
"my_startup_pitch": {
"speaker_config": "business_analysts",
"outline_model": "gpt-4o",
"default_briefing": "Create an engaging startup pitch...",
"num_segments": 6
}
}
})
# Use your custom profile
result = await create_podcast(
content="Your content...",
episode_profile="my_startup_pitch",
episode_name="pitch_deck",
output_dir="output/pitch_deck"
)from podcast_creator import configure
# Configure with custom templates
configure("templates", {
"outline": "Your custom outline template...",
"transcript": "Your custom transcript template..."
})
# Configure with custom paths
configure({
"prompts_dir": "./my_templates",
"speakers_config": "./my_speakers.json",
"output_dir": "./podcasts"
})
# Configure speakers inline
configure("speakers_config", {
"profiles": {
"my_hosts": {
"tts_provider": "elevenlabs",
"tts_model": "eleven_flash_v2_5",
"speakers": [...]
}
}
})- π¨ Web Interface: Complete Streamlit UI for visual podcast creation
- π― Episode Profiles: Pre-configured settings for one-liner podcast creation
- π LangGraph Workflow: Advanced state management and parallel processing
- π₯ Multi-Speaker Support: Dynamic 1-4 speaker configurations with rich personalities
- β‘ Parallel Audio Generation: API-safe batching with concurrent processing
- π§ Fully Configurable: Multiple AI providers (OpenAI, Anthropic, Google, etc.)
- π Multi-Content Support: Combine text, files, and URLs in structured arrays
- π€ AI-Powered Generation: Creates structured outlines and natural dialogues
- π΅ Multi-Provider TTS: ElevenLabs, OpenAI, Google TTS support
- π Flexible Templates: Jinja2-based prompt customization
- π Multilingual Support: Generate content in multiple languages
- π Episode Library: Built-in audio playback and transcript viewing
The library uses a smart priority system for loading resources:
-
User Configuration (highest priority)
configure("templates", {"outline": "...", "transcript": "..."})
-
Custom Paths
configure("prompts_dir", "/path/to/templates")
-
Working Directory
./prompts/podcast/*.jinja./speakers_config.json./episodes_config.json
-
Bundled Defaults (lowest priority)
- Package includes production-ready templates
- Multiple speaker profiles included
import asyncio
from podcast_creator import create_podcast
# Simple episode profile usage
async def main():
result = await create_podcast(
content="AI has transformed many industries...",
episode_profile="tech_discussion", # π One-liner magic!
episode_name="ai_impact",
output_dir="output/ai_impact"
)
asyncio.run(main())import asyncio
from podcast_creator import create_podcast
async def main():
result = await create_podcast(
content="AI has transformed many industries...",
briefing="Create an informative discussion about AI impact",
episode_name="ai_impact",
output_dir="output/ai_impact",
speaker_config="ai_researchers"
)
asyncio.run(main())from podcast_creator import configure, create_podcast
# Custom speaker configuration
configure("speakers_config", {
"profiles": {
"tech_experts": {
"tts_provider": "elevenlabs",
"tts_model": "eleven_flash_v2_5",
"speakers": [
{
"name": "Dr. Alex Chen",
"voice_id": "your_voice_id",
"backstory": "Senior AI researcher with focus on ethics",
"personality": "Thoughtful, asks probing questions"
},
{
"name": "Jamie Rodriguez",
"voice_id": "your_voice_id_2",
"backstory": "Tech journalist and startup advisor",
"personality": "Enthusiastic, great at explanations"
}
]
}
}
})
# Custom templates
configure("templates", {
"outline": """
Create a {{ num_segments }}-part podcast outline about: {{ briefing }}
Content: {{ context }}
Speakers: {% for speaker in speakers %}{{ speaker.name }}: {{ speaker.personality }}{% endfor %}
""",
"transcript": """
Generate natural dialogue for: {{ segment.name }}
Keep it conversational and engaging.
"""
})
# Generate podcast with custom configuration
result = await create_podcast(
content="Your content...",
briefing="Your briefing...",
episode_name="custom_podcast",
speaker_config="tech_experts"
)# Solo expert explanation
result = await create_podcast(
content="Technical content...",
episode_profile="solo_expert",
episode_name="deep_dive",
output_dir="output/deep_dive"
)
# Business analysis
result = await create_podcast(
content="Market trends...",
episode_profile="business_analysis",
episode_name="market_analysis",
output_dir="output/market_analysis"
)
# Panel discussion with diverse perspectives
result = await create_podcast(
content="Complex topic...",
episode_profile="diverse_panel",
episode_name="panel_discussion",
output_dir="output/panel_discussion"
)# Use profile with briefing suffix
result = await create_podcast(
content="Cloud computing trends...",
episode_profile="business_analysis",
briefing_suffix="Focus on cost optimization and ROI metrics",
episode_name="cloud_economics",
output_dir="output/cloud_economics"
)
# Override specific parameters
result = await create_podcast(
content="Quantum computing...",
episode_profile="tech_discussion",
outline_model="gpt-4o", # Override default
num_segments=6, # Override default
episode_name="quantum_deep",
output_dir="output/quantum_deep"
)from podcast_creator import configure, get_config, create_podcast
# Set configuration
configure(key, value)
configure({"key1": "value1", "key2": "value2"})
# Get configuration
value = get_config("key", default_value)
# Generate podcast
result = await create_podcast(...)| Key | Type | Description |
|---|---|---|
prompts_dir |
str |
Directory containing template files |
templates |
dict |
Inline template content |
speakers_config |
str/dict |
Path to speaker JSON or inline config |
episode_config |
str/dict |
Path to episode JSON or inline config |
output_dir |
str |
Default output directory |
{
"profiles": {
"profile_name": {
"tts_provider": "elevenlabs",
"tts_model": "eleven_flash_v2_5",
"speakers": [
{
"name": "Speaker Name",
"voice_id": "voice_id_from_provider",
"backstory": "Rich background that informs expertise",
"personality": "Speaking style and traits"
}
]
}
}
}- Get Voice IDs from your TTS provider
- Design Personalities that complement each other
- Write Rich Backstories to guide content expertise
- Test Combinations with different content types
- OpenAI: GPT-4, GPT-4o, o1, o3
- Anthropic: Claude 3.5 Sonnet, Claude 3 Opus
- Google: Gemini Pro, Gemini Flash
- Groq: Mixtral, Llama models
- Ollama: Local model support
- Perplexity: Research-enhanced models
- Azure OpenAI: Enterprise OpenAI
- Mistral: Mistral models
- DeepSeek: DeepSeek models
- xAI: Grok models
- OpenRouter: Multi-provider access
- ElevenLabs: Professional voice synthesis
- OpenAI TTS: High-quality voices
- Google: Google Cloud TTS
- Vertex AI: Google Cloud enterprise
output/episode_name/
βββ outline.json # Structured outline
βββ transcript.json # Complete dialogue
βββ clips/ # Individual audio clips
β βββ 0000.mp3 # First segment
β βββ 0001.mp3 # Second segment
β βββ ... # Additional segments
βββ audio/ # Final output
βββ episode_name.mp3 # Complete podcast
# Launch web interface (requires UI installation)
podcast-creator ui
# Launch on custom port/host
podcast-creator ui --port 8080 --host 0.0.0.0
# Skip dependency check
podcast-creator ui --skip-init-check
# Initialize project with templates
podcast-creator init
# Initialize in specific directory
podcast-creator init --output-dir /path/to/project
# Overwrite existing files
podcast-creator init --force
# Show version
podcast-creator versionNote: The ui command requires the UI installation: pip install podcast-creator[ui]
The podcast-creator ui command launches a comprehensive Streamlit interface that provides:
- π Dashboard: Statistics and quick actions
- ποΈ Speaker Management: Visual profile creation with voice selection dropdowns
- πΊ Episode Management: Configure generation parameters and AI models
- π¬ Podcast Generation: Multi-content support (text, files, URLs) with real-time progress
- π Episode Library: Audio playback, transcript viewing, and downloads
- π€ Import/Export: Share profiles via JSON files
The interface automatically detects missing dependencies and offers to run initialization if needed.
- β‘ Parallel Processing: 5 concurrent audio clips per batch (configurable)
- π API-Safe Batching: Respects provider rate limits
- π Scalable: Handles 30+ dialogue segments efficiently
- β±οΈ Fast Generation: ~2-3 minutes for typical podcasts
- π― Optimized Workflow: Smart resource management
If you encounter errors like ElevenLabs API error: Too many concurrent requests, you can adjust the parallel processing batch size:
# In your .env file
TTS_BATCH_SIZE=2 # Reduce from default 5 to 2 for ElevenLabs free planThis is particularly useful for:
- ElevenLabs Free Plan: Limited to 2 concurrent requests
- Other TTS providers with stricter rate limits
- Debugging: Set to 1 for sequential processing
git clone <repository-url>
cd podcast-creator
# Install with uv (recommended)
uv sync
# This installs the package in editable mode
# along with all dependenciespodcast-creator/
βββ src/
β βββ podcast_creator/
β βββ __init__.py # Public API
β βββ config.py # Configuration system
β βββ cli.py # CLI commands (with UI command)
β βββ core.py # Core utilities
β βββ graph.py # LangGraph workflow
β βββ nodes.py # Workflow nodes
β βββ speakers.py # Speaker management
β βββ episodes.py # Episode profile management
β βββ state.py # State management
β βββ validators.py # Validation utilities
β βββ resources/ # Bundled templates
β βββ prompts/
β βββ speakers_config.json
β βββ episodes_config.json
β βββ streamlit_app/ # Web interface
β βββ examples/
βββ pyproject.toml # Package configuration
βββ README.md
# Test the package
python -c "from podcast_creator import create_podcast; print('Import successful')"
# Test CLI
podcast-creator --help
# Test web interface
podcast-creator ui
# Test initialization
mkdir test_project
cd test_project
podcast-creator init
python example_usage.pyCheck the examples/ directory for:
- Episode Profiles: Comprehensive guide to streamlined podcast creation
- Basic usage examples
- Advanced configuration
- Custom speaker setups
- Multi-language podcasts
- Different content types
We welcome contributions! Please see our Contributing Guide for details on:
- π Getting started with development
- π Our pull request process
- π§ͺ Testing guidelines
- π¨ Code style and standards
- π How to report bugs
- π‘ How to suggest new features
Quick links:
This project is licensed under the MIT License - see the LICENSE file for details.
- Examples: Examples
Made with β€οΈ for the AI community
