Vai alla navigazione

Speech to Text multicanale

Questa guida mostra come utilizzare la modalità di trascrizione multicanale con l’API Speech to Text.

Guida pratica · Presuppone che tu abbia completato la guida rapida di Speech to Text .

Panoramica

La funzionalità Speech to Text multicanale ti consente di trascrivere file audio in cui ciascun canale contiene un interlocutore distinto. È particolarmente utile per le registrazioni in cui gli interlocutori sono isolati su canali audio separati, offrendo trascrizioni più pulite senza necessità di diarizzazione degli interlocutori.

Ogni canale viene elaborato in modo indipendente e riceve automaticamente un ID interlocutore in base al suo numero di canale (canale 0 → speaker_0, canale 1 → speaker_1 e così via). Il sistema estrae i singoli canali dal file audio di input e li trascrive in parallelo. Per impostazione predefinita, l’API restituisce una trascrizione per canale; imposta multichannel_output_style=combined per ricevere invece un’unica trascrizione con tutti i canali uniti in un elenco ordinato per ora di inizio, con ogni parola contrassegnata dal relativo channel_index.

Casi d’uso comuni

  • Registrazioni di interviste stereo - Intervistatore sul canale sinistro, intervistato sul canale destro
  • Registrazioni di podcast multitraccia - Ogni partecipante registrato su una traccia separata
  • Registrazioni di call center - Agente e cliente separati su canali diversi
  • Registrazioni di conferenze - Singoli partecipanti isolati su canali separati
  • Procedimenti giudiziari - Più parti registrate su canali distinti

Requisiti

  • Un account ElevenLabs con una chiave API
  • File audio multicanale (WAV, MP3 o altri formati supportati)
  • Massimo 5 canali per file audio
  • Ogni canale deve contenere un solo interlocutore

Come funziona

1

Prepara l'audio multicanale

Assicurati che gli interlocutori siano isolati su canali separati nel file audio. La funzionalità multicanale supporta fino a 5 canali, con ogni canale associato a un interlocutore specifico:

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

Configura i parametri dell'API

Quando effettui una richiesta speech-to-text, devi impostare:

  • use_multi_channel: true
  • diarize: false (la modalità multicanale gestisce la separazione degli interlocutori tramite i canali)

Facoltativamente, puoi controllare la struttura della risposta con:

  • multichannel_output_style: separate (predefinito) restituisce una trascrizione per canale. combined unisce tutti i canali in un’unica trascrizione le cui parole sono ordinate per ora di inizio e ciascuna contiene un channel_index, corrispondendo alla struttura standard della risposta a canale singolo. combined richiede i timestamp (timestamps_granularity non deve essere none) e non è supportato con la consegna tramite webhook o il rilevamento/oscuramento delle entità.

Il parametro num_speakers non può essere utilizzato con la modalità multicanale, poiché il numero di interlocutori viene determinato automaticamente dal numero di canali. La modalità multicanale presuppone che vi sia esattamente un interlocutore per canale. Se ce ne sono di più, assegnerà lo stesso ID interlocutore a tutti gli interlocutori del canale.

3

Elabora la risposta

Per impostazione predefinita (multichannel_output_style=separate), l’audio multicanale restituisce un formato di risposta diverso da quello a canale singolo:

Se imposti use_multi_channel: true ma fornisci un file audio a canale singolo (mono), riceverai una risposta standard a canale singolo, non il formato multicanale. Il formato di risposta multicanale viene restituito solo quando il file audio contiene effettivamente più canali.

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

Con multichannel_output_style=combined, la risposta usa la stessa struttura piatta di una trascrizione a canale singolo (text e words di livello superiore, senza array transcripts), con tutti i canali uniti in un elenco ordinato per ora di inizio. Ogni parola include un channel_index (e speaker_id) che identifica il relativo canale.

Implementazione

Trascrizione multicanale di base

Ecco un esempio completo per trascrivere un file audio stereo con due interlocutori:

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_v2',
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}")

Creazione di trascrizioni conversazionali

Il modo più semplice per ottenere una trascrizione in stile conversazione, ordinata nel tempo, è richiedere multichannel_output_style=combined: l’API restituisce un unico elenco words, già ordinato per ora di inizio, con un channel_index e speaker_id su ogni parola:

Output combinato (consigliato)
with open("stereo_interview.wav", "rb") as audio_file:
result = elevenlabs.speech_to_text.convert(
file=audio_file,
model_id="scribe_v2",
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}")

Se utilizzi l’output separate predefinito, puoi invece unire lato client le trascrizioni per canale:

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']}")

Utilizzo dei webhook con il multicanale

La trascrizione multicanale supporta la consegna tramite webhook per l’elaborazione asincrona:

I webhook restituiscono il formato separate (per canale). multichannel_output_style=combined non è attualmente supportato con la consegna tramite webhook: usa una richiesta sincrona oppure unisci lato client il payload del webhook per canale.

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_v2',
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

Gestione degli errori

Errori di convalida comuni

Errore: La modalità multicanale non supporta la diarizzazione e assegna gli interlocutori in base al canale su cui parlano.

Soluzione: Imposta sempre diarize=false quando utilizzi la modalità multicanale.

Errore: Non puoi specificare num_speakers quando use_multi_channel è abilitato. Il numero di interlocutori viene determinato automaticamente dal numero di canali. Soluzione: Rimuovi il parametro num_speakers dalla richiesta.

Errore: La modalità multicanale supporta fino a 5 canali, ma il file audio contiene X canali.

Soluzione: Elabora solo i primi 5 canali o pre-elabora l’audio per ridurre il numero di canali.

Errore: multichannel_output_style=‘combined’ richiede timestamp; imposta timestamps_granularity su ‘word’ o ‘character’.

Soluzione: L’output combinato ordina le parole per tempo, quindi imposta timestamps_granularity su word (l’impostazione predefinita) o character.

Errore: multichannel_output_style=‘combined’ non è ancora supportato con la consegna tramite webhook.

Soluzione: Utilizza una richiesta sincrona con combined oppure mantieni l’output separate predefinito quando usi i webhook e unisci lato client.

Best practice

Preparazione dell’audio

Per risultati ottimali: - Usa una frequenza di campionamento di 16 kHz per prestazioni migliori - Rimuovi i canali silenziosi o inutilizzati prima dell’elaborazione - Assicurati che ogni canale contenga un solo interlocutore - Usa formati lossless (WAV) quando possibile per la migliore qualità

Ottimizzazione delle prestazioni

Il costo di concorrenza aumenta linearmente con il numero di canali. Un file di 60 secondi con 3 canali ha un costo di concorrenza 3 volte superiore rispetto a un file a canale singolo.

Puoi stimare il tempo di elaborazione per l’audio multicanale usando la seguente formula:

Tempo di elaborazione=(D⋅0.3)+2+(N⋅0.5)Tempo\ di\ elaborazione = (D \cdot 0.3) + 2 + (N \cdot 0.5)

Dove:

  • DD = durata del file in secondi
  • NN = numero di canali
  • 0.30.3 = fattore di velocità di elaborazione (circa il 30% del tempo reale)
  • 22 = overhead fisso in secondi
  • 0.50.5 = overhead per canale in secondi

Esempio: Per un file stereo di 60 secondi (2 canali):

Tempo di elaborazione=(60⋅0.3)+2+(2⋅0.5)=18+2+1=21 secondiTempo\ di\ elaborazione = (60 \cdot 0.3) + 2 + (2 \cdot 0.5) = 18 + 2 + 1 = 21\ secondi

Considerazioni sulla memoria

Per file multicanale di grandi dimensioni, valuta lo streaming o la suddivisione in blocchi:

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_v2',
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 restituirà un errore. Dovrai selezionare quali 5 canali inviare all’API oppure mixare alcuni canali prima di inviarli all’API.

Sì, ma non è necessario. Se invii audio mono con use_multi_channel=true, riceverai una risposta standard a canale singolo, non il formato multicanale.

Sì. Imposta multichannel_output_style=combined per ricevere un’unica trascrizione con tutti i canali uniti e ordinati per ora di inizio, con ogni parola contrassegnata dal relativo channel_index. Questo corrisponde alla struttura standard della risposta a canale singolo. Richiede i timestamp e non è disponibile con la consegna tramite webhook.

Gli ID interlocutore sono deterministici in base al numero di canale: il canale 0 diventa speaker_0, il canale 1 diventa speaker_1 e così via.

Sì, ogni canale viene elaborato in modo indipendente e può rilevare lingue diverse. Il rilevamento della lingua avviene per canale. Con multichannel_output_style=combined, il valore language_code di livello superiore riflette il canale con maggiore confidenza, mentre ogni parola conserva il proprio channel_index.

Passaggi successivi