Nodes/ComfyUI-API-Toolkit/ElevenLabs - TTS with Timestamps
ComfyUI Node

ElevenLabs - TTS with Timestamps

TTS that tells you when every word lands — for lip sync and subtitles

By IxMxAMAR·Created 6 months ago·Updated 3 days ago· 1
ElevenLabs - TTS with Timestamps
    • audio
    • timestamps_json
    ◄api_key►
    ◄text►
    ◄voice_id►
    ◄modeleleven_v3►
    ◄stability0.50►
    ◄similarity_boost0.75►
    ◄output_formatmp3_44100_128►
    ◄seed0►
    ◄style0.00►
    ◄speed1.00►
    ◄use_speaker_boosttrue►
    ◄languageAuto Detect►
    ◄apply_text_normalizationauto►
    ◄previous_text►
    ◄next_text►

    Plain TTS gives you audio and nothing else. This node gives you the same audio plus a timestamps_json output - a per-word breakdown of when each word starts and ends. If your end goal is subtitles, a karaoke-style caption, or lip-syncing an avatar, that timing data is the whole game. It calls the ElevenLabs /with-timestamps endpoint and returns both halves in one shot.

    The inputs are a trimmed-down version of AIS_EL_TTS: text, voice_id, model (same eight-model list), plus stability, similarity_boost, output_format, and seed. No style, no speed, no language override - this node is built for getting words onto a timeline, not for sculpting a performance. For most work that's fine: the defaults (0.5 stability, 0.75 similarity) are the same sane starting points as the main TTS node, and you pass the same voice_id from the selector.

    Outputs:

    • audio - the generated speech as an AUDIO dict, identical to what AIS_EL_TTS produces.
    • timestamps_json - the word-level timing data as a JSON string.

    What the timestamps actually buy you

    The classic use is lip sync: feed the audio and the timestamps into a lip-sync stage (or align an avatar's viseme track to them) so the mouth lands on the right syllables. The second classic use is captioning - parse timestamps_json to emit an SRT or burn word-by-word captions into the video, and they'll match the speech exactly because they came from the same generation. If you're doing multi-language dubs, the timing lets you know whether the target language's words overrun the source clip before you commit to the render.

    The timing data comes back as JSON, so you'll want a node that can parse a JSON string into fields - pair it with any JSON-extract or show-text node to convert it into a usable caption format.

    Installing it

    Part of the ComfyUI API Toolkit pack (fifteen ElevenLabs nodes total). Manager: search "API Toolkit". Manual:

    cd ComfyUI/custom_nodes
    git clone https://github.com/IxMxAMAR/ComfyUI-API-Toolkit
    cd ComfyUI-API-Toolkit
    pip install -r requirements.txt
    

    Restart. Needs requests and soundfile.

    Gotchas

    • Because the timing must be returned by the API, this costs the same characters as regular TTS - the timestamps are not free metadata.
    • Timestamps are as accurate as the model's segmentation, which is generally good but not frame-perfect. For aggressive subtitle snapping you may want to nudge word boundaries.
    • Same credit-metered reality as every ElevenLabs node: for private or unlimited local TTS, open models are the counterweight; reach for this one when you specifically need the timing to line up with a video.
    CategoryAPI Toolkit/ElevenLabs/TTS

    Inputs (15)

    NameTypeDefaultDescription
    api_keySTRING—
    textSTRINGText to convert to speech with timing information.
    voice_idSTRINGVoice ID. Connect from Voice Selector or Fetch Voices node.
    modelCOMBOeleven_v37 options: eleven_v4, eleven_v3, eleven_multilingual_v2, eleven_flash_v2_5, eleven_turbo_v2_5, eleven_flash_v2, +1
    stabilityoptFLOAT0.500–1Voice stability. Lower = more expressive/emotional, Higher = more consistent/monotone. Creative(<0.5), Natural(0.5), Robust(>0.5).
    similarity_boostoptFLOAT0.750–1How closely AI adheres to the original voice. Too high may introduce artifacts.
    output_formatoptCOMBOmp3_44100_128Audio output format. mp3_44100_192 and opus require Creator tier+.
    seedoptINT00–4294967295Seed for reproducibility. 0 = random. Determinism not guaranteed.
    styleoptFLOAT0.000–1Style exaggeration. Increases expressiveness but reduces stability. Recommended: 0 for most use cases.
    speedoptFLOAT1.000.5–2Speech speed. 1.0 = normal, <1.0 = slower, >1.0 = faster.
    use_speaker_boostoptBOOLEANtrueBoost similarity to original speaker. Increases latency slightly. Only sent when disabled.
    languageoptCOMBOAuto DetectLanguage for the model. Auto Detect lets the model decide.
    apply_text_normalizationoptCOMBOautoText normalization: 'auto' = model decides, 'on' = always normalize, 'off' = skip.
    previous_textoptSTRINGText that came BEFORE this segment. Helps maintain natural flow across chunks.
    next_textoptSTRINGText that comes AFTER this segment. Helps the model anticipate pacing.

    Outputs (2)

    NameTypeDescription
    audioAUDIO—
    timestamps_jsonSTRING—