TTS affirmations
ElevenLabs Turbo v2.5 → expanded affirmation script → mastered voice chain → Opus 160k + AAC 192k. The voice is Rachel by default — calm, female, narrative tone.
The script expansion model
Every catalog affirmation has a short title (e.g. “Sleep — Let Go”)
and a 400-550 character expanded script in SCRIPTS inside
tools/generate/affirmations_ai.py. The expansion turns a 4-word
title into a full ~30-50 second narration with specific imagery,
breath cues, and present-tense framing.
Voice settings
- stability (0.65) — higher = more monotone but consistent. Below 0.5, the voice drifts in pitch across long scripts.
- similarity_boost (0.75) — how closely to track the reference voice. >0.85 sounds locked; <0.6 can drift toward generic.
- style (0.2) — expressiveness. Sleep affirmations need to stay low; >0.35 reads as theatrical.
- use_speaker_boost (false) — when true, adds presenter-y projection. Stays off for intimate sleep narration.
Mastering chain
After TTS:
- Hi-pass 80 Hz
- EQ: -1 dB @ 200 Hz (mud), -3 dB @ 8 kHz (sibilance), -6 dB @ 12 kHz
- Multi-band compression
- LUFS normalise to -20
- True-peak limiter @ -1 dBTP
- Encode WebM Opus 160k + AAC 192k
Critical gotcha
Always use application=audio, never application=voip when
encoding to Opus. Voip mode adds perceived hiss on TTS that we burned
several iterations chasing. The pipeline does this correctly; the
gotcha is only relevant if you’re invoking ffmpeg yourself.
Cost + runtime
~30s per track, ~$0.05/track for ElevenLabs Turbo v2.5.