Passer à la navigation

Speech to Text multicanal

Ce guide explique comment utiliser le mode de transcription multicanal avec l’API Speech to Text.

Guide pratique · Suppose que vous avez suivi le démarrage rapide de Speech to Text .

Vue d’ensemble

La fonctionnalité Speech to Text multicanal vous permet de transcrire des fichiers audio dont chaque canal contient un intervenant distinct. Elle est particulièrement utile pour les enregistrements où les intervenants sont isolés sur des canaux audio séparés, afin d’obtenir des transcriptions plus nettes sans recourir à la diarisation des intervenants.

Chaque canal est traité indépendamment et reçoit automatiquement un ID d’intervenant selon son numéro de canal (canal 0 → speaker_0, canal 1 → speaker_1, etc.). Le système extrait les différents canaux de votre fichier audio d’entrée et les transcrit en parallèle. Par défaut, l’API renvoie une transcription par canal ; définissez multichannel_output_style=combined pour recevoir à la place une transcription unique regroupant tous les canaux dans une liste triée par heure de début, chaque mot étant étiqueté avec son channel_index.

Cas d’utilisation courants

  • Enregistrements d’entretiens stéréo : enquêteur sur le canal gauche, personne interrogée sur le canal droit
  • Enregistrements de podcasts multipistes : chaque participant est enregistré sur une piste distincte
  • Enregistrements de centres d’appels : agent et client séparés sur différents canaux
  • Enregistrements de conférences : participants isolés sur des canaux distincts
  • Procédures judiciaires : plusieurs parties enregistrées sur des canaux distincts

Prérequis

  • Un compte ElevenLabs avec une clé API
  • Un fichier audio multicanal (WAV, MP3 ou autre format pris en charge)
  • Maximum 5 canaux par fichier audio
  • Chaque canal ne doit contenir qu’un seul intervenant

Fonctionnement

1

Préparez votre audio multicanal

Assurez-vous que les intervenants de votre fichier audio sont isolés sur des canaux distincts. La fonctionnalité multicanal prend en charge jusqu’à 5 canaux, chacun étant associé à un intervenant spécifique :

  • Canal 0 → speaker_0
  • Canal 1 → speaker_1
  • Canal 2 → speaker_2
  • Canal 3 → speaker_3
  • Canal 4 → speaker_4
2

Configurez les paramètres de l’API

Lors d’une requête Speech to Text, vous devez définir :

  • use_multi_channel: true
  • diarize: false (le mode multicanal sépare les intervenants via les canaux)

Vous pouvez également contrôler le format de la réponse avec :

  • multichannel_output_style: separate (par défaut) renvoie une transcription par canal. combined fusionne tous les canaux en une transcription unique dont les mots sont triés par heure de début, chacun comportant un channel_index, conformément au format de réponse standard pour un seul canal. combined nécessite des horodatages (timestamps_granularity ne doit pas être none) et n’est pas pris en charge avec la livraison par webhook ni avec la détection ou le masquage d’entités.

Le paramètre num_speakers ne peut pas être utilisé avec le mode multicanal, car le nombre d’intervenants est automatiquement déterminé par le nombre de canaux. Le mode multicanal suppose qu’il y aura exactement un intervenant par canal. S’il y en a plusieurs, le même ID d’intervenant sera attribué à tous les intervenants du canal.

3

Traitez la réponse

Par défaut (multichannel_output_style=separate), l’audio multicanal renvoie un format de réponse différent de celui d’un seul canal :

Si vous définissez use_multi_channel: true mais fournissez un fichier audio monocanal (mono), vous recevrez une réponse standard pour un seul canal, et non le format multicanal. Le format de réponse multicanal est uniquement renvoyé lorsque le fichier audio contient réellement plusieurs canaux.

{
"language_code": "en",
"language_probability": 0.98,
"text": "Hello world",
"words": [...]
}

Avec multichannel_output_style=combined, la réponse utilise le même format plat qu’une transcription monocanal (text et words au niveau supérieur, sans tableau transcripts), tous les canaux étant fusionnés dans une liste triée par heure de début. Chaque mot inclut un channel_index (et un speaker_id) identifiant son canal.

Implémentation

Transcription multicanal de base

Voici un exemple complet de transcription d’un fichier audio stéréo avec deux intervenants :

from elevenlabs import ElevenLabs
elevenlabs = ElevenLabs(api_key="YOUR_API_KEY")
def transcribe_multichannel(audio_file_path):
with open(audio_file_path, 'rb') as audio_file:
result = elevenlabs.speech_to_text.convert(
file=audio_file,
model_id='scribe_v3',
use_multi_channel=True,
diarize=False,
timestamps_granularity='word'
)
return result
# Process the response
result = transcribe_multichannel('stereo_interview.wav')
if hasattr(result, 'transcripts'): # Multichannel response
for transcript in result.transcripts:
channel = transcript.channel_index
text = transcript.text
print(f"Channel {channel} (speaker_{channel}): {text}")
else: # Single channel response (fallback)
print(f"Text: {result.text}")

Création de transcriptions de conversations

La manière la plus simple d’obtenir une transcription de conversation classée par heure consiste à demander multichannel_output_style=combined : l’API renvoie une seule liste words, déjà triée par heure de début, avec un channel_index et un speaker_id pour chaque mot :

Sortie combinée (recommandée)
with open("stereo_interview.wav", "rb") as audio_file:
result = elevenlabs.speech_to_text.convert(
file=audio_file,
model_id="scribe_v3",
use_multi_channel=True,
multichannel_output_style="combined",
diarize=False,
timestamps_granularity="word",
)
for word in result.words:
if word.type == "word":
print(f"speaker_{word.channel_index}: {word.text}")

Si vous utilisez la sortie separate par défaut, vous pouvez à la place fusionner côté client les transcriptions de chaque canal :

def create_conversation_transcript(multichannel_result):
"""Create a conversation-style transcript with speaker labels"""
all_words = []
if hasattr(multichannel_result, 'transcripts'):
# Collect all words from all channels
for transcript in multichannel_result.transcripts:
for word in transcript.words or []:
if word.type == 'word':
all_words.append({
'text': word.text,
'start': word.start,
'speaker_id': word.speaker_id,
'channel': transcript.channel_index
})
# Sort by timestamp
all_words.sort(key=lambda w: w['start'])
# Group consecutive words by speaker
conversation = []
current_speaker = None
current_text = []
for word in all_words:
if word['speaker_id'] != current_speaker:
if current_text:
conversation.append({
'speaker': current_speaker,
'text': ' '.join(current_text)
})
current_speaker = word['speaker_id']
current_text = [word['text']]
else:
current_text.append(word['text'])
# Add the last segment
if current_text:
conversation.append({
'speaker': current_speaker,
'text': ' '.join(current_text)
})
return conversation
# Format the output
conversation = create_conversation_transcript(result)
for turn in conversation:
print(f"{turn['speaker']}: {turn['text']}")

Utiliser des webhooks avec le multicanal

La transcription multicanal prend en charge la livraison par webhook pour le traitement asynchrone :

Les webhooks renvoient le format separate (par canal). multichannel_output_style=combined n’est pas actuellement pris en charge avec la livraison par webhook. Utilisez une requête synchrone ou fusionnez côté client les charges utiles webhook de chaque canal.

from elevenlabs import ElevenLabs
elevenlabs = ElevenLabs(api_key="YOUR_API_KEY")
async def transcribe_multichannel_with_webhook(audio_file_path):
with open(audio_file_path, 'rb') as audio_file:
result = await elevenlabs.speech_to_text.convert_async(
file=audio_file,
model_id='scribe_v3',
use_multi_channel=True,
diarize=False,
webhook=True # Enable webhook delivery
)
print(f"Transcription started with task ID: {result.task_id}")
return result.task_id

Gestion des erreurs

Erreurs de validation courantes

Erreur : le mode multicanal ne prend pas en charge la diarisation et attribue les intervenants selon le canal sur lequel ils parlent.

Solution : définissez toujours diarize=false lorsque vous utilisez le mode multicanal.

Erreur : impossible de spécifier num_speakers lorsque use_multi_channel est activé. Le nombre d’intervenants est automatiquement déterminé par le nombre de canaux. Solution : supprimez le paramètre num_speakers de votre requête.

Erreur : le mode multicanal prend en charge jusqu’à 5 canaux, mais le fichier audio contient X canaux.

Solution : traitez uniquement les 5 premiers canaux ou prétraitez votre audio afin de réduire le nombre de canaux.

Erreur : multichannel_output_style=‘combined’ nécessite des horodatages ; définissez timestamps_granularity sur ‘word’ ou ‘character’.

Solution : la sortie combinée trie les mots par heure ; définissez donc timestamps_granularity sur word (par défaut) ou character.

Erreur : multichannel_output_style=‘combined’ n’est pas encore pris en charge avec la livraison par webhook.

Solution : utilisez une requête synchrone avec combined, ou conservez la sortie separate par défaut avec les webhooks et fusionnez côté client.

Bonnes pratiques

Préparation de l’audio

Pour des résultats optimaux : - Utilisez une fréquence d’échantillonnage de 16 kHz pour de meilleures performances - Supprimez les canaux silencieux ou inutilisés avant le traitement - Assurez-vous que chaque canal ne contient qu’un seul intervenant - Utilisez des formats sans perte (WAV) lorsque possible pour une qualité optimale

Optimisation des performances

Le coût en requêtes simultanées augmente linéairement avec le nombre de canaux. Un fichier de 60 secondes comportant 3 canaux représente un coût en requêtes simultanées trois fois supérieur à celui d’un fichier monocanal.

Vous pouvez estimer le temps de traitement d’un audio multicanal à l’aide de la formule suivante :

Temps de traitement=(D⋅0.3)+2+(N⋅0.5)Temps\ de\ traitement = (D \cdot 0.3) + 2 + (N \cdot 0.5)

Où :

  • DD = durée du fichier en secondes
  • NN = nombre de canaux
  • 0.30.3 = facteur de vitesse de traitement (environ 30 % du temps réel)
  • 22 = surcharge fixe en secondes
  • 0.50.5 = surcharge par canal en secondes

Exemple : pour un fichier stéréo de 60 secondes (2 canaux) :

Temps de traitement=(60⋅0.3)+2+(2⋅0.5)=18+2+1=21 secondesTemps\ de\ traitement = (60 \cdot 0.3) + 2 + (2 \cdot 0.5) = 18 + 2 + 1 = 21\ secondes

Considérations relatives à la mémoire

Pour les fichiers multicanaux volumineux, envisagez le streaming ou le découpage en fragments :

def process_large_multichannel_file(file_path, chunk_duration=300):
"""Process large files in chunks (5-minute segments)"""
from pydub import AudioSegment
from elevenlabs import ElevenLabs
import os
elevenlabs = ElevenLabs(api_key="YOUR_API_KEY")
audio = AudioSegment.from_file(file_path)
duration_ms = len(audio)
chunk_size_ms = chunk_duration * 1000
all_transcripts = []
for start_ms in range(0, duration_ms, chunk_size_ms):
end_ms = min(start_ms + chunk_size_ms, duration_ms)
# Extract chunk
chunk = audio[start_ms:end_ms]
chunk_file = f"temp_chunk_{start_ms}.wav"
chunk.export(chunk_file, format="wav")
# Transcribe chunk using SDK
with open(chunk_file, 'rb') as audio_file:
result = elevenlabs.speech_to_text.convert(
file=audio_file,
model_id='scribe_v3',
use_multi_channel=True,
diarize=False,
timestamps_granularity='word'
)
# Adjust timestamps
if hasattr(result, 'transcripts'):
for transcript in result.transcripts:
for word in transcript.words or []:
word.start += start_ms / 1000
word.end += start_ms / 1000
all_transcripts.extend(result.transcripts)
# Clean up
os.remove(chunk_file)
return all_transcripts

FAQ

L’API renverra une erreur. Vous devrez soit sélectionner les 5 canaux à envoyer à l’API, soit mixer certains canaux avant de les envoyer à l’API.

Oui, mais ce n’est pas nécessaire. Si vous envoyez un audio mono avec use_multi_channel=true, vous recevrez une réponse standard pour un seul canal, et non le format multicanal.

Oui. Définissez multichannel_output_style=combined pour recevoir une transcription unique regroupant tous les canaux et triée par heure de début, chaque mot étant étiqueté avec son channel_index. Ce format correspond à la réponse standard pour un seul canal. Il nécessite des horodatages et n’est pas disponible avec la livraison par webhook.

Les ID d’intervenant sont déterministes selon le numéro du canal : le canal 0 devient speaker_0, le canal 1 devient speaker_1, et ainsi de suite.

Oui, chaque canal est traité indépendamment et peut détecter des langues différentes. La détection de langue s’effectue par canal. Avec multichannel_output_style=combined, le language_code de niveau supérieur reflète le canal présentant la meilleure confiance, tandis que chaque mot conserve son channel_index.

Étapes suivantes