Aller au contenu
Se connecter

/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èmeDifficultéOutils
Segmentation des tours de paroleTraitable à partir du signal seulVariations d’énergie + d’enveloppe spectrale
Identification du locuteurDifficile, nécessite des embeddingsModèles comme pyannote, NeMo, Resemblyzer
Diarisation du locuteurVersion combinée des deuxDifficile, 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 :

  1. 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.
  2. 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.
  3. 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 :

  1. Plus de 2 à 3 locuteurs, surtout avec des chevauchements.
  2. Mixage multicanal : un seul fichier mono avec plusieurs micros éloignés.
  3. L’identification du locuteur est requise (pas seulement « un changement de tour a eu lieu » mais « le locuteur A est de retour »).
  4. 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