AI-powered podcast generation tool that creates conversational audio content from text sources
Project description
Podcast Creator
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.
๐ Quick Start
Installation
# Install from PyPI (when published)
pip install podcast-creator
# Or install from source
git clone <repository-url>
cd podcast-creator
pip install .
Initialize Your Project
# 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
Generate Your First Podcast
๐ New: Episode Profiles (Streamlined)
import 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())
๐ Classic: Full Configuration
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 - Streamlined Podcast Creation
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.
๐ Why Episode Profiles?
- 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
๐ Bundled Profiles
| 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 |
๐ช Usage Patterns
# 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"
)
๐ง Custom Episode Profiles
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"
)
โจ Features
๐ง Flexible Configuration
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": [...]
}
}
})
๐๏ธ Core Features
- ๐ฏ 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.)
- ๐ Content Processing: Extracts content from various sources
- ๐ค 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
๐๏ธ Architecture
LangGraph Workflow
graph LR
A[Content Input] --> B[Outline Node]
B --> C[Transcript Node]
C --> D[Audio Generation<br/>Sequential Batches]
D --> E[Audio Combination]
E --> F[Final Output]
Configuration Priority
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
๐ Usage Examples
๐ฏ Episode Profiles (Recommended)
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())
๐ Classic Configuration
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())
Advanced Configuration
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"
)
๐ช Episode Profile Variations
# 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"
)
๐ง Episode Profile Customization
# 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"
)
๐ง Configuration API
Main Functions
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(...)
Configuration Options
| 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 |
๐ญ Speaker Configuration
Speaker Profile Structure
{
"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"
}
]
}
}
}
Creating Custom Speakers
- 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
๐ Supported Providers
Language Models (via Esperanto)
- 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
Text-to-Speech Services
- ElevenLabs: Professional voice synthesis
- OpenAI TTS: High-quality voices
- Google: Google Cloud TTS
- Vertex AI: Google Cloud enterprise
๐ Output Structure
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
๐ ๏ธ CLI Commands
# 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 version
๐ Performance
- โก Parallel Processing: 5 concurrent audio clips per batch
- ๐ 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
๐งช Development
Installing for Development
git clone <repository-url>
cd podcast-creator
pip install -e .
# Or with uv
uv sync
uv pip install -e .
Project Structure
podcast-creator/
โโโ src/
โ โโโ podcast_creator/
โ โโโ __init__.py # Public API
โ โโโ config.py # Configuration system
โ โโโ cli.py # CLI commands
โ โโโ 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
โ โโโ examples/
โโโ pyproject.toml # Package configuration
โโโ README.md
Testing
# Test the package
python -c "from podcast_creator import create_podcast; print('Import successful')"
# Test CLI
podcast-creator --help
# Test initialization
mkdir test_project
cd test_project
podcast-creator init
python example_usage.py
๐ Examples
Check 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
๐ค Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
๐ Links
- Examples: Examples
Made with โค๏ธ for the AI community
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file podcast_creator-0.2.4.tar.gz.
File metadata
- Download URL: podcast_creator-0.2.4.tar.gz
- Upload date:
- Size: 155.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a8bf83fce9fed3c4b16a64b0501e2cdf0831a299cb4d60bbf9ac11e6a582772
|
|
| MD5 |
6e1a9a265af3bc3e0c9a2ae54ede9d94
|
|
| BLAKE2b-256 |
3f2b272e98ba78d47457cc91de362a20f3f2d14c810b7b3134338941314d58b2
|
File details
Details for the file podcast_creator-0.2.4-py3-none-any.whl.
File metadata
- Download URL: podcast_creator-0.2.4-py3-none-any.whl
- Upload date:
- Size: 39.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
24ac8d242c56daee72e78daadba2062f68119f17879e6f2f50012d0a6d6d2c91
|
|
| MD5 |
65efbc3eb9d1e23423e91b2175cd23cf
|
|
| BLAKE2b-256 |
8f1ecd9fdce828a23a14224b1e33dfc74335c3362e5ca7e8689dc2012e99d8cf
|