Skip to main content

ElevenLabs Eleven v4 / v4 Turbo (Text-to-Speech)

Eleven v4 and Eleven v4 Turbo are ElevenLabs' text-to-speech models, called via their first-party REST API. This is OpenTryOn's first tts service -- previously there was no speech modality in the registry at all.

Useful on its own (voiceover/narration for lookbook or product copy), or as an input to Pruna P-Video-Avatar (which accepts a pre-generated --audio file) for a talking-head clip with a specific branded/cloned voice.

A second TTS vendor is available: Gemini 3.8 Flash TTS (gemini-3.8-flash-tts, gemini-3.8-flash-lite-tts, GEMINI_API_KEY) with 30 prebuilt voices and two-speaker dialogue.

Capabilities​

Capabilityeleven-v4eleven-v4-turbo
Character limit10,000 (~10 min of audio)Not explicitly capped
LatencyNot optimized for real-time~100ms median inference
Languages90+90+
StyleMost emotionally rich / expressiveAdds audio tags for delivery control, e.g. [whispers], [laughs]
Voice cloningYes (via voice_id)Yes (via voice_id)
Output formatsmp3, wav, pcm, opus, µ-law, A-law at various sample rates/bitratesSame

Both models are billed per character; see elevenlabs.io/pricing/api for current rates.

Prerequisites​

  1. ElevenLabs account and API key: elevenlabs.io/app/settings/api-keys
  2. Set ELEVENLABS_API_KEY in your .env file
  3. Optional base URL override via ELEVENLABS_BASE_URL
ELEVENLABS_API_KEY=your_elevenlabs_api_key
# ELEVENLABS_BASE_URL=https://api.elevenlabs.io # default

Voices​

The adapter defaults voice_id to ElevenLabs' premade "Rachel" voice (21m00Tcm4TlvDq8ikWAM) so you can try it without first looking one up. Browse or clone voices at elevenlabs.io/app/voice-library, or list your account's voices with GET /v1/voices (not wrapped by this adapter -- use ElevenLabs' own SDK/dashboard for voice management; this adapter is generation-only).

Installation​

No extra install -- the adapter only uses requests, already a core opentryon dependency.

Quick Start​

from tryon.api.elevenlabs import ElevenLabsAdapter

adapter = ElevenLabsAdapter() # eleven_v4 by default

audio = adapter.generate_speech(
"Welcome to the spring collection.",
voice_id="21m00Tcm4TlvDq8ikWAM", # optional; this is the default
)
open("voiceover.mp3", "wb").write(audio)

Eleven v4 Turbo with audio tags​

turbo = ElevenLabsAdapter(model="eleven_v4_turbo")
audio = turbo.generate_speech("[whispers] New drop just landed.")
open("teaser.mp3", "wb").write(audio)

CLI​

opentryon tts --model eleven-v4 --text "Welcome to the spring collection."

opentryon tts --model eleven-v4-turbo \
--text "[whispers] New drop just landed." \
--voice-id 21m00Tcm4TlvDq8ikWAM --output-format wav_44100

opentryon tts --model eleven-v4 --text "Bonjour et bienvenue." --language-code fr

opentryon writes the result with an extension sniffed from the actual audio bytes (.mp3/.wav/.opus; headerless formats like raw PCM or µ-law fall back to .raw), not from the requested --output-format string, so it's always correct even if a request is retried with a different format.

FlagNotes
--text / -tRequired. Eleven v4: up to 10,000 characters
--voice-idDefault: premade "Rachel" (21m00Tcm4TlvDq8ikWAM)
--output-formatCodec/sample-rate/bitrate; default mp3_44100_128
--language-codeOptional ISO 639-1 code to force text normalization
--stability / --similarity-boost / --style / --speedVoice settings (0-1 range, except --speed)
--no-speaker-boostDisable enhanced speaker similarity
--seedOptional deterministic-sampling seed

MCP​

Same registry models appear as MCP tools (no extra wiring):

  • tts_eleven_v4 / tts_eleven_v4_turbo — ElevenLabs API (ELEVENLABS_API_KEY)

See MCP Server and mcp-server/README.md.

Studio note: tts is a brand-new service category, so it does not yet have a dedicated capability picker screen in TryOn Studio (those are currently Image / VTON / Understand / Video / BG Remove). The MCP tools are live and callable (e.g. via Studio's Agent chat) as soon as the MCP server restarts; a dedicated Studio screen would be a separate tryon-studio-side change.

API Reference​

ElevenLabsAdapter​

class ElevenLabsAdapter:
def __init__(
self,
api_key: Optional[str] = None, # ELEVENLABS_API_KEY
model: str = "eleven_v4", # or "eleven_v4_turbo"
base_url: Optional[str] = None, # ELEVENLABS_BASE_URL or the default
)

generate_speech​

def generate_speech(
self,
text: str,
voice_id: str = "21m00Tcm4TlvDq8ikWAM",
model: Optional[str] = None,
output_format: str = "mp3_44100_128",
language_code: Optional[str] = None,
stability: float = 0.5,
similarity_boost: float = 0.75,
style: float = 0.0,
speed: float = 1.0,
use_speaker_boost: bool = True,
seed: Optional[int] = None,
) -> bytes

Returns raw audio bytes (content type matches output_format). This is what opentryon tts --model eleven-v4 calls.

References​