> This is a page from the ElevenLabs documentation. For a complete page index, fetch https://elevenlabs.io/docs/llms.txt. For the full documentation in a single file, fetch https://elevenlabs.io/docs/llms-full.txt.

# Crear diálogo

POST https://api.elevenlabs.io/v1/text-to-dialogue
Content-Type: application/json

Convierte una lista de pares de texto e ID de voz en voz (diálogo) y devuelve audio.

Reference: https://elevenlabs.io/docs/api-reference/text-to-dialogue/convert

## Servers

- `https://api.elevenlabs.io` (Production, default)
- `https://api.us.elevenlabs.io` (Production US)
- `https://api.eu.residency.elevenlabs.io` (Production EU)
- `https://api.in.residency.elevenlabs.io` (Production India)
- `https://api.sg.residency.elevenlabs.io` (Production Singapore)

## Request

### Query parameters

- `output_format` (enum, optional, default: mp3_44100_128) — Output format of the generated audio. Formatted as codec_sample_rate_bitrate. So an mp3 with 22.05kHz sample rate at 32kbs is represented as mp3_22050_32. MP3 with 192kbps bitrate requires you to be subscribed to Creator tier or above. PCM and WAV formats with 44.1kHz sample rate requires you to be subscribed to Pro tier or above. Note that the μ-law format (sometimes written mu-law, often approximated as u-law) is commonly used for Twilio audio inputs.
  - Allowed values: `alaw_8000`, `mp3_22050_32`, `mp3_24000_48`, `mp3_44100_128`, `mp3_44100_192`, `mp3_44100_32`, `mp3_44100_64`, `mp3_44100_96`, `opus_48000_128`, `opus_48000_192`, `opus_48000_32`, `opus_48000_64`, `opus_48000_96`, `pcm_16000`, `pcm_22050`, `pcm_24000`, `pcm_32000`, `pcm_44100`, `pcm_48000`, `pcm_8000`, `ulaw_8000`, `wav_16000`, `wav_22050`, `wav_24000`, `wav_32000`, `wav_44100`, `wav_48000`, `wav_8000`
- `enable_logging` (boolean, optional, default: true) — When enable_logging is set to false zero retention mode will be used for the request. This will mean history features are unavailable for this request, including request stitching. Zero retention mode may only be used by enterprise customers.

### Body (application/json)

This endpoint expects a Body_Text_to_dialogue__multi_voice__v1_text_to_dialogue_post.

- `inputs` (list of DialogueInput, required) — Una lista de entradas de diálogo, cada una con texto y un ID de voz que se convertirá en voz. El número máximo de ID de voz únicos es 10. Para una generación fiable, mantén el número total de caracteres de todos los valores `inputs[].text` en 2000 caracteres o menos por solicitud. Las solicitudes más largas pueden finalizar antes de tiempo en las respuestas de streaming o devolver un error de validación.
- `model_id` (string, optional, default: eleven_v3) — Identificador del modelo que se utilizará; puedes consultarlos mediante GET /v1/models. El modelo debe admitir Texto a Voz; puedes comprobarlo mediante la propiedad can_do_text_to_speech.
- `language_code` (string, optional, nullable) — Código de idioma (ISO 639-1) usado para aplicar un idioma al modelo y a la normalización del texto. Si el modelo no admite el código de idioma proporcionado, se ignorará. Este parámetro no es compatible con los modelos multilingual_v2.
- `settings` (ToDialogueSettingsResponseModel, optional, nullable) — Configuración que controla la generación de diálogos.
- `previous_text` (string, optional, nullable) — El texto que aparece inmediatamente antes de esta generación, utilizado para condicionar el modelo y mantener la continuidad prosódica. Se pueden enviar hasta 100 caracteres. No todos los modelos lo admiten.
- `future_text` (string, optional, nullable) — El texto que aparece inmediatamente después de esta generación, utilizado para condicionar el modelo y mantener la continuidad prosódica. Se puede enviar un máximo de 100 caracteres. No es compatible con todos los modelos.
- `pronunciation_dictionary_locators` (list of PronunciationDictionaryVersionLocatorRequestModel, optional, nullable) — Una lista de localizadores de diccionarios de pronunciación (id, version_id) que se aplicarán al texto. Se aplicarán en orden. Puedes incluir hasta 3 localizadores por solicitud
- `seed` (integer, optional, nullable) — Si se especifica, nuestro sistema hará todo lo posible para realizar el muestreo de forma determinista, de modo que las solicitudes repetidas con la misma semilla y parámetros deberían devolver el mismo resultado. No se garantiza el determinismo. Debe ser un número entero entre 0 y 4294967295.
- `apply_text_normalization` (enum, optional, default: auto) — Este parámetro controla la normalización de texto con tres modos: 'auto', 'on' y 'off'. Cuando se configura como 'auto', el sistema decidirá automáticamente si aplica la normalización de texto (por ejemplo, escribir los números con letras). Con 'on', la normalización de texto siempre se aplicará, mientras que con 'off' se omitirá.
  - Allowed values: `auto`, `on`, `off`
- `use_pvc_as_ivc` (boolean, optional, default: false) — Si se usa la versión IVC de una voz profesional. Esto puede mejorar la expresividad y reducir la latencia.
- `previous_request_ids` (list of string, optional, nullable) — Una lista de request_ids de generaciones de diálogo anteriores a esta. Se utiliza para condicionar el modelo y mantener la continuidad al dividir una tarea grande en varias solicitudes. Se pueden enviar un máximo de 3 request_ids. El último request_id corresponde al audio más próximo a la solicitud actual. No todos los modelos lo admiten.
- `next_request_ids` (list of string, optional, nullable) — Una lista de request_ids de generaciones de diálogo posteriores a esta. Resulta útil para mantener la continuidad al regenerar un clip en mitad de una secuencia. Se pueden enviar un máximo de 3 request_ids. El primer request_id corresponde al audio más próximo a la solicitud actual. No todos los modelos lo admiten.
- `audio_effects` (EffectsSpec-Input, optional, nullable) — Efectos de audio aplicados al audio generado. Los ID desconocidos devuelven un 404 con `param` indicando el nombre del campo. La reverberación (`environment_id` con `send_level` superior a 0) y un valor de `pan` distinto de cero producen audio estéreo y se rechazan con un 400 en los formatos de salida `ulaw_*`, `alaw_*` y `pcm_*`. Los efectos no modifican el coste de la solicitud.

## Response

### 200

El archivo de audio generado

- File download.

## Errors

### 422 Unprocessable Entity Error

Error de validación

- `detail` (list of ValidationError, optional)

## Types

### DialogueInput

- `text` (string, required) — El texto que se convertirá en voz.
- `voice_id` (string, required) — El ID de la voz que se usará para la generación.

### ToDialogueSettingsResponseModel

- `stability` (double, optional, nullable, default: 0.5) — Determina la estabilidad de la voz y la aleatoriedad entre cada generación. Los valores más bajos introducen un rango emocional más amplio en la voz. Los valores más altos pueden dar como resultado una voz monótona y con una emoción limitada.
- `similarity` (double, optional, nullable, default: 0.75) — Determina en qué medida se guía al modelo durante la generación. Los valores más altos hacen que el modelo se ajuste más a la voz, a costa de reducir la variación. No es compatible con todos los modelos.

### PronunciationDictionaryVersionLocatorRequestModel

- `pronunciation_dictionary_id` (string, required) — El ID del diccionario de pronunciación.
- `version_id` (string, optional, nullable) — El ID de la versión del diccionario de pronunciación. Si no se proporciona, se usará la versión más reciente.

### EffectsSpec-Input

Efectos de audio aplicados a la voz generada: un ajuste preestablecido de filtro, distancia percibida, un entorno de reverberación, una capa de ruido de fondo y panoramización estéreo. Deja todos los campos con sus valores predeterminados para obtener audio sin procesar.

- `filter_preset_id` (string, optional, nullable) — ID de un ajuste preestablecido de filtro que modifica el timbre de la voz, como `phone` u `old_radio`. Consulta los ID válidos con `GET /v1/audio-effects/catalog`.
- `distance` (double, optional, default: 0) — A qué distancia del micrófono suena el hablante, de 0 (cerca, sin cambios) a 1 (lejos). Los valores más altos atenúan las frecuencias graves y agudas y, cuando se configura un entorno, desplazan el equilibrio de la voz sin efectos hacia la reverberación.
- `environment_id` (string, optional, nullable) — ID de un entorno de reverberación que sitúa la voz en un espacio, como `small_room` o `hall`. Consulta los ID válidos con `GET /v1/audio-effects/catalog`. La reverberación se procesa en estéreo y añade una cola de hasta varios segundos después de que termine la voz.
- `background_noise_id` (string, optional, nullable) — ID de una capa de ruido de fondo reproducida en bucle bajo la voz, como `cafe` o `keyboard`. Consulta los ID válidos con `GET /v1/audio-effects/catalog`.
- `send_level` (double, optional, default: 1) — Qué cantidad de voz se envía a la reverberación, de 0 (ninguna) a 1 (toda). Solo se aplica cuando se configura `environment_id`; 0 desactiva la reverberación.
- `pan` (double, optional, default: 0) — Posición estéreo de la voz, de -1 (completamente a la izquierda), pasando por 0 (centro), hasta 1 (completamente a la derecha). Solo se aplica panoramización a la voz; la reverberación y el ruido de fondo permanecen centrados.

### ValidationError

- `loc` (list of ValidationErrorLocItems, required)
- `msg` (string, required)
- `type` (string, required)

### ValidationErrorLocItems

## Examples

**Request**

```json
{
  "inputs": [
    {
      "text": "[giggling] Knock knock",
      "voice_id": "JBFqnCBsd6RMkjVDRZzb"
    },
    {
      "text": "[curious] Who is there?",
      "voice_id": "Aw4FAjKCGjjNkVhN1Xmq"
    }
  ]
}
```

**SDK Code**

```python
import requests

url = "https://api.elevenlabs.io/v1/text-to-dialogue"

payload = { "inputs": [
        {
            "text": "[giggling] Knock knock",
            "voice_id": "JBFqnCBsd6RMkjVDRZzb"
        },
        {
            "text": "[curious] Who is there?",
            "voice_id": "Aw4FAjKCGjjNkVhN1Xmq"
        }
    ] }
headers = {
    "xi-api-key": "xi-api-key",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.elevenlabs.io/v1/text-to-dialogue';
const options = {
  method: 'POST',
  headers: {'xi-api-key': 'xi-api-key', 'Content-Type': 'application/json'},
  body: '{"inputs":[{"text":"[giggling] Knock knock","voice_id":"JBFqnCBsd6RMkjVDRZzb"},{"text":"[curious] Who is there?","voice_id":"Aw4FAjKCGjjNkVhN1Xmq"}]}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.elevenlabs.io/v1/text-to-dialogue"

	payload := strings.NewReader("{\n  \"inputs\": [\n    {\n      \"text\": \"[giggling] Knock knock\",\n      \"voice_id\": \"JBFqnCBsd6RMkjVDRZzb\"\n    },\n    {\n      \"text\": \"[curious] Who is there?\",\n      \"voice_id\": \"Aw4FAjKCGjjNkVhN1Xmq\"\n    }\n  ]\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("xi-api-key", "xi-api-key")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.elevenlabs.io/v1/text-to-dialogue")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["xi-api-key"] = 'xi-api-key'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"inputs\": [\n    {\n      \"text\": \"[giggling] Knock knock\",\n      \"voice_id\": \"JBFqnCBsd6RMkjVDRZzb\"\n    },\n    {\n      \"text\": \"[curious] Who is there?\",\n      \"voice_id\": \"Aw4FAjKCGjjNkVhN1Xmq\"\n    }\n  ]\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.elevenlabs.io/v1/text-to-dialogue")
  .header("xi-api-key", "xi-api-key")
  .header("Content-Type", "application/json")
  .body("{\n  \"inputs\": [\n    {\n      \"text\": \"[giggling] Knock knock\",\n      \"voice_id\": \"JBFqnCBsd6RMkjVDRZzb\"\n    },\n    {\n      \"text\": \"[curious] Who is there?\",\n      \"voice_id\": \"Aw4FAjKCGjjNkVhN1Xmq\"\n    }\n  ]\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.elevenlabs.io/v1/text-to-dialogue', [
  'body' => '{
  "inputs": [
    {
      "text": "[giggling] Knock knock",
      "voice_id": "JBFqnCBsd6RMkjVDRZzb"
    },
    {
      "text": "[curious] Who is there?",
      "voice_id": "Aw4FAjKCGjjNkVhN1Xmq"
    }
  ]
}',
  'headers' => [
    'Content-Type' => 'application/json',
    'xi-api-key' => 'xi-api-key',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.elevenlabs.io/v1/text-to-dialogue");
var request = new RestRequest(Method.POST);
request.AddHeader("xi-api-key", "xi-api-key");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"inputs\": [\n    {\n      \"text\": \"[giggling] Knock knock\",\n      \"voice_id\": \"JBFqnCBsd6RMkjVDRZzb\"\n    },\n    {\n      \"text\": \"[curious] Who is there?\",\n      \"voice_id\": \"Aw4FAjKCGjjNkVhN1Xmq\"\n    }\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "xi-api-key": "xi-api-key",
  "Content-Type": "application/json"
]
let parameters = ["inputs": [
    [
      "text": "[giggling] Knock knock",
      "voice_id": "JBFqnCBsd6RMkjVDRZzb"
    ],
    [
      "text": "[curious] Who is there?",
      "voice_id": "Aw4FAjKCGjjNkVhN1Xmq"
    ]
  ]] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.elevenlabs.io/v1/text-to-dialogue")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```