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