elevenlabs_tts
Generates audio from text using the ElevenLabs text-to-speech API.
Tip: The
mediaprocessor'selevenlabspreset speaks text through the same service and places the result itself, with no separateaudiostep needed. Seemediaand Bring your own media service.
When to use
Use to generate high-quality voice-over audio from a script.
Important: elevenlabs_tts produces an audio file, not clips on the timeline. It does not place itself. A voiceover therefore takes three steps: this one to speak the script, an audio step to put the result on a timeline level, and a generate_transcript step if you want captions from it. Both of those take this step as a step: input; neither needs to know where the audio was written.
In the editor
Add it from the Library (Audio group), or with + add step and a search for elevenlabs_tts, after the step that prepared your script.
Under Inputs, add source as a step input pointing at your transcript_aiprep step, or as a file input naming a text file. voice_id is required, and the Inspector marks it with a red asterisk: it is the voice from your ElevenLabs account. model picks the engine, speed the pace, and stability with similarity_boost trade consistency against expressiveness.
This step needs your own ElevenLabs key. Add it in the workspace's Variables & Service API Keys, from the editor's Settings. A run that needs a key you have not set is refused before it starts.
Now add the two steps that use it. An audio step with a source step input pointing at this one, auto_duration on and loop off, places the narration on an audio level. A generate_transcript step with a source step input pointing at this one gives you words with timings for captions. Because both are wired as steps rather than files, changing the script re-runs everything that depends on it, with no bookkeeping on your part.
Your voice level has to exist before you can select it: add it under Settings, as an audio level marked as the backbone, so the length of the video follows the narration.
After the run, the narration appears as a clip on that audio level, and you can hear it in the preview.
YAML Example: complete voiceover pipeline
# 1. Generate the voiceover
- id: voiceover
processor: elevenlabs_tts
input:
- id: source
step: prep_script # must be a transcript_aiprep step (outputs Analysis.Source)
params:
voice_id: "your-voice-id"
model: eleven_v3
stability: 0.5
similarity_boost: 0.75
speed: 1.0
cache: true
# 2. Place the generated audio on the audio backbone level
# (elevenlabs_tts does NOT do this itself; an audio step is required)
- id: place_vo
processor: audio
input:
- id: source
step: voiceover # reads the audio the step generated
params:
loop: false
auto_duration: true
gain_db: 0
output:
timeline: vo_audio # must be a backbone: true, type: audio level
cache: true
# 3. Transcribe for captions: same step reference
- id: transcribe_vo
processor: generate_transcript
input:
- id: source
step: voiceover
params:
language: "en"
cache: true
A step: input carries the dependency with it, so neither of these needs
cache_deps: [voiceover]: rewriting the script re-runs the voice step, and
both of these follow.
Timeline level required
The timeline must declare an audio backbone level for place_vo to target:
timeline:
levels:
- name: vo_audio
order: 1
type: audio
backbone: true
- name: main
order: 2
type: video
backbone: false
Required secrets
ELEVENLABS_API_KEY: set in workspace or template secrets. A run whose pipeline includes this processor is refused before it starts if the key is missing; the web UI prompts for it.
Inputs
| ID | Source | Description |
|---|---|---|
source |
step or file | Text content to speak. Step input must be a transcript_aiprep output (uses Analysis.Source); file input reads the text file directly. Do NOT pass a write_script step directly; its output type is Script, not Analysis. |
segment_plan |
step (optional) | A SegmentPlan (e.g. from video_director) constraining which segments get voiced. |
Params
| Param | Type | Default | Description |
|---|---|---|---|
voice_id |
string | none | ElevenLabs voice ID |
model |
select: eleven_v3, eleven_multilingual_v2, eleven_turbo_v2_5 |
"eleven_v3" |
ElevenLabs model ID |
output_format |
select: mp3_44100_128, mp3_44100_192, pcm_16000, pcm_22050, pcm_44100 |
"mp3_44100_128" |
Audio output format |
stability |
number | none | Voice stability (0–1). Higher = more consistent, less expressive. |
similarity_boost |
number | none | Similarity to original voice (0–1) |
style |
number | none | Style exaggeration (0–1) |
speed |
number | 1 |
Speaking speed multiplier |
speaker_boost |
bool | none | Enhance speaker clarity |
Output
Analysis referencing the generated audio file. In the normal path this is not an EditDecision; it does not go on the timeline by itself. Place it with a follow-up audio step taking step: <this step's id> as its source, which resolves to the generated audio without you naming a path.
When a segment_plan input is wired (plan mode), the step instead returns EditDecisions placed directly on output.timeline for the planned segments.
Notes
- Requires an
ELEVENLABS_API_KEYset in your workspace's Service API Keys. - Always run
transcript_aiprepwithtarget: "elevenlabs"before this step. - Use
cache: true: generation is deterministic for the same text and params. generate_transcripttakes the samestep:reference for itssource: it reads the audio this step generated. Referring to the file by name is neither necessary nor advisable, since the location is not yours to depend on.