/docs · SignalLab · Deep
Segmentation des tours de parole : la stack pragmatique
La diarisation est un problème de ML difficile. La segmentation des tours de parole, la version économique, est suffisamment résolue pour être utilisée partout.
La vraie diarisation (« étiqueter chaque segment audio avec l’identité de la personne qui parle ») est un problème de ML difficile et un domaine de recherche actif. La segmentation des tours de parole (« repérer les moments où le locuteur change ») est beaucoup plus simple et utile pour la plupart des applications en aval.
Pour une archive audio, « montre-moi les changements de tour » est une demande plus courante que « dis-moi qui parle ». Ce document explique comment bien construire la version la plus simple.
Les deux problèmes, dissociés
| Problème | Difficulté | Outils |
|---|---|---|
| Segmentation des tours de parole | Traitable à partir du signal seul | Variations d’énergie + d’enveloppe spectrale |
| Identification du locuteur | Difficile, nécessite des embeddings | Modèles comme pyannote, NeMo, Resemblyzer |
| Diarisation du locuteur | Version combinée des deux | Difficile, systèmes ML de bout en bout |
La plupart des personnes qui demandent de la « diarisation » veulent en réalité une segmentation des tours de parole. Confirmez-le avant de sortir l’artillerie lourde.
L’approche fondée uniquement sur le signal
Un tour de parole apparaît dans le signal comme une discontinuité. Les caractéristiques les plus simples qui le captent :
- Discontinuité de l’enveloppe d’énergie : les locuteurs ont un volume de référence différent. Un changement de tour se manifeste souvent par un changement brusque du RMS à court terme.
- Variation de l’enveloppe spectrale : des locuteurs différents ont des motifs de formants différents. Même sans identifier qui parle, on peut détecter qu’un changement a eu lieu.
- Structure des pauses : les tours sont généralement encadrés par de courtes pauses (50–300 ms). Le motif pause-puis-spectre-différent est hautement prédictif.
Un pipeline simple :
def segment_turns(samples, sr, min_turn_sec=2.0):
# 1. Compute MFCCs in 25 ms frames, 10 ms hop
mfccs = mfcc(samples, sr, n_mfcc=13, hop=int(0.01 * sr))
# 2. Compute cosine distance between consecutive MFCC frames
dists = [cosine_distance(mfccs[i], mfccs[i+1]) for i in range(len(mfccs)-1)]
# 3. Smooth and threshold
smoothed = moving_average(dists, window=5)
threshold = percentile(smoothed, 95)
# 4. Find peaks above threshold separated by min_turn_sec
peaks = find_peaks(smoothed, height=threshold, distance=int(min_turn_sec / 0.01))
return [p * 0.01 for p in peaks] # convert to seconds
Ce n’est pas un système de diarisation à l’état de l’art. C’est une fonction de 30 lignes qui détecte 80 % des tours sur un matériau propre à deux locuteurs.
Pourquoi ça marche
Les locuteurs diffèrent suffisamment dans leurs enveloppes spectrales (déterminées par la position des formants, la longueur du conduit vocal, la hauteur tonale) pour que les vecteurs MFCC se situent dans des régions distinctes de l’espace des caractéristiques. Lorsque le locuteur change en cours d’enregistrement, le vecteur MFCC « saute » à travers cet espace, et la distance cosinus entre des trames consécutives forme un pic.
Le lissage simple et le seuillage par percentile gèrent la majeure partie du bruit. Vous manquerez les tours où les locuteurs ont des voix similaires, où l’un d’eux est beaucoup plus discret, ou lorsque les chevauchements sont importants, mais pour obtenir une chronologie utile sur la plupart des podcasts et des interviews, cela fonctionne.
Quand passer à une vraie diarisation
Vous avez besoin de la stack ML plus lourde lorsque :
- Plus de 2 à 3 locuteurs, surtout avec des chevauchements.
- Mixage multicanal : un seul fichier mono avec plusieurs micros éloignés.
- L’identification du locuteur est requise (pas seulement « un changement de tour a eu lieu » mais « le locuteur A est de retour »).
- Audio bruité du monde réel : enregistrements de rue, réunions avec une mauvaise acoustique.
Pour ces cas, pyannote.audio est actuellement le meilleur pipeline de diarisation open source. NeMo est une alternative davantage adaptée à l’entreprise. Les deux tournent sur GPU et nécessitent ~1-5 Go de poids de modèle, ce qui les rend peu adaptés au navigateur sans un travail considérable.
Ce que fait SignalLab
Le SignalLab Indexer (aperçu côté navigateur) utilise le motif de segmentation des tours de parole fondé uniquement sur le signal décrit ci-dessus. La version complète côté serveur s’oriente vers pyannote lorsque la précision de la diarisation compte. La version côté navigateur est suffisante pour le QA et l’exploration ; la version côté serveur est suffisante pour les archives de production.
L’arbre de décision :
- Faites-vous un QA rapide à l’ingestion ? Utilisez la segmentation fondée uniquement sur le signal.
- Produisez-vous des métadonnées par locuteur pour une archive ? Utilisez pyannote.
- Faites-vous de la transcription en temps réel avec étiquettes de locuteur ? Utilisez la diarisation intégrée du fournisseur d’ASR (Deepgram, AWS).
Connexe
More in SignalLab docs
- Intro
Un schéma de tags utile pour les archives audio
Ce qu’il faut mettre dans vos métadonnées audio pour que les outils en aval puissent vraiment s’en servir.
- Practical
Détection du clipping en streaming à grande échelle
Comment détecter le clipping dans l’audio dès l’ingestion, sans décoder le fichier entier.