elevenlabs_tts

Generates audio from text using the ElevenLabs text-to-speech API.

Tip: The media processor's elevenlabs preset speaks text through the same service and places the result itself, with no separate audio step needed. See media and 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_KEY set in your workspace's Service API Keys.
  • Always run transcript_aiprep with target: "elevenlabs" before this step.
  • Use cache: true: generation is deterministic for the same text and params.
  • generate_transcript takes the same step: reference for its source: 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.