← All docs

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:

  1. Hi-pass 80 Hz
  2. EQ: -1 dB @ 200 Hz (mud), -3 dB @ 8 kHz (sibilance), -6 dB @ 12 kHz
  3. Multi-band compression
  4. LUFS normalise to -20
  5. True-peak limiter @ -1 dBTP
  6. 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.