Turn breaking news into natural podcast episodes powered by AI.
Podcast Buddy is an AI-powered news-to-podcast platform that fetches the latest news on any topic, summarizes it with Gemini, generates a natural two-host conversation, converts the script into realistic speech with Edge TTS, merges the audio with FFmpeg, and delivers a playable MP3 episode in the browser.
Inspired by Adobe Podcast, Google NotebookLM Audio Overview, and modern editorial media experiences.
- Latest news fetching using the GNews API
- Natural two-host podcast dialogue generation via a local script engine
- Realistic AI voice generation using Edge TTS
- Audio merging using FFmpeg
- Downloadable MP3 podcast episodes
- Interactive transcript viewer
- Editorial news source cards
- Modern Adobe Podcast-inspired UI
- Clean, responsive design for desktop and mobile
User enters a topic
↓
Fetch latest news (GNews)
↓
Local dialogue generation
↓
Edge TTS
↓
FFmpeg audio merge
↓
episode_{request_id}.mp3
↓
Frontend audio player
Artificial Intelligence
Example sources returned by GNews may include:
- Reuters
- Phys.org
- Bloomberg
- TechCrunch
Structured summary sections:
- Main Events
- Key Facts
- Future Implications
- Expert Opinions
HOST_A: Welcome to Podcast Buddy. Today we are looking at Artificial Intelligence...
HOST_B: That is a useful starting point, because it gives us one clear thread to follow...
HOST_A: One important fact here is that...
HOST_B: What stands out to me is this perspective: ...
/static/audio/episode_{request_id}.mp3
| Technology | Purpose |
|---|---|
| Next.js 15 | Frontend framework |
| React 19 | UI library |
| TypeScript | Type safety |
| Tailwind CSS | Styling |
| Axios | API communication |
| Lucide React | Icons |
| Technology | Purpose |
|---|---|
| FastAPI | REST API |
| Python 3.12+ | Backend runtime |
| Pydantic v2 | Validation |
| HTTPX | Async HTTP requests |
| Uvicorn | ASGI server |
| Technology | Purpose |
|---|---|
| GNews API | News retrieval |
| Google GenAI SDK | Gemini integration |
| Gemini 2.5 Flash | News summarization |
| Local script engine | Podcast dialogue |
| Edge TTS | Voice generation |
| FFmpeg | Audio merging |
┌──────────────┐
│ User Input │
└──────┬───────┘
│
▼
┌──────────────┐
│ GNews API │
└──────┬───────┘
│
▼
┌──────────────┐
│ Gemini │
│ Summary │
└──────┬───────┘
│
▼
┌──────────────┐
│ Script │
│ Generator │
└──────┬───────┘
│
▼
┌──────────────┐
│ Edge TTS │
└──────┬───────┘
│
▼
┌──────────────┐
│ FFmpeg │
│ Audio Merge │
└──────┬───────┘
│
▼
┌──────────────┐
│ episode.mp3 │
└──────────────┘
Podcast Buddy
├── frontend
│ ├── app
│ ├── components
│ ├── lib
│ ├── types
│ └── public
│
├── backend
│ ├── app
│ │ ├── config
│ │ ├── models
│ │ ├── routes
│ │ ├── services
│ │ └── utils
│ ├── static
│ │ └── audio
│ └── tests
│
├── README.md
└── .gitignore
GET /healthResponse:
{
"status": "ok"
}POST /api/v1/news/searchRequest:
{
"topic": "Artificial Intelligence",
"limit": 10,
"language": "en"
}POST /api/v1/gemini/summarizeRequest:
{
"articles": [
{
"title": "Article title",
"description": "Short description",
"source": "Publication",
"url": "https://example.com/article",
"published_at": "2026-06-12T10:00:00Z"
}
]
}Response:
{
"main_events": [],
"key_facts": [],
"future_implications": [],
"expert_opinions": []
}POST /api/v1/podcast/generateRequest:
{
"topic": "Artificial Intelligence",
"article_limit": 5,
"language": "en"
}Response:
{
"request_id": "uuid",
"topic": "Artificial Intelligence",
"sources": [],
"summary": "{\"main_events\":[],\"key_facts\":[],\"future_implications\":[],\"expert_opinions\":[]}",
"transcript": {
"host_a": "...",
"host_b": "...",
"full_script": "..."
},
"audio_url": "/static/audio/episode_{request_id}.mp3",
"metadata": {
"article_count": 5,
"generated_at": "2026-06-18T10:00:00Z",
"provider_name": "gnews"
}
}Notes:
summaryis returned as a JSON string containing structured summary fields.- The frontend currently sends
article_limit: 10when generating a podcast.
POST /api/v1/tts/generateRequest:
{
"podcast_transcript": "HOST_A: Welcome back...\nHOST_B: Great to be here...",
"output_filename": "podcast.mp3"
}Response:
{
"output_filename": "podcast.mp3",
"output_path": "...",
"segment_count": 2,
"speaker_voices": {
"HOST_A": "en-US-AndrewNeural",
"HOST_B": "en-US-EmmaNeural"
}
}Create:
backend/.env
Add:
GNEWS_API_KEY=your_gnews_api_key
GEMINI_API_KEY=your_gemini_api_key
GEMINI_MODEL=gemini-2.5-flash
EDGE_TTS_VOICE_A=en-US-AndrewNeural
EDGE_TTS_VOICE_B=en-US-EmmaNeural
AUDIO_BASE_URL=/static/audioCopy from backend/.env.example as a starting point.
Create:
frontend/.env.local
Add:
NEXT_PUBLIC_API_BASE_URL=http://localhost:8000Copy from frontend/.env.example as a starting point.
git clone https://github.com/sumandey7684/Podcast-buddy.git
cd Podcast-buddycd backend
python -m venv .venvWindows:
.venv\Scripts\activatemacOS/Linux:
source .venv/bin/activateInstall dependencies and run:
pip install -r requirements.txt
uvicorn app.main:app --reload --host 127.0.0.1 --port 8000Backend:
http://localhost:8000
Swagger docs:
http://localhost:8000/docs
Requirements:
- Python 3.12+
- FFmpeg installed and available on your PATH
cd frontend
npm install
npm run devFrontend:
http://localhost:3000
Podcast Buddy draws inspiration from:
- Google NotebookLM Audio Overview
- Perplexity Discover
- Financial Times editorial design
- NPR Podcasts
- News retrieval: Complete
- AI summary: Complete
- Dialogue generation: Complete
- Edge TTS: Complete
- FFmpeg audio merge: Complete
- Static audio hosting: Complete
- Topic input and podcast generation flow: Complete
- Audio player with download and playback controls: Complete
- Transcript viewer: Complete
- Waveform player: Planned
- Episode library: Planned
- Multi-language podcasts
- Multiple voice options
- Background music
- Podcast history
- User authentication
- Spotify integration
- Cloud audio storage
- Podcast sharing links
- Suman Dey
- Subhasish Rath
- Soumya Ranjan Samal
- Gaurav Kumar Nayak
MIT License. Add a LICENSE file to the repository if you want the license claim to be fully enforceable on GitHub.