1 ---
2 name: podcast-generator
3 description: Turn topics into podcast scripts and audio with ElevenLabs production.
4 ---
5
6 # Podcast Generator
7
8 Turn research, articles, or topics into podcast-ready scripts and audio content. Generate conversational scripts with host/guest dynamics and produce audio using ElevenLabs text-to-speech. Supports script-only workflows, multilingual episodes, and series planning.
9
10 ## When to Use
11
12 - User wants to turn written content into a podcast episode
13 - User wants to create a podcast-style summary of a topic or paper
14
15 - User wants to generate audio content from research
16 - User mentions "AI Pods", podcast, or audio content creation
17
18 - User wants a podcast script without audio generation (script-only mode)
19 - User wants to plan a podcast series or recurring show
20
21 - User says "create an episode about..." (topic-first requests without explicitly saying "podcast")
22 - User says "write a script for..." (scriptwriting intent that maps to podcast format)
23
24 - User says "make an audio version of..." (converting written content like articles, blog posts, or reports into listenable content)
25 - User says "plan my next episode" (continuing an existing series)
26
27 - User says "record / produce / generate an episode" (audio production intent)
28
29 ## When NOT to Use
30
31 - Music creation or sound effects
32 - Video content (use storyboard skill for planning)
33
34 - Written summaries only (use deep-research skill)
35
36 ## Workflow Modes
37
38 Before starting, determine which workflow the user needs:
39
40 | Mode | Description | When to Use |
41
42 |------|-------------|-------------|
43
44 | **Script-only** | Research + script writing, no audio | User wants the script first, no ElevenLabs key, or iterating on content before committing to audio |
45
46 | **Full production** | Research + script + audio generation + normalization | User has ElevenLabs key and wants the finished audio file |
47
48 | **Series planning** | Define show identity + episode calendar + recurring structure | User wants to build an ongoing podcast, not just a one-off episode |
49
50 If the user's intent is ambiguous, ask which mode they prefer. Default to **script-only** if no ElevenLabs key is available — do not block progress on audio setup.
51
52 ## Methodology
53
54 ### Step 1: Structured Research
55
56 Gather source material systematically. Do not skip this step — a well-researched script sounds authoritative; a loosely researched one sounds generic.
57
58 #### Research checklist — run these searches in parallel
59
60 | Category | What to Gather | How |
61
62 |----------|---------------|-----|
63
64 | **Recent events** | Latest results, scores, announcements, breaking news | `webSearch` with date-specific queries (e.g., "Real Madrid results April 2026") |
65
66 | **Statistics & data** | Standings, player stats, records, rankings | `webSearch` for official stats pages (fbref, transfermarkt, official league sites) |
67
68 | **Quotes & reactions** | Press conference quotes, player interviews, social media reactions | `webSearch` for post-match quotes, press conferences |
69
70 | **Context & history** | Historical comparisons, records being chased, milestones | `webSearch` for historical context related to current events |
71
72 | **Narrative angles** | Controversies, storylines, fan sentiment, trending debates | `webSearch` for opinion pieces, fan forums, trending topics |
73
74 ##### Research template — fill this before writing
75
76 ```text
77
78 EPISODE RESEARCH BRIEF
79
80 ======================
81
82 Topic: [main topic]
83
84 Date context: [what just happened / why this is timely]
85
86 KEY FACTS:
87
88 - [fact 1 with source]
89 - [fact 2 with source]
90
91 - [fact 3 with source]
92
93 STATISTICS:
94
95 - [stat 1]
96 - [stat 2]
97
98 QUOTES:
99
100 - "[quote]" — [who said it, when]
101
102 NARRATIVE ANGLES:
103
104 - [angle 1: why it's interesting]
105 - [angle 2: the contrarian take]
106
107 OPEN QUESTIONS:
108
109 - [what's still uncertain / debatable]
110
111 ```
112
113 Run at least 3 parallel web searches covering different facets of the topic. Cross-reference facts across sources. Flag anything that's unverified or contradictory — use it as discussion material in the script rather than stating it as fact.
114
115 ### Step 2: Format Selection
116
117 Choose the podcast format:
118
119 | Format | Description | Best For |
120
121 |--------|-------------|----------|
122
123 | **Solo explainer** | One host walks through the topic | Tutorials, news summaries, deep dives |
124
125 | **Conversational duo** | Two hosts discuss and riff | Making complex topics accessible, entertainment |
126
127 | **Interview style** | Host asks questions, expert answers | Technical topics, research papers |
128
129 | **Debate** | Two perspectives argue a topic | Controversial or nuanced subjects |
130
131 | **Narrative** | Storytelling with narration | Case studies, historical events |
132
133 #### Format templates with segment timing
134
135 #### Conversational Duo (recommended default)
136
137 | Segment | Duration | Word Count | Speaker Balance |
138
139 |---------|----------|------------|-----------------|
140
141 | Cold open | 15–30s | 40–75 | 50/50 |
142
143 | Setup/intro | 30–60s | 75–150 | 60/40 (Explainer leads) |
144
145 | Segment 1 | 3–5 min | 450–750 | 55/45 |
146
147 | Segment 2 | 3–5 min | 450–750 | 45/55 |
148
149 | Segment 3 | 3–5 min | 450–750 | 55/45 |
150
151 | Segment 4 (optional) | 3–5 min | 450–750 | 50/50 |
152
153 | Segment 5 (optional) | 3–5 min | 450–750 | 50/50 |
154
155 | Takeaways | 1–2 min | 150–300 | 50/50 |
156
157 | Outro | 15–30s | 40–75 | 50/50 |
158
159 Target overall speaker balance: **no host should have less than 40% of total lines.** The Questioner is not a sidekick — they drive the conversation forward.
160
161 #### Solo Explainer
162
163 | Segment | Duration | Word Count |
164
165 |---------|----------|------------|
166
167 | Hook | 15–30s | 40–75 |
168
169 | Context | 1–2 min | 150–300 |
170
171 | Main body (3–4 sections) | 3–5 min each | 450–750 each |
172
173 | Summary + CTA | 1–2 min | 150–300 |
174
175 #### Interview Style
176
177 | Segment | Duration | Word Count | Speaker Balance |
178
179 |---------|----------|------------|-----------------|
180
181 | Host intro | 30–60s | 75–150 | Host only |
182
183 | Guest intro | 1–2 min | 150–300 | 70/30 (Host leads) |
184
185 | Q&A blocks (4–6) | 3–5 min each | 450–750 each | 30/70 (Guest leads) |
186
187 | Rapid fire | 2–3 min | 300–450 | 50/50 |
188
189 | Closing | 30–60s | 75–150 | Host only |
190
191 ### Step 3: Script Writing — NotebookLM Pattern
192
193 The two-host format that works (reverse-engineered from Google's Audio Overviews):
194
195 - **Host A = "The Explainer"** — knows the material, breaks down concepts
196 - **Host B = "The Questioner"** — audience surrogate, asks the "wait, why?" questions
197
198 - **Dialog rhythm:** alternate short punchy lines with longer explanations. Sprinkle affirmations: "Right.", "Exactly.", "Okay so—"
199 - **Arc:** open with common misconception → introduce source that challenges it → unpack implications → "so what does this mean for you"
200
201 - **Transitions:** "And on that note..." / "Which brings us to..." / "Here's where it gets weird—"
202
203 #### Structure (target ~150 words per minute of audio)
204
205 1. **Cold open** (15–30s) — the single most surprising finding, stated as a question or contradiction
206 2. **Setup** (30–60s) — what we're covering, why it matters now
207
208 3. **Segments** (3–5 × 2–4 min) — one idea each; end each with a mini-hook into the next
209 4. **Takeaways** (1–2 min) — 3 things to remember
210
211 5. **Outro** (15s) — sign-off
212
213 **Write for ears, not eyes:** contractions always, no semicolons, no parentheticals. If you wouldn't say it out loud, rewrite it.
214
215 **Script format** — one line per utterance, speaker tag in brackets, blank line between speakers. This is the unit you'll chunk for TTS:
216
217 ```text
218
219 [ALEX]: So today we're diving into something that honestly broke my brain a little.
220
221 [SAM]: Oh no. What now.
222
223 [ALEX]: Okay — you know how everyone says [common belief]? There's this paper from [source] that basically says... the opposite.
224
225 [SAM]: Wait. The *opposite* opposite?
226
227 ```
228
229 ##### Script-only deliverable format
230
231 When delivering a script without audio, include these production notes at the end:
232
233 ```text
234
235 PRODUCTION NOTES:
236
237 - Total word count: [number]
238 - Estimated duration: [minutes] (at 150 wpm)
239
240 - Segment breakdown: [list segments with word counts]
241 - Voice recommendations: [suggested voice profiles for each host]
242
243 - Music/SFX suggestions: [intro, transitions, outro, background]
244
245 ```
246
247 ### Step 4: Audio Generation — ElevenLabs
248
249 > **Skip this step in script-only mode.** If the user doesn't have an ElevenLabs key or only wants the script, deliver the script with production notes and stop here.
250
251 **Install:** `pip install elevenlabs pydub`
252
253 **Model choice:** `eleven_multilingual_v2`for quality (10K char limit per call);`eleven_turbo_v2_5` for speed/cost (40K char limit, ~300ms latency, ~3x faster).
254
255 **Voice IDs that work for duo podcasts** (from the default library — verify with `client.voices.search()`):
256
257 - `JBFqnCBsd6RMkjVDRZzb` (George — warm, mid-range male)
258 - `21m00Tcm4TlvDq8ikWAM` (Rachel — clear, measured female)
259
260 - `pNInz6obpgDQGcFmaJgB` (Adam — energetic narrator)
261 - `EXAVITQu4vr4xnSDxMaL` (Bella — conversational female)
262
263 #### Settings for conversational podcast delivery
264
265 - `stability: 0.45` — lower = more expressive; below 0.3 gets inconsistent
266 - `similarity_boost: 0.8` — keeps voice consistent across chunks
267
268 - `style: 0.3` — mild exaggeration for energy (0 = flat)
269 - `use_speaker_boost: True`
270
271 ```python
272
273 import os
274
275 from elevenlabs.client import ElevenLabs
276
277 from pydub import AudioSegment
278
279 import io
280
281 client = ElevenLabs(api_key=os.environ["ELEVENLABS_API_KEY"])
282
283 VOICES = {"ALEX": "JBFqnCBsd6RMkjVDRZzb", "SAM": "21m00Tcm4TlvDq8ikWAM"}
284
285 def render_line(speaker: str, text: str) -> AudioSegment:
286
287 audio = client.text_to_speech.convert(
288
289 voice_id=VOICES[speaker],
290
291 text=text,
292
293 model_id="eleven_multilingual_v2",
294
295 output_format="mp3_44100_128",
296
297 voice_settings={"stability": 0.45, "similarity_boost": 0.8,
298
299 "style": 0.3, "use_speaker_boost": True},
300
301 )
302
303 return AudioSegment.from_mp3(io.BytesIO(b"".join(audio)))
304
305 # parse script → list of (speaker, text) tuples, render each, concat
306
307 gap = AudioSegment.silent(duration=350) \# 350ms between speakers
308
309 episode = sum((render_line(s, t) + gap for s, t in lines), AudioSegment.empty())
310
311 episode.export("episode_raw.mp3", format="mp3", bitrate="128k")
312
313 ```
314
315 **Chunking long utterances:** split at sentence boundaries (`.`,`?`,`!`), keep under ~800 chars per call. Pass`previous_text`/`next_text` params to preserve prosody across chunk boundaries.
316
317 ### Step 5: Loudness Normalization
318
319 > **Skip this step in script-only mode.**
320
321 Podcast standard is **-16 LUFS** (stereo) per Apple/Spotify specs. pydub's `normalize()`is peak-only — not LUFS. Use ffmpeg's two-pass`loudnorm`via the`ffmpeg-normalize` wrapper:
322
323 ```bash
324
325 pip install ffmpeg-normalize
326
327 ffmpeg-normalize episode_raw.mp3 -o episode.mp3 -c:a libmp3lame -b:a 128k \\
328
329 -t -16 -tp -1.5 -lra 11 --normalization-type ebu
330
331 ```
332
333 `-t -16`= target LUFS,`-tp -1.5`= true-peak ceiling (prevents clipping),`-lra 11` = loudness range. This runs two passes automatically (analyze, then correct).
334
335 ## Multilingual & Localization Support
336
337 When the target audience speaks a language other than English, follow these guidelines:
338
339 ### Language Selection
340
341 - Ask the user what language the podcast should be in during the initial questions
342 - If the audience is region-specific (e.g., LATAM, Brazil, France), default to the primary language of that region
343
344 - If the user doesn't specify, infer from context (e.g., "LATAM market" → Spanish)
345
346 ### Model Selection for Non-English
347
348 - **Always use `eleven_multilingual_v2`** for non-English scripts —`eleven_turbo_v2_5` has limited language support and may produce artifacts in non-English speech
349 - Set `stability` slightly higher (0.50–0.55) for non-English languages to reduce mispronunciation
350
351 - Test voice IDs with a short sample in the target language before rendering the full episode — not all default voices perform equally across languages
352
353 ### Voice Selection by Language
354
355 | Language | Recommended Approach |
356
357 |----------|---------------------|
358
359 | Spanish | Use `client.voices.search()`to find native Spanish voices. Fallback: George and Rachel handle Spanish reasonably well with`eleven_multilingual_v2` |
360
361 | Portuguese | Search for native Portuguese voices. Brazilian Portuguese and European Portuguese differ significantly — match the audience |
362
363 | French | Search for native French voices |
364
365 | Other | Always search for native voices first; multilingual fallbacks as backup |
366
367 ### Script Writing for Non-English
368
369 - Write the entire script in the target language — do not write in English and translate
370 - Use natural spoken patterns of the target language, not literal translations of English idioms
371
372 - Proper nouns and brand names: keep the original spelling but add phonetic hints in parentheses if the TTS might mispronounce them
373 - For mixed-language audiences (e.g., Spanglish), be intentional about when and why you switch languages — it should feel natural, not random
374
375 ## Series Planning
376
377 When the user wants to build an ongoing podcast (not just a one-off episode), establish the series identity first.
378
379 ### Show Bible
380
381 Create a show bible document that defines the recurring elements:
382
383 ```text
384
385 SHOW BIBLE
386
387 ==========
388
389 Show name: [name]
390
391 Tagline: [one-line description]
392
393 Target audience: [who listens]
394
395 Language: [primary language]
396
397 Format: [solo / duo / interview / rotating]
398
399 Tone: [casual-analytical / high-energy / calm-thoughtful / etc.]
400
401 HOSTS:
402
403 - [Host 1 name]: [role — explainer/questioner/narrator] — [personality in 1 sentence]
404 - [Host 2 name]: [role] — [personality in 1 sentence]
405
406 RECURRING SEGMENTS:
407
408 - [Segment name]: [what it covers, where it appears in the episode]
409 - [Segment name]: [what it covers, where it appears in the episode]
410
411 EPISODE STRUCTURE:
412
413 1. [Opening element — jingle, cold open, catchphrase]
414 2. [Main content — how many segments, typical length]
415
416 3. [Recurring closer — sign-off phrase, CTA]
417
418 BRANDING:
419
420 - Opening catchphrase: "[phrase]"
421 - Closing catchphrase: "[phrase]"
422
423 - Episode naming convention: [e.g., "Ep. XX: [Topic]"]
424
425 CONTENT PILLARS:
426
427 - [Pillar 1]: [description — e.g., "Match analysis and tactical breakdowns"]
428 - [Pillar 2]: [description — e.g., "Transfer rumors and squad management"]
429
430 - [Pillar 3]: [description — e.g., "Historical deep dives and legend profiles"]
431
432 ```
433
434 ### Episode Calendar
435
436 Plan episodes in advance to maintain consistency and cover the content pillars:
437
438 ```text
439
440 EPISODE CALENDAR
441
442 ================
443
444 Frequency: [weekly / biweekly / monthly]
445
446 Release day: [e.g., "Every Monday"]
447
448 UPCOMING EPISODES:
449
450 | Ep \# | Target Date | Topic | Content Pillar | Status |
451
452 |------|-------------|-------|----------------|--------|
453
454 | 01 | [date] | [topic] | [pillar] | [draft/recorded/published] |
455
456 | 02 | [date] | [topic] | [pillar] | [planned] |
457
458 | 03 | [date] | [topic] | [pillar] | [planned] |
459
460 ```
461
462 ### Series Continuity
463
464 Across episodes, maintain:
465
466 - **Consistent host names and personalities** — don't change character traits between episodes
467 - **Running references** — callbacks to previous episodes ("as we talked about last week...")
468
469 - **Episode numbering** — sequential numbering in the script header and file names
470 - **File naming convention** — `episodio_XX_script.txt`or`episode_XX_script.txt`
471
472 - **Evolving storylines** — for topic-based series, track ongoing narratives (e.g., a team's season, a company's trajectory) and reference the arc across episodes
473
474 ## AI-Assisted Research Integration
475
476 Leverage web search systematically to make each episode timely and data-rich. Do not rely on general knowledge alone — always ground the script in current, verifiable information.
477
478 ### Search Strategy
479
480 Run searches in parallel to maximize speed. Use at least 3 different search queries per episode:
481
482 ```javascript
483
484 // Run these in parallel — don't serialize
485
486 const [results1, results2, results3] = await Promise.all([
487
488 webSearch({ query: "[topic] latest news [current month year]" }),
489
490 webSearch({ query: "[topic] statistics standings data [year]" }),
491
492 webSearch({ query: "[topic] analysis reactions opinions [current month year]" })
493
494 ]);
495
496 ```
497
498 ### Data Verification
499
500 - Cross-reference statistics across at least 2 sources before including them in the script
501 - When sources conflict, acknowledge the discrepancy in the script — it makes good discussion material
502
503 - Always include the date context of your research — "as of [date]" — so listeners know the information is current
504 - For rapidly changing topics (sports scores, stock prices, breaking news), note in the script header when the research was conducted
505
506 ### Enriching the Script with Data
507
508 Transform raw research into conversational content:
509
510 | Raw Data | Script Version |
511
512 |----------|---------------|
513
514 | "Player scored 59 goals in 2025" | "Fifty-nine goals. In one calendar year. That ties the all-time club record." |
515
516 | "Team is 4 points behind leader" | "Four points. That's the gap. And with eight games left, there's almost no margin for error." |
517
518 | "Manager was fired after 7 months" | "Seven months. That's all it lasted. One of the shortest managerial stints in the club's recent history." |
519
520 Numbers should be spoken out in script form when they open a sentence or carry dramatic weight. Use digits when they're mid-sentence and factual.
521
522 ## Episode Length Guidelines
523
524 | Content Type | Target Length | Script Word Count |
525
526 |-------------|-------------|-------------------|
527
528 | News summary | 5-10 min | 750-1,500 words |
529
530 | Topic explainer | 10-20 min | 1,500-3,000 words |
531
532 | Deep dive | 20-40 min | 3,000-6,000 words |
533
534 | Research paper review | 15-25 min | 2,250-3,750 words |
535
536 Rule of thumb: ~150 words per minute of audio.
537
538 ## Best Practices
539
540 1. **Hook early** — if the first 30 seconds aren't interesting, listeners skip
541 2. **One idea per segment** — don't cram too much; let ideas breathe
542
543 3. **Use stories and examples** — abstract concepts need concrete illustrations
544 4. **Vary pacing** — alternate between fast energy and slow, thoughtful moments
545
546 5. **End with value** — give listeners a clear takeaway or action item
547 6. **Ground in data** — every claim should trace back to your research; vague statements kill credibility
548
549 7. **Name your sources** — "according to fbref" or "the manager said in the press conference" adds authority
550 8. **Maintain series identity** — if this is part of a series, use the show bible for consistent tone, host names, and recurring elements
551
552 ## Limitations
553
554 - Audio generation requires `ELEVENLABS_API_KEY` env var (script-only mode does not)
555 - Voices mispronounce technical terms/acronyms — spell phonetically in the script (`"Kubernetes"`→`"koo-ber-NET-eez"`) or use ElevenLabs pronunciation dictionaries
556
557 - `eleven_multilingual_v2` has known issues with very long single calls (voice drift, occasional stutter) — chunk at sentence boundaries, don't send 5K-char blobs
558 - Cost: ~$0.18–0.30 per 1000 characters depending on plan; a 20-min episode (~3000 words) ≈ $3–5
559
560 - Non-English voices: quality varies by language and voice; always test with a short sample before full rendering