Transcriptions et stratégies de validation

Ce guide explique comment gérer les transcriptions et les stratégies de validation avec l’API ElevenLabs Realtime Speech to Text.

Guide pratique · Suppose que vous avez suivi le guide sur le streaming côté client ou le streaming côté serveur.

Vue d’ensemble

Lors de la transcription audio, vous recevez des transcriptions partielles et validées.

  • Transcriptions partielles : les résultats intermédiaires de la transcription
  • Transcriptions validées : les résultats finaux du segment de transcription, envoyés lorsqu’un message « commit » est reçu. Une session peut comporter plusieurs transcriptions validées.

La transcription validée peut facultativement contenir des horodatages au niveau des mots. Ceux-ci ne sont reçus que lorsque l’option « include timestamps » est définie sur true.

# Initialize the connection
connection = await elevenlabs.speech_to_text.realtime.connect(RealtimeUrlOptions(
model_id="scribe_v2_realtime",
include_timestamps=True, # Include this to receive the RealtimeEvents.COMMITTED_TRANSCRIPT_WITH_TIMESTAMPS event with word-level timestamps
))

Stratégies de validation

Lors de l’envoi de fragments audio via WebSocket, les segments de transcription peuvent être validés de deux manières : validation manuelle ou détection d’activité vocale (VAD).

Validation manuelle

Avec la stratégie de validation manuelle, vous décidez quand valider les segments de transcription. Il s’agit de la stratégie utilisée par défaut. La validation d’un segment efface la transcription accumulée déjà traitée et démarre un nouveau segment sans perdre le contexte. Pour réduire la latence, il est recommandé de valider toutes les 20 à 30 secondes. Même sans validation manuelle, le modèle valide automatiquement après environ 36 secondes d’audio accumulé.

Pour de meilleurs résultats, validez pendant les silences ou à un autre point logique, comme un changement de tour de parole.

Le traitement de la transcription commence après l’envoi des 2 premières secondes d’audio.
await connection.send({
"audio_base_64": audio_base_64,
"sample_rate": 16000,
})
# When ready to finalize the segment
await connection.commit()

Effectuer plusieurs validations manuelles successives sur une courte période peut dégrader les performances du modèle.

Envoi du contexte textuel précédent

Lors de l’envoi d’audio à transcrire, vous pouvez envoyer le contexte textuel précédent avec le premier fragment audio afin d’aider le modèle à comprendre le contexte de la parole. Cela est utile dans plusieurs cas :

  • Texte de l’agent pour les cas d’usage d’IA conversationnelle : permet au modèle de mieux comprendre le contexte de la conversation et de produire de meilleures transcriptions.
  • Reconnexion après une erreur réseau : permet au modèle de poursuivre la transcription en utilisant le texte précédent comme indication.
  • Informations contextuelles générales : une brève description du sujet de la transcription aide le modèle à comprendre le contexte.

L’envoi du contexte previous_text n’est possible qu’avec le premier fragment audio via connection.send(). L’envoyer dans des fragments ultérieurs entraîne une erreur. Le texte précédent fonctionne mieux lorsqu’il contient moins de 50 caractères.

await connection.send({
"audio_base_64": audio_base_64,
"previous_text": "The previous text context",
})

Détection d’activité vocale (VAD)

Avec la stratégie VAD, le moteur de transcription détecte automatiquement les segments de parole et de silence. Lorsqu’un seuil de silence est atteint, le moteur de transcription valide automatiquement le segment de transcription.

Lors de la transcription de l’audio du microphone dans l’intégration côté client, il est recommandé d’utiliser la stratégie VAD.

import { Scribe, AudioFormat, CommitStrategy } from "@elevenlabs/client";
const connection = Scribe.connect({
token: "sutkn_1234567890",
modelId: "scribe_v2_realtime",
audioFormat: AudioFormat.PCM_16000,
commitStrategy: CommitStrategy.VAD,
vadSilenceThresholdSecs: 1.5,
vadThreshold: 0.4,
minSpeechDurationMs: 100,
minSilenceDurationMs: 100,
});

Maintenir la connexion pendant les silences

Les SDK officiels ne coupent pas la connexion lorsqu’aucun message n’arrive, la plupart des intégrations n’en ont donc pas besoin. Si votre propre client WebSocket, ou un proxy ou répartiteur de charge intermédiaire, ferme la connexion lorsqu’aucune trame n’arrive pendant un certain temps, transmettez le paramètre de requête facultatif keepalive_interval_ms lors de la connexion. C’est important pendant les silences prolongés, par exemple lors d’un appel téléphonique avec des pauses de 10 à 15 secondes. Environ une fois par intervalle, le serveur envoie un partial_transcript de maintien de connexion : vide (text: "") si le segment actuel ne comporte aucun texte non validé, ou répétant le dernier texte partiel dans le cas contraire.

Les signaux de maintien de connexion ne sont pas des pings autonomes : vous devez continuer à diffuser l’audio (les trames de silence conviennent). Si vous arrêtez d’envoyer de l’audio, aucun signal de maintien n’est envoyé et le serveur ferme la connexion après 15 secondes sans message client. Cette limite du serveur n’est pas configurable.

  • Accepte un entier entre 500 et 10000 (millisecondes). Cette option est désactivée par défaut ; omettez le paramètre pour conserver le comportement existant.
  • Les valeurs hors plage ou non entières entraînent l’envoi par le serveur d’une erreur invalid_request et la fermeture de la connexion.
  • Les signaux de maintien sont déclenchés par le traitement effectif de l’audio silencieux envoyé par le modèle, et non par un minuteur autonome. Ils confirment donc également que le chemin de transcription est actif.
  • L’audio est traité par fragments d’environ 1 seconde. Les signaux de maintien arrivent donc environ une fois par intervalle, arrondi à cette cadence, par exemple, 1000 se déclenche environ une fois par seconde et 3000 environ toutes les 3 secondes. Le premier signal de maintien d’une session arrive environ 2 secondes après son début, car le serveur met en mémoire tampon les ~2 premières secondes d’audio avant la transcription. Définissez votre intervalle à environ un tiers au maximum de votre propre délai de lecture afin de conserver une marge.
  • Le champ text d’un signal de maintien n’est vide que si le segment actuel ne contient encore aucun texte non validé. Si une pause survient après de la parole, mais avant une validation, ce qui est particulièrement visible avec filter_background_audio=true ou en mode de validation manuelle sans validation, le signal de maintien répète le dernier texte partiel afin de ne jamais effacer le texte intermédiaire. Après une validation, les signaux de maintien redeviennent vides jusqu’à l’arrivée d’une nouvelle parole.
  • Fonctionne avec commit_strategy=manual et commit_strategy=vad, ainsi qu’avec filter_background_audio=true. N’a aucune incidence sur la facturation, au-delà de l’audio que vous diffusez déjà.
  • La configuration config du message session_started renvoie keepalive_interval_ms (null lorsqu’il est désactivé).

Un partial_transcript vide (text: "") signifie « aucune parole dans le segment actuel ». Un partial_transcript répété et identique pendant une pause est également un signal de maintien, les clients doivent simplement afficher les résultats partiels comme ils le font déjà, sans traiter la répétition comme un cas particulier.

Ajoutez le paramètre à l’URL WebSocket :

wss://api.elevenlabs.io/v1/speech-to-text/realtime?model_id=scribe_v2_realtime&commit_strategy=vad&keepalive_interval_ms=1000

Formats audio pris en charge

FormatFréquence d’échantillonnageDescription
pcm_80008 kHzPCM 16 bits, petit-boutiste
pcm_1600016 kHzPCM 16 bits, petit-boutiste (recommandé)
pcm_2205022,05 kHzPCM 16 bits, petit-boutiste
pcm_2400024 kHzPCM 16 bits, petit-boutiste
pcm_4410044,1 kHzPCM 16 bits, petit-boutiste
pcm_4800048 kHzPCM 16 bits, petit-boutiste
ulaw_80008 kHzEncodage μ-law 8 bits

Bonnes pratiques

Qualité audio

  • Pour de meilleurs résultats, utilisez une fréquence d’échantillonnage de 16 kHz afin d’obtenir un équilibre optimal entre qualité et bande passante.
  • Assurez une entrée audio nette avec un minimum de bruit de fond.
  • Utilisez un gain de microphone approprié pour éviter l’écrêtage.
  • Seul l’audio mono est actuellement pris en charge.

Taille des fragments

  • Envoyez des fragments audio d’une durée de 0,1 à 1 seconde pour un streaming fluide.
  • Les fragments plus petits réduisent la latence, mais augmentent la surcharge.
  • Les fragments plus grands sont plus efficaces, mais peuvent introduire de la latence.

Étapes suivantes