Add to Claude
VoiceLabs
API ReferenceGeneration

Create speech (OpenAI-compatible)

The OpenAI `POST /v1/audio/speech` contract, served by VoiceLabs. Point any OpenAI SDK at `https://app.voicelabs.now/v1` as its base URL and pass a VoiceLabs API key as the API key — no other change is needed. Unlike `POST /v1/speech` this endpoint is SYNCHRONOUS: it holds the response open until the audio is ready and returns the bytes, because that is the contract an OpenAI client is written against. Every parameter VoiceLabs cannot honour is refused with a 400 naming it rather than accepted and ignored. Two parameters OpenAI does not define are accepted as VoiceLabs extensions and forwarded: `seed`, which makes a take reproducible, and `temperature`, which only the `chatterbox` and `chatterbox_turbo` engines honour — every other engine refuses it with `400` rather than discarding it. An OpenAI SDK reaches them through its own escape hatch for non-OpenAI parameters (`extra_body` in the Python client). Errors on this endpoint use OpenAI's `{"error": {...}}` envelope instead of the RFC 9457 problem document the rest of /v1 returns, so an OpenAI SDK raises a typed exception with a readable message; the `code` member still carries this API's own stable error token. Requires the `voice:generate` scope.

POST
/v1/audio/speech

The OpenAI POST /v1/audio/speech contract, served by VoiceLabs. Point any OpenAI SDK at https://app.voicelabs.now/v1 as its base URL and pass a VoiceLabs API key as the API key — no other change is needed. Unlike POST /v1/speech this endpoint is SYNCHRONOUS: it holds the response open until the audio is ready and returns the bytes, because that is the contract an OpenAI client is written against. Every parameter VoiceLabs cannot honour is refused with a 400 naming it rather than accepted and ignored. Two parameters OpenAI does not define are accepted as VoiceLabs extensions and forwarded: seed, which makes a take reproducible, and temperature, which only the chatterbox and chatterbox_turbo engines honour — every other engine refuses it with 400 rather than discarding it. An OpenAI SDK reaches them through its own escape hatch for non-OpenAI parameters (extra_body in the Python client). Errors on this endpoint use OpenAI's {"error": {...}} envelope instead of the RFC 9457 problem document the rest of /v1 returns, so an OpenAI SDK raises a typed exception with a readable message; the code member still carries this API's own stable error token.

Requires the voice:generate scope.

Authorization

x-api-key<token>

A VoiceLabs API key, sent in the x-api-key header. Keys begin with vl_sandbox_. This is the simplest way to authenticate and is what most callers should use.

Create one in the developer console at https://voicelabs.now/connections, on the API keys tab, choosing the scopes it carries. A key does exactly what its scopes allow: one without voice:generate is answered 403 insufficient_scope on the generation operations and cannot spend the account's allowance. The secret is shown once, at creation; revoking a key takes effect on its very next request.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

audio/*

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/audio/speech" \  -H "Content-Type: application/json" \  -d '{    "model": "qwen",    "input": "string",    "voice": "string"  }'
"string"