{ "providers": { "pocket": { "name": "Pocket TTS", "provider_id": "pocket", "cost_per_minute": 0.0, "quality": "high", "latency": "very-fast", "voices": [], "features": [ "voice-cloning", "local-processing", "no-api-key-required", "reusable-voice-state", "free" ], "requires_api_key": false, "status": "inactive", "description": "Pocket TTS (Kyutai) \u2014 $0 local voice cloning on the mac-node video/voice node. Clones a per-client brand voice from a ~10-20s reference clip into a reusable .safetensors state, then generates VO clips (~2-3s each). Client-facing via this Voice Cloning Studio canvas; jobs route to the mac agent over the Syncthing Dropzone bridge.", "documentation_url": "https://github.com/kyutai-labs/pocket-tts", "languages": [ "en" ], "max_characters": 600, "notes": "Self-hosted on the mac-node node (handle_voice_clone). status=inactive until the OVU->mesh Dropzone bridge (POST /api/voice-clone/submit + result ingest) is wired; the studio card stays hidden while inactive, then auto-reveals like qwen3-local. Guardrail: dedicated deterministic handler, source-allowlisted the host agent, NOT the permissionless claude path.", "requires_microphone": false, "requires_websocket": false, "mode": "tts-only" }, "hume": { "name": "Hume Octave", "provider_id": "hume", "cost_per_minute": 0.2, "quality": "very-high", "latency": "medium", "voices": [], "features": [ "acting-direction", "voice-design", "emotion-control", "wav-output" ], "requires_api_key": true, "status": "active", "description": "Hume Octave \u2014 acting-direction TTS. Per-utterance description directs the performance; custom voices are designed (describe \u2192 generate \u2192 save). Also the performance-donor stage for Resemble STS character pipelines.", "documentation_url": "https://dev.hume.ai/docs/text-to-speech-tts/overview", "languages": [ "en", "es", "fr", "de", "it", "pt", "ja", "ko", "zh" ], "max_characters": 5000, "notes": "REST /v0/tts (no websocket needed). HUME_API_KEY env + optional HUME_VOICE default. Cloudflare blocks non-browser User-Agents (403/1010) \u2014 provider sends a browser UA. save_voice(generation_id, name) keeps a take as a custom voice." }, "supertonic": { "name": "Supertonic TTS", "provider_id": "supertonic", "cost_per_minute": 0.0, "quality": "high", "latency": "very-fast", "voices": [ "M1", "M2", "M3", "M4", "M5", "F1", "F2", "F3", "F4", "F5" ], "features": [ "multi-language", "local-processing", "open-source", "no-api-key-required", "onnx-based" ], "requires_api_key": false, "status": "active", "description": "Local ONNX-based TTS engine with multiple voice styles", "documentation_url": "https://github.com/playht/supertonic", "languages": [ "en", "ko", "es", "pt", "fr" ], "max_characters": 10000, "notes": "Free, fast, local inference. Default provider.", "requires_microphone": false, "requires_websocket": false, "mode": "tts-only" }, "qwen3": { "name": "Qwen3-TTS (fal.ai)", "provider_id": "qwen3", "cost_per_minute": 0.003, "quality": "very-high", "latency": "fast", "voices": [ "Vivian", "Serena", "Dylan", "Eric", "Ryan", "Aiden", "Uncle_Fu", "Ono_Anna", "Sohee" ], "features": [ "multilingual", "expressive", "voice-cloning", "emotion-control", "cloud", "mp3-output" ], "requires_api_key": true, "status": "active", "description": "Qwen3-TTS via fal.ai \u2014 voice cloning, emotion control, multilingual, 10 languages", "languages": [ "en", "zh", "es", "fr", "de", "it", "ja", "ko", "pt", "ru" ], "max_characters": 5000, "notes": "Voice cloning: POST /api/tts/clone with audio sample. Use cloned voice_id in /api/tts/generate. FAL_KEY required.", "clone_endpoint": "/api/tts/clone", "clone_cost_per_minute": 0.0008, "requires_microphone": false, "requires_websocket": false, "mode": "tts-only", "audio_format": "mp3", "sample_rate": 24000 }, "qwen3-local": { "name": "Qwen3-TTS (local GPU)", "provider_id": "qwen3-local", "cost_per_minute": 0.0, "quality": "very-high", "latency": "fast", "voices": [], "features": [ "voice-cloning", "multilingual", "local-gpu", "free", "mp3-output", "no-api-key" ], "requires_api_key": false, "status": "active", "description": "Qwen3-TTS-1.7B on residential RTX 3070 GPU \u2014 free, no API cost. Cloned voices only. Requires laptop + tunnel to be up.", "languages": [ "en", "zh", "es", "fr", "de", "it", "ja", "ko", "pt", "ru" ], "max_characters": 5000, "notes": "Free local GPU inference via reverse SSH tunnel. Cloned voices only (.pt). Auto-disabled when laptop offline \u2014 falls back to qwen3 (fal.ai). OVUI_BRIDGE_AUTH_TOKEN required.", "clone_endpoint": "/api/tts/clone", "requires_microphone": false, "requires_websocket": false, "mode": "tts-only", "audio_format": "mp3", "sample_rate": 24000 }, "qwen3-gpu": { "name": "Qwen3-TTS (GPU lane)", "provider_id": "qwen3-gpu", "cost_per_minute": 0.0, "quality": "very-high", "latency": "medium", "voices": [], "features": [ "voice-cloning", "remote-gpu", "free", "wav-output" ], "requires_api_key": false, "status": "active", "description": "Qwen3-TTS-12Hz-1.7B-Base on the GPU lane (res-desktop-gpu) via the vcg endpoint over the tailnet. Tenant-scoped clones only.", "languages": [ "en" ], "max_characters": 600, "notes": "OPT-IN PER TENANT, never a default: offered only when the tenant's voice-clones/_seam/policy.json lists qwen3-gpu AND the container holds a bearer at /app/runtime/secrets/vcg.token (read per request; missing = unavailable, no network call). Clones need a consent record and a reference transcript. Wire: mac-claude voice-clone-gpu-wire-v0 + vcg-build-v0.1.", "clone_endpoint": "/api/tts/clone", "requires_microphone": false, "requires_websocket": false, "mode": "tts-only", "audio_format": "wav", "sample_rate": 24000 }, "qwen3-mlx": { "name": "Qwen3-TTS (MLX node)", "provider_id": "qwen3-mlx", "cost_per_minute": 0.0, "quality": "very-high", "latency": "fast", "voices": [], "features": [ "voice-cloning", "self-hosted", "free", "wav-output", "no-api-key" ], "requires_api_key": false, "status": "active", "description": "Qwen3-TTS on a self-hosted Apple-silicon (mlx-audio) node over HTTP. One request per sentence, allow-listed reference voices only.", "languages": [ "en" ], "max_characters": 5000, "notes": "QWEN_MLX_TTS_URL + QWEN_MLX_TTS_VOICES (allow-list, fail closed) required; QWEN_MLX_TTS_DENY_PREFIXES optional. Unset URL = inert. Server down = falls back via config/tts-fallback.json (qwen3-mlx -> groq -> supertonic).", "requires_microphone": false, "requires_websocket": false, "mode": "tts-only", "audio_format": "wav", "sample_rate": 24000 }, "resemble": { "name": "Resemble AI (Chatterbox)", "provider_id": "resemble", "cost_per_minute": 0.1, "quality": "very-high", "latency": "very-fast", "voices": [], "features": [ "streaming", "voice-cloning", "emotion-control", "ssml", "multilingual", "cloud", "wav-output", "paralinguistic-tags" ], "requires_api_key": true, "status": "active", "description": "Resemble AI Chatterbox \u2014 streaming TTS, voice cloning, emotion/exaggeration control, SSML, 90+ languages", "documentation_url": "https://docs.resemble.ai", "languages": [ "en", "es", "fr", "de", "it", "pt", "ja", "ko", "zh", "ar", "ru", "hi", "nl", "pl", "sv", "da", "fi", "el", "cs", "hu", "ro", "tr", "uk", "vi", "th", "id" ], "max_characters": 2000, "notes": "Models: chatterbox-turbo (fastest, paralinguistic tags), chatterbox (emotion/exaggeration), chatterbox-multilingual (23 langs). Voice cloning via Resemble dashboard. RESEMBLE_API_KEY + RESEMBLE_VOICE_UUID required.", "requires_microphone": false, "requires_websocket": false, "mode": "tts-only", "audio_format": "wav", "sample_rate": 24000 }, "elevenlabs": { "name": "ElevenLabs", "provider_id": "elevenlabs", "cost_per_minute": 0.3, "quality": "premium", "latency": "fast", "voices": [], "features": [ "voice-cloning", "multilingual", "streaming", "emotion-control", "cloud", "mp3-output" ], "requires_api_key": true, "status": "active", "description": "ElevenLabs \u2014 premium TTS with instant voice cloning, multilingual, emotion control", "languages": [ "en", "es", "fr", "de", "it", "pt", "ja", "ko", "zh", "ar", "ru", "hi", "pl", "tr", "nl", "sv" ], "max_characters": 5000, "notes": "Premium quality. Models: eleven_multilingual_v2 (default), eleven_turbo_v2_5 (faster). ELEVENLABS_API_KEY required. Voices populated dynamically from API.", "requires_microphone": false, "requires_websocket": false, "mode": "tts-only", "audio_format": "mp3", "sample_rate": 44100 }, "groq": { "name": "Groq Orpheus", "provider_id": "groq", "cost_per_minute": 0.05, "quality": "high", "latency": "very-fast", "voices": [ "autumn", "diana", "hannah", "austin", "daniel", "troy" ], "features": [ "streaming", "natural", "empathetic", "cloud", "mp3-output" ], "requires_api_key": true, "status": "active", "description": "Orpheus TTS (canopylabs/orpheus-v1-english) via Groq LPU \u2014 ~130-200ms, very natural", "languages": [ "en" ], "max_characters": 5000, "notes": "~130-200ms latency on Groq LPU. Natural human-like prosody. GROQ_API_KEY required.", "requires_microphone": false, "requires_websocket": false, "mode": "tts-only", "audio_format": "mp3", "sample_rate": 24000 }, "grok": { "name": "Grok / xAI TTS", "provider_id": "grok", "cost_per_minute": 0.0, "quality": "high", "latency": "fast", "voices": [ "eve", "ara", "rex", "sal", "leo" ], "features": [ "streaming", "websocket", "multilingual", "cloud" ], "requires_api_key": true, "status": "inactive", "description": "Grok / xAI text-to-speech (api.x.ai). Unary REST plus a websocket streaming path.", "documentation_url": "https://docs.x.ai/developers/model-capabilities/audio/text-to-speech", "languages": [ "en" ], "max_characters": 5000, "notes": "XAI_API_KEY required; inactive and inert until it is set. Contributed via the Bartok9 fork. Pricing not pinned here \u2014 check xAI's current rates.", "requires_microphone": false, "requires_websocket": false, "mode": "tts-only" } }, "default_provider": "supertonic", "version": "1.2.0", "last_updated": "2026-02-21" }