Sécurité
Les transcriptions, traductions et résumés sont générés à partir d'un audio que nous ne contrôlons pas : votre client le produit ou il provient de lui. N'importe qui peut tenter de glisser dans un enregistrement des phrases ayant la forme de commandes, afin qu'elles soient exécutées dans votre système.
Nous renforçons le résumé contre ce type de manipulation, mais aucune défense n'est complète. Si vous comptez transmettre notre sortie à un agent, à un CRM ou à toute automatisation disposant de permissions, traitez-la comme du texte non fiable : ne l'exécutez pas, ne la lisez pas comme des ordres, et validez-la avant d'agir.
Et ce qu'un locuteur affirme dans un enregistrement n'est pas un fait avéré, même si cela finit dans le résumé.
Transcrire
POST /v1/audio/transcriptions
Transforme un enregistrement en texte. Détecte la langue d'elle-même.
Vous pouvez utiliser ce service directement, sans écrire de code, sur la page Studio : la carte Transcrire de l'audio.
| Paramètre | Type | Description |
|---|---|---|
file | fichier | Requis. L'audio. |
model | texte | whisper-1 |
language | texte | Code ISO. Si omis, il est détecté. |
prompt | texte | Contexte pour aider avec les noms propres ou le jargon. |
response_format | texte | json · text · verbose_json · srt · vtt |
extras | texte (query) | sentiment · profile · diarize, séparés par des virgules |
temperature | nombre | 0 à 1. Par défaut 0. |
extras | query | ?extras=sentiment ajoute l'analyse du ton dans la même requête. |
La réponse porte l'en-tête X-Audio-Duration avec les secondes exactes qui ont été facturées.
Synthèse vocale
POST /v1/audio/speech
Vous pouvez utiliser ce service directement, sans écrire de code, sur la page Studio : les cartes Texte en voix numérique (tts-1) et Texte en voix clonée (tts-1-hd).
| Paramètre | Type | Description |
|---|---|---|
input | texte | Requis. Ce qui doit être dit. |
model | texte | tts-1 voix standard · tts-1-hd voix haute qualité. Voir les trois voix. |
voice | texte | Nom du catalogue. Voir voix. |
response_format | texte | mp3 · wav · opus · flac · pcm |
speed | nombre | Vitesse. 1.0 est normal. |
language | texte | Langue de lecture. Si omise, la voix la fixe. Voir comment elle est choisie. |
cache | booléen | false tient cette requête hors du cache : rien n'est lu et rien n'est écrit. Voir plus bas. |
curl -X POST https://api.uttera.ai/v1/audio/speech \
-H "Authorization: Bearer $UTTERA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"tts-1","input":"Your order ships tomorrow.","voice":"nova","response_format":"mp3"}' \
--output voice.mp3
gustaria se prononce gus-ta-ria ; gustaría se prononce gus-ta-rí-a.
Nous ne les ajoutons pas pour vous, à dessein : esta et está, papa et papá, termino et terminó sont des mots différents. Un correcteur automatique en réussirait beaucoup et, quand il en raterait un, il changerait ce que vous nous avez demandé de dire. Nous préférons lire votre texte tel qu'il est écrit.
Quelle langue est lue, et qui décide
La langue ne fixe pas le timbre : elle choisit les règles selon lesquelles le texte devient du son. Se tromper ne sonne pas « avec un accent », cela sonne cassé. Un texte espagnol lu avec les règles anglaises sort littéralement comme ceci :
Mi Gasteria reservar una mesa para dues personas
Elle est donc résolue en trois étapes, et vous avez rarement à y penser :
| Ordre | D'où elle vient |
|---|---|
| 1 | Le language que vous envoyez. L'emporte toujours. |
| 2 | La langue de la voix. Chaque voix du catalogue parle la sienne, et /v1/voices la publie. Demandez alloy et elle lit l'anglais ; demandez dora et elle lit l'espagnol. |
| 3 | Le défaut du serveur, l'anglais. Il n'atteint que les voix sans langue propre : les voix clonées et multilingues, qui parlent ce qu'on leur demande. |
/v1/audio/speech n'a pas de champ language — c'est notre extension — donc votre code ne l'envoie pas, et l'étape 2 fait ce qu'il faut : la voix que vous choisissez décide la langue.Quand il vaut la peine de l'envoyer : avec une voix clonée ou multilingue (elles n'ont pas de langue propre), ou quand vous voulez délibérément qu'une voix lise une langue autre que la sienne.
L'échantillon de voix : quoi téléverser
Cloner une voix nécessite un échantillon de référence. Ce qui marche le mieux :
| Recommandé | Pourquoi |
|---|---|
| 6 à 12 secondes | En dessous de 6, vous perdez de la profondeur tonale. Au-dessus de 12, cela ne s'améliore pas proportionnellement et n'ajoute que de la latence. |
| Une phrase complète, avec une intonation naturelle | Le modèle capte comment cette voix monte et descend, et il a besoin de le voir se produire. |
| Sans bruit de fond | C'est ce que la plupart des gens ratent. La musique, l'écho de la pièce ou la climatisation contaminent la voix de sortie et se retrouveront dans tout ce que vous générerez ensuite. |
Sur quelle voix vous pouvez cloner — la question qui cause le plus de problèmes — voir le cadre légal : une voix est protégée, et le matériel public n'est pas une autorisation.
Trois voix, pas deux
La même route donne trois choses différentes, et ce qui décide laquelle est ce que vous envoyez :
| Ce que vous envoyez | Ce que vous obtenez | Plan |
|---|---|---|
tts-1, ou rien | Voix standard. Notre propre catalogue, rapide et économique. | Tous |
tts-1-hd | Voix haute qualité. Le même catalogue, moteur premium. | Payant |
tts-1-hd + un échantillon de voix | Clonage. Votre voix, sur le moteur premium. | Payant |
L'échantillon est envoyé comme custom_voice_file dans un formulaire multipart ; sans lui, la requête part en JSON. C'est toute la différence entre demander une voix du catalogue en haute qualité et en cloner une.
tts-1 est l'option sensée.Elles ne parlent pas les mêmes langues
C'est la différence qui surprend le plus, et elle n'est pas dans le timbre :
| Langues | Voix du catalogue | |
|---|---|---|
tts-1 · standard | 9 : espagnol, anglais (et britannique), français, italien, portugais, hindi, japonais et chinois | Beaucoup, et chacune liée à sa langue |
tts-1-hd · haute qualité | Environ 30 : outre les précédentes, allemand, russe, polonais, néerlandais, les langues nordiques, grec, turc, arabe, coréen et plusieurs d'Asie du Sud-Est, entre autres | Peu, mais chacune parle les 30 |
La raison est que ce sont des moteurs de nature différente. Le standard a un catalogue fixe de voix, chacune entraînée pour sa langue. Le haute qualité part d'un échantillon — c'est pourquoi il peut cloner — et cette même voix lit n'importe laquelle des langues qu'elle connaît.
Avec tts-1-hd il n'est pas nécessaire de déclarer la langue : elle est déduite du texte. Avec tts-1, elle compte, parce que c'est la voix choisie qui la fixe.
Les sauts de ligne coûtent de l'argent
La parole est facturée à la seconde générée, non au caractère. Et un saut de ligne fait insérer une pause au moteur. Ainsi le même texte coûte différemment selon sa mise en forme, et il vaut la peine de le savoir avant que la facture ne vous surprenne.
Mesuré avec la même phrase répétée huit fois, en ne changeant que ce qu'il y a entre elles :
| Entre les phrases | Durée | Contre une espace |
|---|---|---|
| espace · 2 espaces · 4 espaces | 12,2 s | — |
| virgule · point-virgule · deux-points · points de suspension · tiret | 12,1–12,3 s | — |
| saut de ligne | 21,4 s | +75 % |
| 2 sauts · 3 sauts | 21,4 s | +75 % |
Les espaces ne font rien. Ni deux ni quatre. La ponctuation non plus : une virgule, un point ou un tiret sonnent comme une espace pour ce qui est de l'horloge.
Seul le saut de ligne crée une pause, et chacun coûte 1,31 s (0,028 crédit).
Plus de sauts n'allongent pas la pause. Un, deux ou trois sont exactement identiques. Ils ne servent pas à demander une attente plus longue.
Sur un texte réel, la différence n'est pas petite. La canción del pirata, avec ses ~96 lignes, dépense 126 secondes rien qu'en pauses : un peu plus de la moitié de ce que coûte la synthèse de l'ensemble.
Si vous ne voulez pas des pauses, retirez les sauts de ligne avant d'envoyer le texte : les mêmes mots en un paragraphe continu coûtent presque moitié moins. Et si vous les voulez, vous savez maintenant ce qu'ils valent.
Pourquoi la chaîne donne un chiffre différent
Si vous transcrivez un fichier audio puis le traduisez, vous verrez que la parole de la traduction coûte nettement moins que la synthèse originale du même texte. Ce n'est pas une erreur de facturation : la reconnaissance renvoie un paragraphe continu, sans les sauts de ligne de l'original. Ce texte à plat est synthétisé sans pauses, et il dure donc — et coûte — moins.
Autrement dit : les sauts de ligne ne survivent pas au passage par l'audio. Si les garder compte pour vous, conservez le texte source ; ils ne peuvent pas être récupérés depuis la transcription.
X-Cache: HIT.
Le cache est par nœud. Comme les requêtes sont réparties sur plusieurs, les premières répétitions d'un texte peuvent ne pas toucher : chaque nœud le remplit la première fois que son tour vient. Ensuite, il touche.
Désactiver le cache, requête par requête
Certains travaux ne peuvent pas laisser l'audio traîner sur le disque d'un autre, même une heure : dictée médicale, notes juridiques, un message personnel. Vous pouvez désactiver le cache vous-même, à chaque requête, sans rien nous demander et sans changer votre compte. L'audio est généré et vous est livré tout de même ; ce qui n'arrive pas, c'est qu'on écrive ou lise quoi que ce soit sur le disque.
Trois façons équivalentes, celle qui vous convient le mieux :
# 1) Dans le corps JSON
-d '{"model":"tts-1","input":"Private notes","voice":"nova","cache":false}'
# 2) Comme champ de formulaire (accepte 0 / false / no / off)
-F input="Private notes" -F voice=nova -F cache=false
# 3) Avec le bon vieil en-tête HTTP, sans toucher au corps
-H "Cache-Control: no-cache"
La réponse vous dit toujours ce qui a été fait, pour que vous n'ayez pas à nous croire sur parole :
X-Cache | Ce qui s'est passé |
|---|---|
HIT | Servi depuis le cache. Coûte 10 %. |
MISS | Généré et stocké pour l'heure suivante. |
BYPASS | Vous avez demandé sans cache : généré et rien stocké. |
ADHOC | Voix clonée à la volée. Jamais mise en cache, que vous le demandiez ou non. |
DISABLED | Le cache est désactivé côté serveur. |
Streaming : l'entendre à mesure qu'il se génère
POST /v1/audio/speech/stream
Le endpoint de parole normal vous donne le fichier une fois complet. Celui-ci vous le livre à mesure qu'il se génère, par morceaux, de sorte que le premier son sort presque immédiatement au lieu d'attendre le dernier mot.
Si vous construisez un système téléphonique, un assistant qui répond, ou tout ce où une personne attend à l'autre bout, c'est la différence entre une conversation et une file d'attente.
/v1/audio/speech | /v1/audio/speech/stream | |
|---|---|---|
| Renvoie | Le fichier complet | audio/wav par morceaux (Transfer-Encoding: chunked) |
| Formats | mp3 · wav · opus · flac · pcm | wav uniquement |
| Cache | Oui, une heure à 10 % | Non : il n'y a pas de fichier à stocker |
| Voix clonée | Oui | Oui |
| Prix | Le même : à la seconde d'audio généré | |
curl -N -X POST https://api.uttera.ai/v1/audio/speech/stream \
-H "Authorization: Bearer $UTTERA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"tts-1","input":"Your order ships tomorrow.","voice":"nova","language":"en"}' \
--output - | aplay
Le -N de curl compte : sans lui, curl met la réponse en tampon et vous perdez exactement ce pour quoi vous êtes venu.
Traduire
The 50 languages you can write in: these are what translation accepts as INPUT.
sqAlbanianarArabicazAzerbaijanieuBasquebnBengalibgBulgariancaCatalanzh-HansChinese (Simplified)zh-HantChinese (Traditional)csCzechdaDanishnlDutchenEnglisheoEsperantoetEstonianfiFinnishfrFrenchglGaliciandeGermanelGreekheHebrewhiHindihuHungarianidIndonesiangaIrishitItalianjaJapanesekoKoreankyKyrgyzlvLatvianltLithuanianmsMalaynbNorwegian BokmålfaPersianplPolishptPortuguesept-BRPortuguese (Brazil)roRomanianruRussianskSlovakslSlovenianesSpanishswSwahilisvSwedishtlTagalogthThaitrTurkishukUkrainianurUrduviVietnamese
And the 9 that can come back SPOKEN: for the rest, translation comes back as text. If you ask for audio in one without a voice, the request is rejected with 422 before spending anything.
zhChineseenEnglishen-gbEnglish (British)frFrenchhiHindiitItalianjaJapaneseptPortugueseesSpanish
POST /v1/translate
La chaîne complète : elle transcrit l'audio, traduit le texte et le synthétise dans la langue cible. Elle accepte une entrée audio ou texte, mais pas de texte à texte : si du texte entre, la sortie doit inclure de l'audio.
Vous pouvez utiliser ce service directement, sans écrire de code, sur la page Studio : la carte Traduire un enregistrement.
| Paramètre | Type | Description |
|---|---|---|
file | fichier | L'audio source. |
target | query | Requis. Langue cible. |
source | query | Langue source. Détectée par défaut. |
response | query | both texte et audio · text texte seul · audio audio seul |
voice | query | Voix de sortie, du catalogue standard. Ignorée quand vous demandez preserve_voice. |
preserve_voice | query | 1 pour transposer : la traduction est dite avec la voix du locuteur d'origine, clonée à partir de ce même enregistrement. Requiert une entrée audio et un plan payant. |
speed | query | Vitesse de lecture de l'audio renvoyé. 1.0 est normal ; 0.25 à 4.0. Comme la parole est facturée à la seconde générée, cela change aussi le prix. |
format | query | Format de l'audio renvoyé : mp3 (défaut) · wav · opus · flac · pcm. Il est synthétisé avec la voix standard, donc pcm sort à 24 000 Hz. |
curl -X POST "https://api.uttera.ai/v1/translate?target=en&response=both" \
-H "Authorization: Bearer $UTTERA_API_KEY" \
-F file=@recording.mp3
Elle renvoie source_text, le text traduit, et audio en base64 avec son audio_format. Ainsi que source_language : si vous n'avez pas déclaré source, ce champ porte la langue que nous avons détectée, non le mot auto. Il vaut la peine d'être lu.
source. C'est toujours plus fiable que de la laisser à la détection.422 avant de dépenser quoi que ce soit et renvoie la liste valide. Utilisez response=text pour les autres.
C'est une limite du moteur qu'utilise cette chaîne, non du produit : la voix haute qualité parle environ 30 langues. Si vous avez besoin d'audio dans l'une des autres, dites-le-nous.
Transposer la voix
Avec preserve_voice=1, la traduction n'est pas lue par une de nos voix du catalogue : elle est lue avec la voix propre du locuteur. Le même enregistrement fait les deux tâches, transcription et clonage, il n'y a donc rien d'autre à téléverser.
curl -X POST "https://api.uttera.ai/v1/translate?target=en&response=both&preserve_voice=1" \
-H "Authorization: Bearer $UTTERA_API_KEY" \
-F file=@recording.mp3
La réponse porte preserved_voice: true et voice: "original". Vérifiez-le : c'est ainsi que vous savez, sans écouter l'audio, lequel des deux produits vous a été servi — parce qu'ils ne coûtent pas le même prix.
À l'intérieur, le flux complet est trois étapes sur une seule de vos requêtes :
| Étape | Ce qui se passe | Facturé |
|---|---|---|
| 1. Transcrire | Votre enregistrement passe par la reconnaissance vocale. | À la seconde d'audio d'entrée. |
| 2. Traduire | Le texte est traduit dans la langue cible. | Inclus dans le supplément de chaîne. |
| 3. Parler | Le texte traduit est synthétisé en clonant la voix de ce même enregistrement. | À la seconde d'audio généré, au tarif de la voix clonée. |
/v1/audio/speech. La page Studio vous montre le coût estimé avant de le lancer, la case déjà cochée.preserve_voice est rejeté avec 422 : il n'y a pas de voix à transposer. Et si votre plan n'inclut pas le clonage, avec 403 et le nom du paramètre à retirer.
La voix clonée n'est pas stockée. Elle est dérivée en mémoire pour cette unique requête et disparaît avec elle, exactement comme dans le clonage adhoc.
Analyser la voix
Trois endpoints sur le même audio, chacun avec son propre prix.
Vous pouvez utiliser ces analyses directement, sans écrire de code, sur la page Studio : ce sont des cases sur la carte Transcrire de l'audio, cochées sur le même audio.
| Endpoint | Ce qu'il fait |
|---|---|
POST /v1/audio/sentiment | Ton émotionnel de l'enregistrement. |
POST /v1/audio/profile | Profil du locuteur : tranche d'âge et genre estimés. |
POST /v1/audio/diarize | Qui parle et quand, avec horodatages par locuteur. |
curl -X POST https://api.uttera.ai/v1/audio/diarize \
-H "Authorization: Bearer $UTTERA_API_KEY" \
-F file=@recording.mp3
Résumer un enregistrement
POST /v1/summarize Professional et au-dessus
Il transcrit, analyse le ton, profile le locuteur, sépare les locuteurs, et de tout cela génère un résumé structuré. Les quatre services sources tournent en parallèle, l'attente est donc celle du plus lent, non la somme.
Vous pouvez utiliser ce service directement, sans écrire de code, sur la page Studio : c'est une case de plus sur la carte Transcrire de l'audio.
| Paramètre | Type | Description |
|---|---|---|
file | fichier | Requis. L'enregistrement. |
exclude | query | Désactive les enrichissements : ?exclude=emotion,profile,diarize |
language | query | Langue du résumé. Espagnol par défaut. |
Il renvoie summary, transcript, enrichment et un bloc usage avec les crédits détaillés par étape.
warnings, et cette étape n'est pas facturée.Économiser des tokens sur votre LLM
C'est l'usage du résumé que le moins de gens voient et qui fait économiser le plus. Si ce que vous voulez, c'est qu'un modèle de langage d'un autre fournisseur — Claude, GPT, Gemini, peu importe — travaille sur ce qui a été dit dans un appel, la voie chère est de lui envoyer toute la transcription. La bon marché est de lui envoyer le résumé.
Mesuré sur un enregistrement réel de 70 minutes de prose variée, compté avec le tokeniseur o200k_base :
| Ce que vous envoyez au LLM | Mots | Tokens |
|---|---|---|
| Transcription complète | 10 429 | 15 410 |
| Résumé structuré | 294 – 422 | 484 – 673 |
C'est donné en fourchette parce que le résumé n'est pas déterministe : le même enregistrement, lancé deux fois, a donné 484 et 673 tokens. Entre 20 et 30 fois moins de tokens d'entrée, et l'économie croît avec la durée : la transcription grandit en ligne droite avec les minutes d'enregistrement, et le résumé non — il reste à quelques centaines de tokens. Sur un court enregistrement, cela ne fait aucune différence ; sur une archive d'appels, c'est la différence entre une facture de LLM que vous pouvez payer et une que vous ne pouvez pas.
La réponse apporte summary et transcript dans le même appel, vous n'avez donc pas à choisir à l'avance ni à payer deux fois : vous décidez dans votre code lequel des deux monte au LLM.
Il y a un exemple complet et exécutable — résumer ici, n'envoyer que le résumé au LLM et compter les tokens économisés — dans uttera-examples/llm-tokens.