---
title: Voice & TTS
description: Text-to-speech and voice cloning on elizaOS Cloud.
---
# Voice & TTS
Text-to-speech generation and voice cloning capabilities.
**API Key Support:** `/api/v1/voice/*` endpoints support both session-based authentication and API key authentication.
Legacy `/api/elevenlabs/*` endpoints are session-based only.
## Endpoint Patterns
Voice APIs are available at two paths:
| Pattern | Description | Auth | Use Case |
|---------|-------------|------|----------|
| `/api/v1/voice/*` | **Recommended** - Generic, provider-agnostic endpoints | Session or API key | New integrations, programmatic access |
| `/api/elevenlabs/*` | Legacy endpoints (still supported) | Session only | Existing integrations, backwards compatibility |
API key authentication is available only on `/api/v1/voice/*`. Legacy `/api/elevenlabs/*` endpoints require session-based auth and do not accept API keys.
---
## Text to Speech
POST
/api/v1/voice/tts
Legacy path: `/api/elevenlabs/tts` (still supported for backwards compatibility)
Convert text to speech audio using premium AI voices.
```bash
curl -X POST "https://elizacloud.ai/api/v1/voice/tts" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "Hello, this is a test of the text to speech system.",
"voiceId": "21m00Tcm4TlvDq8ikWAM",
"modelId": "eleven_multilingual_v2"
}' \
--output speech.mp3
```
```javascript
const response = await fetch('https://elizacloud.ai/api/v1/voice/tts', {
method: 'POST',
headers: {
'X-API-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
text: 'Hello, this is a test.',
voiceId: '21m00Tcm4TlvDq8ikWAM',
modelId: 'eleven_multilingual_v2',
}),
});
const audioBlob = await response.blob();
const audioUrl = URL.createObjectURL(audioBlob);
```
```python
import requests
response = requests.post(
'https://elizacloud.ai/api/v1/voice/tts',
headers={
'X-API-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
json={
'text': 'Hello, this is a test.',
'voiceId': '21m00Tcm4TlvDq8ikWAM',
'modelId': 'eleven_multilingual_v2',
}
)
with open('speech.mp3', 'wb') as f:
f.write(response.content)
```
### Parameters
| Parameter | Type | Required | Description |
| ------------------ | ------ | -------- | ------------------------------------------- |
| `text` | string | ✓ | Text to convert to speech (max 5000 chars) |
| `voiceId` | string | ✓ | Voice ID to use (see List Voices) |
| `modelId` | string | | Model ID. Default: `eleven_multilingual_v2` |
| `stability` | number | | Voice stability (0-1). Default: 0.5 |
| `similarity_boost` | number | | Voice similarity (0-1). Default: 0.75 |
### Available Models
| Model | Languages | Quality | Speed |
| ------------------------ | --------- | ------- | ------- |
| `eleven_multilingual_v2` | 29 | Highest | Medium |
| `eleven_turbo_v2_5` | 32 | High | Fast |
| `eleven_flash_v2_5` | 32 | High | Fast |
| `eleven_v3` | Multi | Highest | Medium |
Voice pricing is refreshed separately from the text/image/video catalogs. TTS
is billed per character, STT per decoded audio duration, and voice cloning by
clone tier.
### Response
Returns audio data as `audio/mpeg` stream. The `Content-Length` header indicates file size.
---
## Speech to Text
POST
/api/v1/voice/stt
Legacy path: `/api/elevenlabs/stt` (still supported for backwards compatibility)
Transcribe audio to text.
### Request
Upload audio as `multipart/form-data`:
```bash
curl -X POST "https://elizacloud.ai/api/v1/voice/stt" \
-H "X-API-Key: YOUR_API_KEY" \
-F "audio=@recording.mp3"
```
### Response
Returns JSON with `transcript` and `duration_ms`.
| Field | Type | Description |
|-------|------|-------------|
| `transcript` | string | Transcribed text |
| `duration_ms` | number | Audio duration in milliseconds |
```json
{
"transcript": "Hello, this is a transcription test.",
"duration_ms": 3245
}
```
---
## List Voices
GET
/api/v1/voice/list
Legacy path: `/api/elevenlabs/voices/user` (still supported for backwards compatibility)
Get your cloned voices with pagination and filtering.
### Query Parameters
| Parameter | Type | Description |
|-----------|------|-------------|
| `includeInactive` | boolean | Include inactive voices (default: false) |
| `cloneType` | string | Filter by `instant` or `professional` |
| `limit` | number | Results per page (default: 50, max: 100) |
| `offset` | number | Pagination offset |
### Response
```json
{
"success": true,
"voices": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"elevenlabsVoiceId": "xyz789",
"name": "My Custom Voice",
"description": "A professional voice clone",
"cloneType": "instant",
"sampleCount": 3,
"usageCount": 150,
"isActive": true,
"createdAt": "2024-01-15T10:30:00Z"
}
],
"total": 5,
"limit": 50,
"offset": 0,
"hasMore": false
}
```
---
## Clone Voice
POST
/api/v1/voice/clone
Legacy path: `/api/elevenlabs/voices/clone` (still supported for backwards compatibility)
Create a voice clone from audio samples.
### Request
Upload audio samples as `multipart/form-data`:
```bash
curl -X POST "https://elizacloud.ai/api/v1/voice/clone" \
-H "X-API-Key: YOUR_API_KEY" \
-F "name=My Voice" \
-F "cloneType=instant" \
-F "file0=@sample1.mp3" \
-F "file1=@sample2.mp3"
```
### Response
```json
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "My Voice",
"status": "processing"
}
```
**Voice Cloning Tips:** - Provide 1-5 minutes of clear audio for best results
- Use high-quality recordings with minimal background noise - Speaking clearly
and at a natural pace produces better clones - Multiple samples in different
contexts improve voice quality
---
## Get Voice
GET
/api/v1/voice/{"{id}"}
Legacy path: `/api/elevenlabs/voices/{id}` (still supported for backwards compatibility)
Get details for a specific voice by its internal UUID.
```bash
curl "https://elizacloud.ai/api/v1/voice/123e4567-e89b-12d3-a456-426614174000" \
-H "X-API-Key: YOUR_API_KEY"
```
---
## Update Voice
PATCH
/api/v1/voice/{"{id}"}
Update a voice's metadata.
```bash
curl -X PATCH "https://elizacloud.ai/api/v1/voice/123e4567-e89b-12d3-a456-426614174000" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Updated Voice Name", "isActive": true}'
```
---
## Delete Voice
DELETE
/api/v1/voice/{"{id}"}
Legacy path: `/api/elevenlabs/voices/{id}` (still supported for backwards compatibility)
Delete a cloned voice from your account.
```bash
curl -X DELETE "https://elizacloud.ai/api/v1/voice/123e4567-e89b-12d3-a456-426614174000" \
-H "X-API-Key: YOUR_API_KEY"
```
### Response
```json
{
"success": true,
"message": "Voice deleted successfully"
}
```
---
## Voice Cloning Jobs
GET
/api/v1/voice/jobs
Legacy path: `/api/elevenlabs/voices/jobs` (still supported for backwards compatibility)
Check status of active voice cloning jobs.
### Response
```json
{
"success": true,
"jobs": [
{
"id": "job_xyz789",
"voiceName": "My Voice",
"jobType": "instant",
"status": "processing",
"progress": 50,
"createdAt": "2024-01-15T10:30:00Z"
}
],
"total": 1
}
```
### Status Values
| Status | Description |
| ------------ | ------------------------------------ |
| `pending` | Job is queued |
| `processing` | Voice clone is being generated |
| `completed` | Voice is ready to use |
| `failed` | Cloning failed (check audio quality) |
---
## Pricing
Voice pricing can vary by provider configuration and clone tier. See
[Billing & Credits](/cloud/billing) and the dashboard/API Explorer for current
rates.
---
## Error Handling
| Code | Error | Solution |
| ---- | -------------------- | --------------------------------------- |
| 400 | Invalid voice ID | Use a valid voice from List Voices |
| 400 | Text too long | Split text into chunks under 5000 chars |
| 402 | Insufficient credits | Add credits to your account |
| 404 | Voice not found | Voice may have been deleted |
| 429 | Rate limited | Wait and retry |