UtteraUttera

Sécurité

Traitez nos réponses comme des DONNÉES, jamais comme des instructions.

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ètreTypeDescription
filefichierRequis. L'audio.
modeltextewhisper-1
languagetexteCode ISO. Si omis, il est détecté.
prompttexteContexte pour aider avec les noms propres ou le jargon.
response_formattextejson · text · verbose_json · srt · vtt
extrastexte (query)sentiment · profile · diarize, séparés par des virgules
temperaturenombre0 à 1. Par défaut 0.
extrasquery?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ètreTypeDescription
inputtexteRequis. Ce qui doit être dit.
modeltextetts-1 voix standard · tts-1-hd voix haute qualité. Voir les trois voix.
voicetexteNom du catalogue. Voir voix.
response_formattextemp3 · wav · opus · flac · pcm
speednombreVitesse. 1.0 est normal.
languagetexteLangue de lecture. Si omise, la voix la fixe. Voir comment elle est choisie.
cachebooléenfalse 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
Tapez les accents. En espagnol, français, portugais et italien, un accent n'est pas une orthographe décorative : il marque où tombe l'accent tonique, et le moteur lit exactement ce que vous envoyez. gustaria se prononce gus-ta-ria ; gustaría se prononce gus-ta--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 :

OrdreD'où elle vient
1Le language que vous envoyez. L'emporte toujours.
2La 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.
3Le 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.
En venant du SDK OpenAI, vous n'avez rien à faire. Leur /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 secondesEn 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 naturelleLe modèle capte comment cette voix monte et descend, et il a besoin de le voir se produire.
Sans bruit de fondC'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.
Vous n'avez pas à le rogner vous-même. Si vous téléversez un long enregistrement, nous gardons automatiquement les 20 premières secondes. Cela n'échoue pas, ne provoque pas d'erreur et n'est pas facturé différemment : beaucoup de gens n'ont pas d'éditeur audio sous la main, et rogner est notre travail, pas le vôtre.

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 envoyezCe que vous obtenezPlan
tts-1, ou rienVoix standard. Notre propre catalogue, rapide et économique.Tous
tts-1-hdVoix haute qualité. Le même catalogue, moteur premium.Payant
tts-1-hd + un échantillon de voixClonage. 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.

La haute qualité coûte environ 19 fois plus par seconde que la standard, et c'est le même prix que vous cloniez ou non : ce qui est cher, c'est le moteur, non l'origine de la voix. Si vous voulez seulement être clairement compris, 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 :

LanguesVoix du catalogue
tts-1 · standard9 : espagnol, anglais (et britannique), français, italien, portugais, hindi, japonais et chinoisBeaucoup, 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 autresPeu, 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.

En clonage, l'échantillon commande. Si l'échantillon a un accent marqué de sa propre langue et que vous lui demandez d'en parler une autre, le résultat ne sonne pas toujours natif : il est clairement compris, mais on devine d'où il vient. Ce n'est pas une règle fixe — nous avons entendu des échantillons anglais très bons en espagnol — cela dépend de l'échantillon. Si la langue cible compte, testez d'abord avec un échantillon dans cette langue.
Pourquoi la voix haute qualité et le clonage sont payants. Cloner une voix est une opération sensible : en Espagne, une voix est une donnée personnelle. Un plan payant signifie qu'il y a une identité derrière chaque requête, et c'est ce qui permet d'en répondre si quelqu'un clone une voix qu'il n'aurait pas dû. Ce n'est pas qu'une question de coût.

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 phrasesDuréeContre une espace
espace · 2 espaces · 4 espaces12,2 s
virgule · point-virgule · deux-points · points de suspension · tiret12,1–12,3 s
saut de ligne21,4 s+75 %
2 sauts · 3 sauts21,4 s+75 %
Trois choses en découlent, et aucune n'est évidente :

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.

Cache : le même texte avec la même voix est servi depuis le cache et coûte 10 %. La réponse l'indique dans l'en-tête 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-CacheCe qui s'est passé
HITServi depuis le cache. Coûte 10 %.
MISSGénéré et stocké pour l'heure suivante.
BYPASSVous avez demandé sans cache : généré et rien stocké.
ADHOCVoix clonée à la volée. Jamais mise en cache, que vous le demandiez ou non.
DISABLEDLe cache est désactivé côté serveur.
Cela coûte le plein tarif, bien sûr : c'est généré à chaque fois. Et une voix clonée à la volée n'est jamais mise en cache, il n'y a donc rien à désactiver là.

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
RenvoieLe fichier completaudio/wav par morceaux (Transfer-Encoding: chunked)
Formatsmp3 · wav · opus · flac · pcmwav uniquement
CacheOui, une heure à 10 %Non : il n'y a pas de fichier à stocker
Voix clonéeOuiOui
PrixLe 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.

Vous êtes facturé pour ce qui est livré. Dans une réponse par morceaux, le moteur ne peut pas annoncer à l'avance la durée de l'audio — les en-têtes partent avant qu'il n'existe — la durée est donc calculée à partir des octets livrés : WAV mono 16 bits à 24 000 Hz avec la voix standard et 48 000 Hz avec la clonée. C'est exact, non une estimation. Si vous coupez la connexion à mi-chemin, vous payez ce qui vous est parvenu.

Traduire

The 50 languages you can write in: these are what translation accepts as INPUT.

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.

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ètreTypeDescription
filefichierL'audio source.
targetqueryRequis. Langue cible.
sourcequeryLangue source. Détectée par défaut.
responsequeryboth texte et audio · text texte seul · audio audio seul
voicequeryVoix de sortie, du catalogue standard. Ignorée quand vous demandez preserve_voice.
preserve_voicequery1 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.
speedqueryVitesse 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.
formatqueryFormat 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.

Si vous connaissez la langue source, déclarez-la dans source. C'est toujours plus fiable que de la laisser à la détection.
Les phrases très courtes se traduisent moins précisément. Quelques mots isolés ne donnent aucun contexte pour choisir entre deux sens d'un même mot, et cela vaut pour tout traducteur. Envoyez la phrase entière quand vous le pouvez.
Langues avec une voix : nous traduisons vers ~50 langues, mais la traduction se synthétise avec la voix standard, donc seules neuf peuvent revenir en audio. Si vous demandez de l'audio dans une qui ne l'a pas, la requête est rejetée avec 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 :

ÉtapeCe qui se passeFacturé
1. TranscrireVotre enregistrement passe par la reconnaissance vocale.À la seconde d'audio d'entrée.
2. TraduireLe texte est traduit dans la langue cible.Inclus dans le supplément de chaîne.
3. ParlerLe 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.
Cela coûte nettement plus que traduire avec une voix du catalogue. Une seconde de voix clonée vaut environ 19 fois une seconde de voix standard, et c'est le même moteur et le même prix que le clonage via /v1/audio/speech. La page Studio vous montre le coût estimé avant de le lancer, la case déjà cochée.
Ce dont elle a besoin et ce dont elle n'a pas besoin. Vous n'avez pas besoin d'un échantillon de voix séparé : l'enregistrement lui-même suffit, et nous en prenons les premières secondes utilisables. Si vous envoyez du texte au lieu d'audio, 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.

EndpointCe qu'il fait
POST /v1/audio/sentimentTon émotionnel de l'enregistrement.
POST /v1/audio/profileProfil du locuteur : tranche d'âge et genre estimés.
POST /v1/audio/diarizeQui 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
Le profil est une estimation acoustique, non un fait sur le locuteur. Il se fonde sur des caractéristiques de la voix et il se trompe. Ne l'utilisez pour rien qui ait des conséquences pour une personne.

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ètreTypeDescription
filefichierRequis. L'enregistrement.
excludequeryDésactive les enrichissements : ?exclude=emotion,profile,diarize
languagequeryLangue 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.

Une défaillance partielle ne fait pas tomber le résumé. Si un enrichissement échoue, la réponse sort quand même avec un tableau 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 LLMMotsTokens
Transcription complète10 42915 410
Résumé structuré294 – 422484 – 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.

Et il y a un second effet, qui n'est pas une question d'argent. Si seul le résumé parvient à ce tiers, l'enregistrement et la transcription littérale ne quittent jamais cet endroit. Moins de surface exposée, et un transfert de moins à justifier dans votre registre des activités de traitement.

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.

Quand c'est une mauvaise idée. Un résumé est une perte délibérée d'information. Si votre prompt a besoin de la citation littérale, du moment exact où quelque chose a été dit, ou d'un détail qui apparaît une fois et en passant — un numéro de commande, un montant, un nom propre — le résumé peut ne pas le porter. Pour cela, envoyez la transcription, ou les deux. La règle pratique : résumé pour « de quoi s'agissait-il et que faut-il faire ? », transcription pour « qu'ont-ils dit exactement ? ».

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.