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-searchfinds them), as do the account's own voices.- The text with audio tags (below), written from the character's performance guide.
output_format:pcm_48000for anything that will be used (lossless, 16-bit mono; needs a paid tier). The API default ismp3_44100_128; it's fine for a throwaway audition but not for a track.- Optional:
seed(fix it to compare two directions fairly),voice_settingswithstability(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
speedsetting 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 withatempoup to 1.2, pitch kept (python-assemble-dialogue-trackretime). - 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.


