Diarisation de locuteurs

Identifiez qui a parlé et quand dans un enregistrement multi-locuteurs. Deux moteurs de diarisation sont disponibles : un pipeline Pyannote en deux étapes (segmentation + chaînage de locuteurs basé sur l'activité, puis empreinte post-hoc) et un modèle de bout en bout Sortformer (CoreML, Neural Engine).

Moteurs

Sélectionnez le moteur avec --engine pyannote (par défaut) ou --engine sortformer.

Pyannote (par défaut)

Pipeline en deux étapes : la segmentation Pyannote traite des fenêtres qui se chevauchent avec un chaînage de locuteurs basé sur l'activité (corrélation de Pearson dans les zones de chevauchement) pour assigner des étiquettes de locuteurs globales. L'extraction post-hoc d'empreintes WeSpeaker permet l'identification d'un locuteur cible via un audio d'enrôlement.

Sortformer (CoreML)

Le modèle de diarisation neuronale de bout en bout de NVIDIA. Prédit directement l'activité par trame pour jusqu'à 4 locuteurs sans étapes séparées d'empreinte ou de clustering. S'exécute sur Neural Engine via CoreML avec des buffers d'état en streaming (FIFO + cache de locuteurs).

Note

Sortformer ne produit pas d'empreintes de locuteur. Les options --target-speaker et --embedding-engine ne sont disponibles qu'avec le moteur Pyannote.

Pipeline Pyannote

Le pipeline par défaut s'exécute en deux étapes :

Étape 1 : segmentation + chaînage de locuteurs

Pyannote segmentation-3.0 traite des fenêtres glissantes de 10 secondes avec 50 % de chevauchement. Un décodeur powerset convertit la sortie à 7 classes en probabilités par locuteur (jusqu'à 3 locuteurs locaux par fenêtre). Les fenêtres adjacentes partagent un chevauchement de 5 secondes — l'identité du locuteur est propagée entre les fenêtres en calculant la corrélation de Pearson entre les pistes de probabilités dans la zone de chevauchement, avec un appariement exclusif glouton pour des IDs de locuteur globaux cohérents.

Étape 2 : empreinte post-hoc

WeSpeaker ResNet34-LM extrait une empreinte centroïde de 256 dimensions par locuteur. Ces empreintes permettent l'extraction de locuteur cible (--target-speaker) mais ne pilotent pas l'assignation des locuteurs elle-même.

Utilisation en CLI

# Diarisation basique (pyannote, par défaut)
.build/release/audio diarize meeting.wav

# Sortformer de bout en bout (CoreML)
.build/release/audio diarize meeting.wav --engine sortformer

# Format de sortie RTTM (pour l'évaluation)
.build/release/audio diarize meeting.wav --rttm

# Sortie JSON
.build/release/audio diarize meeting.wav --json

Extraction de locuteur cible

Fournissez un audio d'enrôlement d'un locuteur connu pour n'extraire que ses segments d'un enregistrement. Le pipeline calcule l'empreinte du locuteur de l'audio d'enrôlement et trouve le cluster avec la plus haute similarité cosinus.

# Extraire les segments pour un locuteur spécifique
.build/release/audio diarize meeting.wav --target-speaker enrollment.wav

Évaluation DER

Évaluez la qualité de la diarisation en comparant à un fichier RTTM de référence. Le pipeline calcule le Diarization Error Rate (DER), qui mesure la proportion de temps incorrectement attribuée.

# Évaluer par rapport à un RTTM de référence
.build/release/audio diarize meeting.wav --score-against reference.rttm

Sortie RTTM

L'option --rttm produit une sortie Rich Transcription Time Marked, un format standard utilisé pour l'évaluation de la diarisation. Chaque ligne suit le format :

SPEAKER filename 1 start_time duration <NA> <NA> speaker_id <NA> <NA>

Options

OptionDescription
--target-speakerAudio d'enrôlement pour l'extraction de locuteur cible (pyannote uniquement)
--embedding-engineMoteur d'empreintes de locuteur : mlx ou coreml (pyannote uniquement)
--vad-filterPré-filtrage avec Silero VAD (pyannote uniquement)
--rttmSortie au format RTTM
--jsonSortie au format JSON
--score-againstFichier RTTM de référence pour l'évaluation DER
Important

La diarisation fonctionne mieux avec des enregistrements qui ont des tours de parole clairs. Une parole fortement chevauchante peut réduire la précision. Le nombre de locuteurs est déterminé automatiquement.

Téléchargements des modèles

Les modèles sont téléchargés automatiquement à la première utilisation :

ComposantModèleTailleHuggingFace
SegmentationPyannote-Segmentation-3.0~5,7 Moaufklarer/Pyannote-Segmentation-MLX
Empreinte de locuteurWeSpeaker-ResNet34-LM (MLX)~25 Moaufklarer/WeSpeaker-ResNet34-LM-MLX
Empreinte de locuteurWeSpeaker-ResNet34-LM (CoreML)~25 Moaufklarer/WeSpeaker-ResNet34-LM-CoreML
SortformerSortformer Diarization (CoreML)~240 Moaufklarer/Sortformer-Diarization-CoreML

API Swift

import SpeechVAD

let pipeline = try await DiarizationPipeline.fromPretrained()
let result = pipeline.diarize(audio: samples, sampleRate: 16000)
for seg in result.segments {
    print("Speaker \(seg.speakerId): [\(seg.startTime)s - \(seg.endTime)s]")
}

// Extraction de locuteur cible
let targetEmb = pipeline.embeddingModel.embed(audio: enrollmentAudio, sampleRate: 16000)
let segments = pipeline.extractSpeaker(
    audio: meetingAudio, sampleRate: 16000,
    targetEmbedding: targetEmb
)