> 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.

# Créer une voix à partir d'un aperçu vocal

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

Crée une voix à partir d'un aperçu vocal généré précédemment. Ce point de terminaison doit être appelé après avoir récupéré un generated_voice_id à l'aide de POST /v1/text-to-voice/design ou POST /v1/text-to-voice/:voice_id/remix.

Reference: https://elevenlabs.io/docs/api-reference/text-to-voice/create

## 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

### Body (application/json)

This endpoint expects a Body_Create_a_new_voice_from_voice_preview_v1_text_to_voice_post.

- `voice_name` (string, required) — Nom à utiliser pour la voix créée.
- `voice_description` (string, required) — Description à utiliser pour la voix créée.
- `generated_voice_id` (string, required) — Le generated_voice_id à créer ; obtenez-le via POST /v1/text-to-voice/design, POST /v1/text-to-voice/:voice_id/remix ou les en-têtes de réponse lors de la génération d’aperçus.
- `labels` (map from string to string, optional, nullable) — Métadonnées facultatives à ajouter à la voix créée. La valeur par défaut est None.
- `played_not_selected_voice_ids` (list of string, optional, nullable) — Liste des ID de voix que l'utilisateur a écoutées sans les sélectionner. Utilisée pour le RLHF.

## Response

### 200

Réponse réussie

- `voice_id` (string, required) — L’ID de la voix.
- `name` (string, optional) — Le nom de la voix.
- `samples` (list of SampleResponseModel, optional, nullable) — Liste des échantillons associés à la voix.
- `category` (enum, optional) — Catégorie de la voix.
  - Allowed values: `generated`, `cloned`, `premade`, `professional`, `famous`, `high_quality`
- `fine_tuning` (FineTuningResponseModel, optional, nullable) — Informations de Finetune pour la voix.
- `labels` (map from string to string, optional) — Libellés associés à la voix.
- `description` (string, optional, nullable) — La description de la voix.
- `preview_url` (string, optional, nullable) — L’URL d’aperçu de la voix.
- `available_for_tiers` (list of string, optional) — Les niveaux pour lesquels la voix est disponible.
- `settings` (VoiceSettingsResponseModel, optional, nullable) — Les paramètres de la voix.
- `sharing` (VoiceSharingResponseModel, optional, nullable) — Les informations de partage de la voix.
- `high_quality_base_model_ids` (list of string, optional) — ID des modèles de base pour les voix de haute qualité.
- `verified_languages` (list of VerifiedVoiceLanguageResponseModel, optional, nullable) — Les langues vérifiées de la voix.
- `collection_ids` (list of string, optional, nullable) — Les ID des collections auxquelles appartient cette voix.
- `safety_control` (enum, optional, nullable) — Les contrôles de sécurité de la voix.
  - Allowed values: `NONE`, `BAN`, `CAPTCHA`, `ENTERPRISE_BAN`, `ENTERPRISE_CAPTCHA`
- `voice_verification` (VoiceVerificationResponseModel, optional, nullable) — La vérification vocale de la voix.
- `permission_on_resource` (string, optional, nullable) — L’autorisation sur la ressource de la voix.
- `is_owner` (boolean, optional, nullable) — Indique si la voix appartient à l’utilisateur.
- `is_legacy` (boolean, optional, default: false) — Indique si la voix est héritée.
- `is_mixed` (boolean, optional, default: false) — Indique si la voix est mixée.
- `favorited_at_unix` (integer, optional, nullable) — Horodatage Unix auquel la voix a été ajoutée aux favoris.
- `created_at_unix` (integer, optional, nullable) — Date de création de la voix au format Unix.
- `is_bookmarked` (boolean, optional, nullable) — Indique si la voix est enregistrée dans les favoris par l’utilisateur actuel. Pertinent uniquement pour les voix de la communauté, copiées depuis la bibliothèque.
- `recording_quality` (enum, optional, nullable) — La qualité d'enregistrement de la voix, déterminée par le pipeline de révision.
  - Allowed values: `studio`, `good`, `ok`, `poor`, `bad`
- `labelling_status` (enum, optional, nullable) — L'état du pipeline de révision de la voix.
  - Allowed values: `in_review`, `review_complete`
- `recording_quality_reason` (string, optional, nullable) — La raison de l'évaluation de la qualité de l'enregistrement, déterminée par le pipeline de révision.

## Errors

### 409 Conflict Error

Une génération pour cet aperçu est déjà en cours. Réessayez la requête.

- `any`

### 422 Unprocessable Entity Error

Erreur de validation

- `detail` (list of ValidationError, optional)

## Types

### SampleResponseModel

- `sample_id` (string, optional) — L’ID de l’échantillon.
- `file_name` (string, optional) — Le nom du fichier d’échantillon.
- `mime_type` (string, optional) — Le type MIME du fichier d’échantillon.
- `size_bytes` (integer, optional) — La taille du fichier échantillon en octets.
- `hash` (string, optional) — Le hachage du fichier d’échantillon.
- `duration_secs` (double, optional, nullable)
- `remove_background_noise` (boolean, optional, nullable)
- `has_isolated_audio` (boolean, optional, nullable)
- `has_isolated_audio_preview` (boolean, optional, nullable)
- `speaker_separation` (SpeakerSeparationResponseModel, optional, nullable)
- `trim_start` (integer, optional, nullable)
- `trim_end` (integer, optional, nullable)

### FineTuningResponseModel

- `is_allowed_to_fine_tune` (boolean, optional) — Indique si l’utilisateur est autorisé à effectuer le Finetune de la voix.
- `state` (map from string to enum, optional) — L'état du processus de Finetune pour chaque modèle.
  - Allowed values: `not_started`, `queued`, `fine_tuning`, `fine_tuned`, `failed`, `delayed`
- `verification_failures` (list of string, optional) — Liste des échecs de vérification dans le processus de Finetune.
- `verification_attempts_count` (integer, optional) — Le nombre de tentatives de vérification dans le processus de Finetune.
- `manual_verification_requested` (boolean, optional) — Indique si une vérification manuelle a été demandée pour le processus de fine-tuning.
- `language` (string, optional, nullable) — La langue du processus de finetuning.
- `progress` (map from string to double, optional, nullable) — La progression du processus de Finetune.
- `message` (map from string to string, optional, nullable) — Le message du processus de Finetune.
- `dataset_duration_seconds` (double, optional, nullable) — La durée du jeu de données en secondes.
- `verification_attempts` (list of VerificationAttemptResponseModel, optional, nullable) — Le nombre de tentatives de vérification.
- `slice_ids` (list of string, optional, nullable) — Liste des ID de tranches.
- `manual_verification` (ManualVerificationResponseModel, optional, nullable) — La vérification manuelle du processus de finetuning.
- `max_verification_attempts` (integer, optional, nullable) — Le nombre maximal de tentatives de vérification.
- `next_max_verification_attempts_reset_unix_ms` (integer, optional, nullable) — La prochaine date de réinitialisation du nombre maximal de tentatives de vérification, en millisecondes Unix.
- `finetuning_state` (any, optional)

### VoiceSettingsResponseModel

- `stability` (double, optional, nullable, default: 0.5) — Détermine la stabilité de la voix et le niveau d’aléa entre chaque génération. Des valeurs plus faibles offrent une palette émotionnelle plus large. Des valeurs plus élevées peuvent produire une voix monotone aux émotions limitées.
- `use_speaker_boost` (boolean, optional, nullable, default: true) — Ce paramètre augmente la similarité avec le locuteur d’origine. Son utilisation requiert une charge de calcul légèrement supérieure, ce qui augmente la latence.
- `similarity_boost` (double, optional, nullable, default: 0.75) — Détermine dans quelle mesure l’IA doit respecter la voix d’origine lorsqu’elle tente de la reproduire.
- `style` (double, optional, nullable, default: 0) — Détermine l’exagération du style de la voix. Ce réglage tente d’amplifier le style du locuteur d’origine. Il consomme davantage de ressources de calcul et peut augmenter la latence s’il est défini sur une valeur autre que 0.
- `speed` (double, optional, nullable, default: 1) — Ajuste la vitesse de la voix. La valeur 1.0 correspond à la vitesse par défaut, les valeurs inférieures à 1.0 ralentissent la parole et les valeurs supérieures à 1.0 l'accélèrent.
- `clone_strength` (double, optional, nullable) — Contrôle la proximité entre la voix et les échantillons de clonage de voix professionnel, de 0 (faible) à 1 (élevée). Nous recommandons la valeur 0 pour la plupart des cas d'utilisation. Augmentez cette valeur uniquement si vous rencontrez des problèmes avec les paramètres par défaut. S'applique uniquement aux clonages de voix professionnels affinés pour le modèle v4 sélectionné.

### VoiceSharingResponseModel

- `status` (enum, optional) — L'état du partage de voix.
  - Allowed values: `enabled`, `disabled`, `copied`, `copied_disabled`
- `history_item_sample_id` (string, optional, nullable) — L'ID de l'échantillon de l'élément d'historique.
- `date_unix` (integer, optional) — Date du partage de la voix au format Unix.
- `whitelisted_emails` (list of string, optional) — Liste des emails autorisés.
- `public_owner_id` (string, optional) — L’ID du propriétaire public.
- `original_voice_id` (string, optional) — L’ID de la voix d’origine.
- `financial_rewards_enabled` (boolean, optional) — Indique si les récompenses financières sont activées.
- `free_users_allowed` (boolean, optional) — Indique si les utilisateurs gratuits sont autorisés.
- `live_moderation_enabled` (boolean, optional) — Indique si la modération en direct est activée.
- `rate` (double, optional, nullable) — Le tarif du partage de voix.
- `fiat_rate` (double, optional, nullable) — Le tarif du partage de voix en USD pour 1 000 crédits.
- `notice_period` (integer, optional) — Le délai de préavis du partage de voix.
- `disable_at_unix` (integer, optional, nullable) — Date du partage de la voix au format Unix.
- `voice_mixing_allowed` (boolean, optional) — Indique si le mixage de voix est autorisé.
- `featured` (boolean, optional) — Indique si la voix est mise en avant.
- `category` (enum, optional) — Catégorie de la voix.
  - Allowed values: `generated`, `cloned`, `premade`, `professional`, `famous`, `high_quality`
- `reader_app_enabled` (boolean, optional, nullable) — Indique si l’application de lecture est activée.
- `image_url` (string, optional, nullable) — L’URL de l’image de la voix.
- `ban_reason` (string, optional, nullable) — Motif de bannissement de la voix.
- `liked_by_count` (integer, optional) — Le nombre de mentions J’aime de la voix.
- `cloned_by_count` (integer, optional) — Le nombre de clonages de la voix.
- `name` (string, optional) — Le nom de la voix.
- `description` (string, optional, nullable) — La description de la voix.
- `labels` (map from string to string, optional) — Les libellés de la voix.
- `review_status` (enum, optional) — L'état de révision de la voix.
  - Allowed values: `not_requested`, `pending`, `declined`, `declined_resubmittable`, `allowed`, `allowed_with_changes`
- `review_message` (string, optional, nullable) — Le message de révision de la voix.
- `enabled_in_library` (boolean, optional) — Indique si la voix est activée dans la bibliothèque.
- `instagram_username` (string, optional, nullable) — Le nom d’utilisateur Instagram de la voix.
- `twitter_username` (string, optional, nullable) — Le nom d’utilisateur Twitter/X de la voix.
- `youtube_username` (string, optional, nullable) — Le nom d’utilisateur YouTube de la voix.
- `tiktok_username` (string, optional, nullable) — Le nom d’utilisateur TikTok de la voix.
- `moderation_check` (VoiceSharingModerationCheckResponseModel, optional, nullable) — La vérification de modération de la voix.
- `reader_restricted_on` (list of ReaderResourceResponseModel, optional, nullable) — La restriction du lecteur de la voix.

### VerifiedVoiceLanguageResponseModel

- `language` (string, required) — La langue de la voix.
- `model_id` (string, required) — L’ID du modèle de la voix.
- `accent` (string, optional, nullable) — L’accent de la voix, le cas échéant.
- `locale` (string, optional, nullable) — Les paramètres régionaux de la voix, le cas échéant.
- `preview_url` (string, optional, nullable) — L’URL d’aperçu de la voix, le cas échéant.

### VoiceVerificationResponseModel

- `requires_verification` (boolean, required) — Indique si la voix nécessite une vérification.
- `is_verified` (boolean, required) — Indique si la voix a été vérifiée.
- `verification_failures` (list of string, required) — Liste des échecs de vérification.
- `verification_attempts_count` (integer, required) — Le nombre de tentatives de vérification.
- `language` (string, optional, nullable) — La langue de la voix.
- `verification_attempts` (list of VerificationAttemptResponseModel, optional, nullable) — Nombre de tentatives de vérification.

### ValidationError

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

### SpeakerSeparationResponseModel

- `voice_id` (string, required) — L’ID de la voix.
- `sample_id` (string, required) — L’ID de l’échantillon.
- `status` (enum, required) — L'état de la séparation des locuteurs.
  - Allowed values: `not_started`, `pending`, `completed`, `failed`
- `speakers` (map from string to SpeakerResponseModel, optional, nullable) — Les locuteurs de l'échantillon.
- `selected_speaker_ids` (list of string, optional, nullable) — Les ID des locuteurs sélectionnés.

### VerificationAttemptResponseModel

- `text` (string, required) — Le texte de la tentative de vérification.
- `date_unix` (integer, required) — Date de la tentative de vérification au format Unix.
- `accepted` (boolean, required) — Indique si la tentative de vérification a été acceptée.
- `similarity` (double, required) — La similarité de la tentative de vérification.
- `levenshtein_distance` (double, required) — La distance de Levenshtein de la tentative de vérification.
- `recording` (RecordingResponseModel, optional, nullable) — L'enregistrement de la tentative de vérification.

### ManualVerificationResponseModel

- `extra_text` (string, required) — Le texte supplémentaire de la vérification manuelle.
- `request_time_unix` (integer, required) — Date de la vérification manuelle au format Unix.
- `files` (list of ManualVerificationFileResponseModel, required) — Les fichiers de la vérification manuelle.

### VoiceSharingModerationCheckResponseModel

- `date_checked_unix` (integer, optional, nullable) — Date du contrôle de modération au format Unix.
- `name_value` (string, optional, nullable) — La valeur du nom de la voix.
- `name_check` (boolean, optional, nullable) — Indique si la vérification du nom a réussi.
- `description_value` (string, optional, nullable) — La valeur de description de la voix.
- `description_check` (boolean, optional, nullable) — Indique si la vérification de la description a réussi.
- `sample_ids` (list of string, optional, nullable) — Liste des identifiants d'échantillons.
- `sample_checks` (list of double, optional, nullable) — Liste des vérifications d'échantillons.
- `captcha_ids` (list of string, optional, nullable) — Liste des ID CAPTCHA.
- `captcha_checks` (list of double, optional, nullable) — Liste des valeurs de vérification CAPTCHA.

### ReaderResourceResponseModel

- `resource_type` (enum, required) — Le type de ressource.
  - Allowed values: `read`, `collection`
- `resource_id` (string, required) — L’ID de la ressource.

### ValidationErrorLocItems

- string
- integer

### SpeakerResponseModel

- `speaker_id` (string, required) — L’ID du locuteur.
- `duration_secs` (double, required) — La durée du segment du locuteur en secondes.
- `utterances` (list of UtteranceResponseModel, optional, nullable) — Les énoncés du locuteur.

### RecordingResponseModel

- `recording_id` (string, required) — L’ID de l’enregistrement.
- `mime_type` (string, required) — Le type MIME de l’enregistrement.
- `size_bytes` (integer, required) — La taille de l'enregistrement en octets.
- `upload_date_unix` (integer, required) — Date de l’enregistrement au format Unix.
- `transcription` (string, required) — La transcription de l’enregistrement.

### ManualVerificationFileResponseModel

- `file_id` (string, required) — L’ID du fichier.
- `file_name` (string, required) — Le nom du fichier.
- `mime_type` (string, required) — Le type MIME du fichier.
- `size_bytes` (integer, required) — La taille du fichier en octets.
- `upload_date_unix` (integer, required) — Date du fichier au format Unix.

### UtteranceResponseModel

- `start` (double, required) — L'heure de début de l'énoncé en secondes.
- `end` (double, required) — L’heure de fin de l’énoncé en secondes.

## Examples

**Request**

```json
{
  "voice_name": "Sassy squeaky mouse",
  "voice_description": "A sassy squeaky mouse",
  "generated_voice_id": "37HceQefKmEi3bGovXjL"
}
```

**Response**

```json
{
  "voice_id": "21m00Tcm4TlvDq8ikWAM",
  "name": "Rachel",
  "category": "professional",
  "fine_tuning": {
    "is_allowed_to_fine_tune": true,
    "state": {
      "eleven_multilingual_v2": "fine_tuned"
    },
    "verification_failures": [],
    "verification_attempts_count": 2,
    "manual_verification_requested": false
  },
  "labels": {
    "accent": "American",
    "age": "middle-aged",
    "description": "expressive",
    "gender": "female",
    "use_case": "social media"
  },
  "description": "A warm, expressive voice with a touch of humor.",
  "preview_url": "https://storage.googleapis.com/eleven-public-prod/premade/voices/9BWtsMINqrJLrRacOk9x/405766b8-1f4e-4d3c-aba1-6f25333823ec.mp3",
  "available_for_tiers": [
    "creator",
    "enterprise"
  ],
  "settings": {
    "stability": 1,
    "use_speaker_boost": true,
    "similarity_boost": 1,
    "style": 0,
    "speed": 1
  },
  "sharing": {
    "status": "enabled",
    "history_item_sample_id": "DCwhRBWXzGAHq8TQ4Fs18",
    "date_unix": 1714204800,
    "whitelisted_emails": [
      "example@example.com"
    ],
    "public_owner_id": "DCwhRBWXzGAHq8TQ4Fs18",
    "original_voice_id": "DCwhRBWXzGAHq8TQ4Fs18",
    "financial_rewards_enabled": true,
    "free_users_allowed": true,
    "live_moderation_enabled": true,
    "rate": 0.05,
    "notice_period": 30,
    "disable_at_unix": 1714204800,
    "voice_mixing_allowed": false,
    "featured": true,
    "category": "professional",
    "reader_app_enabled": true,
    "liked_by_count": 100,
    "cloned_by_count": 50,
    "name": "Rachel",
    "description": "A female voice with a soft and friendly tone.",
    "labels": {
      "accent": "American",
      "gender": "female"
    },
    "review_status": "allowed",
    "enabled_in_library": true,
    "moderation_check": {
      "date_checked_unix": 1714204800,
      "name_value": "Rachel",
      "name_check": true,
      "description_value": "A female voice with a soft and friendly tone.",
      "description_check": true,
      "sample_ids": [
        "sample1",
        "sample2"
      ],
      "sample_checks": [
        0.95,
        0.98
      ],
      "captcha_ids": [
        "captcha1",
        "captcha2"
      ],
      "captcha_checks": [
        0.95,
        0.98
      ]
    },
    "reader_restricted_on": [
      {
        "resource_type": "read",
        "resource_id": "FCwhRBWXzGAHq8TQ4Fs18"
      }
    ]
  },
  "high_quality_base_model_ids": [
    "eleven_v2_flash",
    "eleven_flash_v2",
    "eleven_turbo_v2_5",
    "eleven_multilingual_v2",
    "eleven_v2_5_flash",
    "eleven_flash_v2_5",
    "eleven_turbo_v2"
  ],
  "verified_languages": [
    {
      "language": "en",
      "model_id": "eleven_multilingual_v2",
      "accent": "american",
      "locale": "en-US",
      "preview_url": "https://storage.googleapis.com/eleven-public-prod/premade/voices/9BWtsMINqrJLrRacOk9x/405766b8-1f4e-4d3c-aba1-6f25333823ec.mp3"
    }
  ],
  "voice_verification": {
    "requires_verification": false,
    "is_verified": true,
    "verification_failures": [],
    "verification_attempts_count": 0,
    "language": "en",
    "verification_attempts": [
      {
        "text": "Hello, how are you?",
        "date_unix": 1714204800,
        "accepted": true,
        "similarity": 0.95,
        "levenshtein_distance": 2,
        "recording": {
          "recording_id": "CwhRBWXzGAHq8TQ4Fs17",
          "mime_type": "audio/mpeg",
          "size_bytes": 1000000,
          "upload_date_unix": 1714204800,
          "transcription": "Hello, how are you?"
        }
      }
    ]
  },
  "is_owner": false,
  "is_legacy": false,
  "is_mixed": false
}
```

**SDK Code**

```python
import requests

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

payload = {
    "voice_name": "Sassy squeaky mouse",
    "voice_description": "A sassy squeaky mouse",
    "generated_voice_id": "37HceQefKmEi3bGovXjL"
}
headers = {"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-voice';
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: '{"voice_name":"Sassy squeaky mouse","voice_description":"A sassy squeaky mouse","generated_voice_id":"37HceQefKmEi3bGovXjL"}'
};

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-voice"

	payload := strings.NewReader("{\n  \"voice_name\": \"Sassy squeaky mouse\",\n  \"voice_description\": \"A sassy squeaky mouse\",\n  \"generated_voice_id\": \"37HceQefKmEi3bGovXjL\"\n}")

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

	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-voice")

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

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n  \"voice_name\": \"Sassy squeaky mouse\",\n  \"voice_description\": \"A sassy squeaky mouse\",\n  \"generated_voice_id\": \"37HceQefKmEi3bGovXjL\"\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-voice")
  .header("Content-Type", "application/json")
  .body("{\n  \"voice_name\": \"Sassy squeaky mouse\",\n  \"voice_description\": \"A sassy squeaky mouse\",\n  \"generated_voice_id\": \"37HceQefKmEi3bGovXjL\"\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.elevenlabs.io/v1/text-to-voice', [
  'body' => '{
  "voice_name": "Sassy squeaky mouse",
  "voice_description": "A sassy squeaky mouse",
  "generated_voice_id": "37HceQefKmEi3bGovXjL"
}',
  'headers' => [
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://api.elevenlabs.io/v1/text-to-voice");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"voice_name\": \"Sassy squeaky mouse\",\n  \"voice_description\": \"A sassy squeaky mouse\",\n  \"generated_voice_id\": \"37HceQefKmEi3bGovXjL\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["Content-Type": "application/json"]
let parameters = [
  "voice_name": "Sassy squeaky mouse",
  "voice_description": "A sassy squeaky mouse",
  "generated_voice_id": "37HceQefKmEi3bGovXjL"
] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://api.elevenlabs.io/v1/text-to-voice")! 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()
```