Hypernatural

TechniqueBy HypernaturalVersion 3, Oct 29, 2026

elevenlabs-tts-v4

Speak a line or a script in one ElevenLabs voice with text-to-speech on eleven_v4, directed by bracketed audio tags like [warmly] or free-form ones like [lower, knowing]. Lossless pcm_48000 output, then -16 LUFS on the finished track. Use for voice auditions, narration, a presenter's track or re-voicing one line; for a multi-voice scene in one take use elevenlabs-text-to-dialogue.

SKILL.md

ElevenLabs TTS v4

Give it a voice id and tagged text and you get that voice speaking it. One voice, one read per call. Use it for casting auditions (one call per voice, all started at once), for a narrator or presenter track, and to re-voice a single line. When two or more characters talk to each other, use elevenlabs-text-to-dialogue instead: turns played off each other in one generation sound like a scene, and it returns each line's span.

Inputs

  • voice_id: any shared-library voice works by id without adding it to the account (elevenlabs-voice-search finds them), as do the account's own voices.
  • The text with audio tags (below), written from the character's performance guide.
  • output_format: pcm_48000 for anything that will be used (lossless, 16-bit mono; needs a paid tier). The API default is mp3_44100_128; it's fine for a throwaway audition but not for a track.
  • Optional: seed (fix it to compare two directions fairly), voice_settings with stability (0 most expressive, 1 most stable).

Run it

Call describe("elevenlabs/eleven_v4") before the first run in a job and use the field names it gives; the proven request is the voice id, text, model_id eleven_v4, output_format, and optionally seed and voice_settings.

run("elevenlabs/eleven_v4",
    {"voice_id": "<voice_id>", "text": "[warmly] You caught it. [short pause] That's the whole trick.",
     "output_format": "pcm_48000", "seed": 7},
    into="<job>/voices/presenter/pass_a/auditions", unit="<voice_id>")

Calls are independent: start every audition or passage at once, one run each with wait: false, then follow their ids with tasks(wait: true, calls: [...]) rather than waiting on one after another. Auditions share one review page, so wait for all; a passage can be checked the moment it lands (until: "any", then call again with the ids still running).

PCM comes back as raw samples. If the file has no WAV header, wrap it: exec ffmpeg -f s16le -ar 48000 -ac 1 -i <file>.pcm <file>.wav.

Prompt: audio tags

  • A tag is a short direction in square brackets, performed and never spoken: [warmly], [firmly], [curious], [smug], [sighs], [exhales], [chuckles], [short pause], [pause], [long pause], [whispers], [matter-of-fact], [hesitant], [relieved]. Free-form tags work on v4 too: [lower, knowing], [mock sympathy], [almost whispering].
  • Put a tag where the delivery starts or changes: one at the start, another mid-line only where the delivery shifts. Two or three per line at most.
  • Punctuation paces the read: an ellipsis for a trailing beat, an em dash for a cut-off, a comma for a breath.
  • Take the tags from the character's performance guide (its tag list and its avoid list). Put the person's standing direction ("energetic, never slow") at the top of the guide before the first take, not after.
  • Spell out what the voice misreads. "HR" came out as "H&R", and "H.R." still did; "H-R" reads as "HR". Check acronyms, product names and numbers in the first take and respell them in the text.

What you get

One audio file per call, in the format asked for. Nothing else: no timings (transcribe it for those).

Tips and traps

  • The speed setting is ignored on v4 (and v3): the same duration at 1.0 and 1.2. A voice that reads too slowly is fixed by direction or with atempo up to 1.2, pitch kept (python-assemble-dialogue-track retime).
  • Library voices that aren't verified for eleven_v4 still render but can drift from their sample. Cast only verified voices (elevenlabs-voice-search).
  • Library professional voice clones are trained per model, and only their owner can train one for v4. Untrained, it renders but can sound wrong; Voice B did on v3.
  • Audio quality: a voice that sounds "like a telephone" is band-limited at the source, and no output format adds what isn't there. Before casting it, look at the library preview's spectrum (one voice had nothing above about 12 kHz and 99% of its energy under 5 kHz). Denoisers don't help.
  • Optional, for a voice that sounds a little tinny: an EQ plus ffmpeg aexciter (a synthesized top end) can make it a bit more vibrant. It's not a standard step and has no fixed settings: render two or three settings, put them next to the plain track on a review page, and let the person pick by ear.
  • Loudness: normalize the finished track to -16 LUFS once (ffmpeg-normalize-loudness), not each line.

Check it

Transcribe every take (elevenlabs-speech-to-text) and compare: the exact words, no tag read aloud, acronyms said right, and the pace (words per second) against what the scene needs. Once the person has picked the voice, a take that passes these checks needs no further approval.

Go make something cool.

Install the app, open your agent, describe the video. That's the whole onboarding.

Sticker HypernaturalSticker BannerSticker TVBoy