# Chatterbox HD TTS > Turn text into high-definition speech with nine named voices or a cloned voice, plus an optional 48kHz upscale toggle for higher-fidelity audio. ## Overview - **Endpoint**: `https://queue.modelrunner.run/resemble-ai/chatterboxhd/text-to-speech` - **Model ID**: `resemble-ai/chatterboxhd/text-to-speech` - **Category**: sound - **Kind**: inference - **Tags**: resemble-ai, chatterboxhd, chatterbox, text-to-speech, tts, voice-cloning, voice, audio, speech, high-definition ## Pricing - **Price**: $0.0006 per output second ## Request Lifecycle This model runs on the ModelRunner **asynchronous queue API** — a single POST does not return the output. Every call requires an `Authorization: Key $MODEL_RUNNER_KEY` header. Run three steps: 1. **Submit** — `POST https://queue.modelrunner.run/resemble-ai/chatterboxhd/text-to-speech` with a JSON body. The response carries request handles only (no output yet): ```json { "status": "IN_QUEUE", "request_id": "<21-char id>", "status_url": "https://queue.modelrunner.run/resemble-ai/chatterboxhd/text-to-speech/requests//status", "response_url": "https://queue.modelrunner.run/resemble-ai/chatterboxhd/text-to-speech/requests/", "cancel_url": "https://queue.modelrunner.run/resemble-ai/chatterboxhd/text-to-speech/requests//cancel" } ``` 2. **Poll status** — `GET ` until `status` is `COMPLETED`. Possible values are `IN_QUEUE`, `IN_PROGRESS`, `COMPLETED`, `FAILED`, `CANCELLED`. A `FAILED` request responds with HTTP 400 and an `error` field. 3. **Read result** — `GET `. Returns the finished request, including the generated `output`: ```json { "id": "", "status": "COMPLETED", "output": ..., "input": ... } ``` The JavaScript and Python SDKs below perform steps 2–3 for you. In any language without an SDK (Swift, Go, Kotlin, etc.) you must implement the polling loop and the final result fetch yourself — see the cURL example for the full flow. ### Input Schema - **`cfg`** (`number`, _optional_): Classifier-free guidance weight controlling the conditioning factor. For expressive or dramatic speech, try lower values (e.g. ~0.3) and increase exaggeration to around 0.7 or higher. If the reference speaker has a fast speaking style, lowering cfg to around 0.3 can improve pacing. - Default: `0.5` - Range: `0` to `1` - **`seed`** (`integer`, _optional_): Random seed for reproducibility. Set a fixed integer to repeat a generation; 0 uses a random seed. - Default: `0` - Range: `0` to `"+inf"` - **`text`** (`string`, _required_): The text to synthesize into speech. - **`voice`** (`VoiceEnum`, _optional_): The named voice to speak the text. If a reference clip is provided in audio_url it overrides this setting; if both are left unset a random voice is used. - Default: `"Aurora"` - Options: `"Aurora"`, `"Blade"`, `"Britney"`, `"Carl"`, `"Cliff"`, `"Richard"`, `"Rico"`, `"Siobhan"`, `"Vicky"` - **`audio_url`** (`string`, _optional_): Optional reference recording for zero-shot voice cloning. Provide a clean, single-speaker clip to clone that voice; it overrides the voice selection. Leave unset to use the named voice. - **`temperature`** (`number`, _optional_): Sampling temperature controlling the randomness of generation. Lower is steadier and more predictable; higher adds variation to prosody and delivery. - Default: `0.8` - Range: `0.05` to `5` - **`exaggeration`** (`number`, _optional_): Emotion and intensity exaggeration. Higher values produce more dramatic, expressive delivery; lower values are calmer and more measured. - Default: `0.5` - Range: `0.25` to `2` - **`high_quality_audio`** (`boolean`, _optional_): When true, the generated audio is upscaled to 48kHz for higher quality at the cost of longer generation time. When false, the audio is 24kHz. - Default: `false` ### Output Schema _No `Output` schema properties are available._ ## Default Example **Input** ```json { "cfg": 0.5, "seed": 0, "text": "In just three days, the northern lights will blaze across the Arctic sky. Reserve your aurora expedition before the season ends.", "voice": "Aurora", "temperature": 0.8, "exaggeration": 0.5, "high_quality_audio": true } ``` **Output** ```json "https://media.modelrunner.ai/phoGPqzJg7SqtVibiY4eN.wav" ``` ## Usage Examples ### cURL The queue API is asynchronous: submit the request, poll `status_url` until it is `COMPLETED`, then read the result from `response_url`. Requires `jq`. ```bash # 1. Submit the request (returns request handles, not the output) SUBMIT=$(curl --silent --request POST \ --url https://queue.modelrunner.run/resemble-ai/chatterboxhd/text-to-speech \ --header "Authorization: Key $MODEL_RUNNER_KEY" \ --header "Content-Type: application/json" \ --data '{ "cfg": 0.5, "seed": 0, "text": "In just three days, the northern lights will blaze across the Arctic sky. Reserve your aurora expedition before the season ends.", "voice": "Aurora", "temperature": 0.8, "exaggeration": 0.5, "high_quality_audio": true }') STATUS_URL=$(echo "$SUBMIT" | jq -r '.status_url') RESPONSE_URL=$(echo "$SUBMIT" | jq -r '.response_url') # 2. Poll until the request leaves the queue / in-progress state while true; do STATUS=$(curl --silent --url "$STATUS_URL" \ --header "Authorization: Key $MODEL_RUNNER_KEY" | jq -r '.status') echo "Status: $STATUS" case "$STATUS" in COMPLETED) break ;; FAILED|CANCELLED) echo "Request $STATUS"; exit 1 ;; esac sleep 1 done # 3. Read the finished request, including the generated output curl --silent --url "$RESPONSE_URL" \ --header "Authorization: Key $MODEL_RUNNER_KEY" ``` ### JavaScript ```javascript import { modelrunner } from "@modelrunner/client"; const result = await modelrunner.subscribe("resemble-ai/chatterboxhd/text-to-speech", { input: { "cfg": 0.5, "seed": 0, "text": "In just three days, the northern lights will blaze across the Arctic sky. Reserve your aurora expedition before the season ends.", "voice": "Aurora", "temperature": 0.8, "exaggeration": 0.5, "high_quality_audio": true } }); console.log(result.data); ``` ### Python ```python import asyncio import modelrunner_ai async def main(): response = await modelrunner_ai.submit_async( "resemble-ai/chatterboxhd/text-to-speech", arguments={ "cfg": 0.5, "seed": 0, "text": "In just three days, the northern lights will blaze across the Arctic sky. Reserve your aurora expedition before the season ends.", "voice": "Aurora", "temperature": 0.8, "exaggeration": 0.5, "high_quality_audio": true } ) result = await response.get() print(result["output"]) asyncio.run(main()) ``` ## Additional Resources - [Playground](https://modelrunner.ai/models/resemble-ai/chatterboxhd/text-to-speech) - [OpenAPI Schema](https://modelrunner.ai/models/resemble-ai/chatterboxhd/text-to-speech/openapi.json) - [LLM Instructions](https://modelrunner.ai/models/resemble-ai/chatterboxhd/text-to-speech/llms.txt)