Tłumaczenie automatyczne · Oryginał angielski

Diaryzacja mówców

Identyfikacja, kto przemawiał podczas nagrywania multigłośnika. Dostępne są cztery silniki: lekki Pyannote (wartość domyślna CLI), pełny rurociąg Community-1 (CoreML + rodzima PLDA / VBx), streaming Sortformer (CoreML, Neural Engine), oraz Nemotron 3 (CoreML INT8 lub MLX INT8).

Silniki

Wybierz silnik --engine pyannote (domyślnie), --engine community1, --engine sortformerlub --engine nemotron3.

Pyannote (domyślnie)

Gazociąg dwuetapowy: procesy segmentacji Pyannote nakładające się na siebie okna z ogniwami głośnikowymi opartymi na aktywności (korelacja Pearsona w strefach pokrywania się), aby przypisać globalne etykiety głośników. Post- hoc Wyciąganie osprzętu WeSpeaker umożliwia identyfikację głośnika poprzez wpisanie dźwięku.

Community-1 (CoreML + rodzimy VBx)

Pełną Pyannote Community-1 pakiet CoreML: 10- second PyanNet segmentation wind again every second, masked WeSpeaker embedddings feed centroid AHC and a 256 → 128 PLDA transformata, następnie rodzima Swift VBx i ograniczone przyporządkowanie tworzy globalne klastry. 256-divisional centroid na wykryty głośnik i obsługuje dokładne, minimalne lub maksymalne granice liczby głośników.

Sortformer (CoreML)

NVIDIA jest end- to- end neural diarization model. Bezpośrednio przewiduje aktywność głośników perframe do głośników 4 bez osobnego osadzania lub klastrowania etapów. Działa na Neural Engine poprzez CoreML ze streaming buforów stanu (FIFO + głośnik buforowy).

Na żywo, SortformerStreamingSession uruchamia .streaming Sortformer model stopniowo z 16 kHz mono bufory PCM dowolnego rozmiaru. Gdy tylko jego 560 ms jest dostępna, to postępuje w stopniach audio 480 MS; pięć-plik M- serii Neural Engine pilot mierzony 12.4 m mediana opóźnienia na 500 mas push. Etykiety głośnika postępują po Arrival- Order Głośnik Cache zamiast ponownie klastrować każde okno, a każde push zwraca migawki. finish() w teście równoważności falistej, końcowe segmenty dopasowane do całości bufor .streaming diaryzacja w obrębie około jednej ramki 80 ms.

Nemotron 3 (CoreML lub MLX)

NVIDIA Nemotron 3 przewiduje aktywność głośnika 10 ms dla maksymalnie ośmiu anonimowych głośników. Ostateczny eksport INT8 automatycznie pobrać z CoreML lub MLX. Domyślny przycisk CLI to CoreML; wybierz MLX z --nemotron3-backend mlx. Oba wspierać lokalny pakiet poprzez --nemotron3-directory.

Na wewnętrznej 132-zapis zestawu diaryzacji (12.82 godziny, 0.25 s kołnierz), wysłany Nemotron 3 MLX oraz CoreML punktacja runtimes 10.98% oraz 11.20% połączenie DER, odpowiednio, bez awarii. 48 Spotkania angielskie, zdobyli punkty 10.31% oraz 10.24%Patrz porównawcze i graniczne poziomy oceny w języku ojczystym.

Uwaga

W --target-speaker oraz --embedding-engine flagi są dostępne tylko z domyślną Pyannote silnik. Community-1 zwraca centroidy klastrów przez jego Swift API; Sortformer oraz Nemotron 3 nie wytwarzają osadzania głośników.

Zmierzone wyniki w systemach diaryzacji oraz w ośmiu językach, z punktacji jednej linijki, można zobaczyć Wartości odniesienia diaryzacji głośników.

Opublikowana wartość wyjściowa wskaźnika CALLHOME

Poniżej znajduje się opublikowany przez NVIDIA surowy, anonimowy poziom odniesienia dla diar_streaming_sortformer_4spk-v2. Jest to zewnętrzne odniesienie, a nie lokalny pomiar konwersji speech-swift CoreML, a nie wynik przypisywania głośników.

Zestaw danychStanDER
CALLHOME część 22 głośniki referencyjne6.57%
CALLHOME część 23 głośniki referencyjne10.05%
CALLHOME część 24 głośniki referencyjne12.44%

Wszystkie wiersze używają opóźnienia bufora wejściowego 1.04, pokrywają się, kołnierz 0.25 i post- przetwarzanie dostrojone na rozłączonej części CALLHOME 1. CALLHOM jest licencjonowany i nie jest połączone. Lokalne diarization-bench raporty porównywalne wyniki oddzielnie na podstawie liczby głośników odniesienia w konsoli i w JSON pod byReferenceSpeakerCount.

Community-1 Pipeline

Community-1 działa oba fazy neuronowe z CoreML i wszystkie przetwarzanie host w Swift, więc nie ładuje MLX lub wymagają Metal biblioteka cieniowania. Publikowane domyślne są zachowane: twardy dekodowanie powerset, czyste maski jednogłośnikowe z awaryjnym zakończeniem krótkiego toru, 0.6 próg powiązania centroidalnego, Fa=0.07, Fb=0.8, a co najwyżej 20 VBx iteracji.

Na stałe five-file VoxConverse release subset (1,057.49 sekundy, 0.25- drugi kołnierz, łącznie z pokrywaniem się), Swift wyjście odkodowane z pyannote.metrics zmierzone 4.66% DER / 21.43% JER; opublikowany pomiar odniesienia CoreML 4.65% / 21.42%Jest to mała kontrola parytetu, a nie twierdzenie o jakości.

Przy użyciu skali graficznej speech-swift na tym samym zestawie, mierzono Community-1 9.31% DER / 16.20% JER, 25.5 × real- time i 1.54 GB szczyt RSS. Domyślny zmierzony silnik Pyannote 5.03% / 9.28%, 105.7 × real- time oraz 393 MBCommunity-1 jest więc opcjonalnym rurociągiem upstream- paryty z granicami liczenia głośników i zwróconych centroidów, a nie uniwersalną dokładność lub aktualizację prędkości. Wyniki z dwóch metod punktacji nie są bezpośrednio porównywalne.

Pyannote Pipeline

Domyślny rurociąg przebiega w dwóch etapach:

Etap 1: Segmentacja + Łańcuch głośnikowy

Pyannote segmentation-3.0 przetwarza okna przesuwne 10- drugie z 50% pokrywające się. Dekoder do zbioru mocy konwertuje wyjście klasy 7- na prawdopodobieństwo głośników przetwornikowych (do głośników lokalnych 3 na okno). Okna przyległe dzielą się na 5-second pokrywającą się - tożsamość głośnika jest propagowana w oknach za pomocą obliczeń Korelacja Pearsona pomiędzy ścieżkami prawdopodobieństwa w strefie pokrywania się, z chciwym wyłącznym dopasowaniem dla spójnych globalnych identyfikatorów głośników.

Etap 2: Post- hoc Osadzanie

Po diaryzacji, WeSpeaker ResNet34-LM Wyciągi 256- wymiarowe osadzanie centroidów na głośnik. Te osadzenia umożliwiają uzyskanie głośnika docelowego (--target-speaker), ale nie prowadzić samego zadania głośnika.

Migracja z pyannote.audio

Jeśli pochodzisz z Python pyannote.audio biblioteka - wymiana Pipeline podklasa, która ustawia pipeline.segmentation = ...lub oddalenie się od hostingu serwera pyannote/speaker-diarization-3.1 - Soniqo owija ten sam model Pyannote-Segmentation-3.0 i uruchamia go w całości na urządzeniu Apple Silicon. Nie Python runtime, nie CUDA, nie ma symbolu Hugging Face w czasie składania wniosków.

pyananyte.audio (Python)Soniqo (Swift)
Pipeline.from_pretrained("pyannote/speaker-diarization-3.1") DiarizationPipeline.fromPretrained()
pipeline(audio_file) pipeline.diarize(audio: samples, sampleRate: 16000)
pipeline.segmentation = ... (niestandardowa podklasa) Naprawiono: Pyannote-Segmentation-3.0 (MLX lub CoreML, auto- wybrany)
diarization.itertracks(yield_label=True) for seg in result.segments { ... }
diarization.write_rttm(file) CLI: --rttm
pyannote.metrics.diarization.DiarizationErrorRate CLI: --score-against reference.rttm

Wagi Pyannote-Segmentation-3.0 są przeliczane z punktu kontrolnego HuggingFace, więc logi segmentacji są liczbowo równoważne w zakresie tolerancji float- precyzja. Łańcuchy po segmentacji (korelacja Pearsona pomiędzy nakładającymi się na siebie oknami + chciwe dopasowanie wyłączne) i post- hoc etapy osadzania WeSpeaker zostają ponownie wdrożone w Swift ale produkują porównywalne wyjście RTTM do gazociągu odniesienia Python.

Jeszcze nie obsługiwane

Nie ma żadnego strumieniowania OnlineSpeakerDiarization odpowiednik dla silnika Pyannote. Do real- time diaryzacji --engine sortformer zamiast tego, który uruchamia model Sortformer z FIFO i bufory stanu głośnomówiącego.

Zastosowanie CLI

# Basic diarization (pyannote, default)
.build/release/speech diarize meeting.wav

# Community-1 (CoreML + native PLDA/VBx)
.build/release/speech diarize meeting.wav --engine community1
.build/release/speech diarize meeting.wav --engine community1 --num-speakers 2

# End-to-end Sortformer (CoreML)
.build/release/speech diarize meeting.wav --engine sortformer

# Nemotron 3 (CoreML default; MLX optional)
.build/release/speech diarize meeting.wav --engine nemotron3
.build/release/speech diarize meeting.wav --engine nemotron3 --nemotron3-backend mlx

# RTTM output format (for evaluation)
.build/release/speech diarize meeting.wav --rttm

# JSON output
.build/release/speech diarize meeting.wav --json

Rozmówca docelowy Extraction

Dostarcz dźwięk zapisujący znanego głośnika, aby wydobyć tylko ich segmenty z nagrania. Gazociąg oblicza osadzanie głośnika dźwięku i znajduje klaster z najwyższym cosinusem podobieństwa.

# Extract segments for a specific speaker
.build/release/speech diarize meeting.wav --target-speaker enrollment.wav

Generowanie DER

Ocena jakości diaryzacji poprzez ocenę na podstawie referencyjnego pliku RTTM. Gazociąg oblicza wskaźnik błędu diaryzacji (DER), który mierzy proporcję czasu, który jest nieprawidłowo przypisany.

# Score against reference RTTM
.build/release/speech diarize meeting.wav --score-against reference.rttm

NT1 przemys # owy

W --rttm flaga produkuje bogaty czas transkrypcji oznaczony wyjście, standardowy format używany do oceny diaryzacji. Każda linia jest zgodna z formatem:

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

Opcje

OpcjaOpis
--target-speakerAudio enrollment do ekstrakcji głośnika docelowego (tylko piannote)
--embedding-engineSilnik głośnikowy: mlx lub coreml (tylko piannote)
--vad-filterFiltr wstępny z Silero VAD (tylko piannote)
--community1-compute-unitsane (domyślnie), cpu, gpulub all
--num-speakersZnana dokładna liczba głośników (tylko Community-1)
--min-speakersMinimalna liczba głośników (Community-1, domyślnie 1)
--max-speakersMaksymalna liczba głośników (Community-1)
--rttmWyjście w formacie RTTM
--jsonFormat wyjściowy JSON
--score-againstReferencyjny plik RTTM do oceny DER
Ważne

Diaryzacja działa najlepiej z nagraniami, które mają wyraźne obroty głośnika. Wysoko nakładająca się na siebie mowa może zmniejszyć dokładność. Liczba głośników jest określana automatycznie.

Pobieranie modeli

Modele są automatycznie pobierane przy pierwszym użyciu:

SkładnikWzórRozmiarHuggingFace
SegmentacjaPyannote-Segmentation-3.0- 5,7 MBaufklarer / Pyannote- Segmentation- MLX
PrzewodniczącyWeSpeaker-ResNet34-LM (MLX)25 MBaufklarer / WeSpeaker-ResNet34-LM-MLX
PrzewodniczącyWeSpeaker-ResNet34-LM (CoreML)25 MBaufklarer / WeSpeaker-ResNet34-LM-CoreML
Gazociąg Community-1PyanNet + maskowany WeSpeaker + PLDA / VBx~ 32 MBaufklarer / Pyannote-Community-1-CoreML
SortformerDiaryzacja Sortformer (CoreML)240 MBaufklarer / Sortformer- Diarization- CoreML
Nemotron 3Diaryzacja INT8 (CoreML lub MLX)~ 100 MB każdyCoreML · MLX

Swift API

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

// Target speaker extraction
let targetEmb = pipeline.embeddingModel.embed(audio: enrollmentAudio, sampleRate: 16000)
let segments = pipeline.extractSpeaker(
    audio: meetingAudio, sampleRate: 16000,
    targetEmbedding: targetEmb
)

// Full Community-1 pipeline with bounded speaker counts
let community1 = try await Community1DiarizationPipeline.fromPretrained()
try community1.prewarm()
let attributed = try community1.diarize(
    audio: meetingAudio,
    sampleRate: 16000,
    speakerBounds: Community1SpeakerBounds(minimum: 2, maximum: 6)
)