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.
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 danych | Stan | DER |
|---|---|---|
| CALLHOME część 2 | 2 głośniki referencyjne | 6.57% |
| CALLHOME część 2 | 3 głośniki referencyjne | 10.05% |
| CALLHOME część 2 | 4 głośniki referencyjne | 12.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.
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
| Opcja | Opis |
|---|---|
--target-speaker | Audio enrollment do ekstrakcji głośnika docelowego (tylko piannote) |
--embedding-engine | Silnik głośnikowy: mlx lub coreml (tylko piannote) |
--vad-filter | Filtr wstępny z Silero VAD (tylko piannote) |
--community1-compute-units | ane (domyślnie), cpu, gpulub all |
--num-speakers | Znana dokładna liczba głośników (tylko Community-1) |
--min-speakers | Minimalna liczba głośników (Community-1, domyślnie 1) |
--max-speakers | Maksymalna liczba głośników (Community-1) |
--rttm | Wyjście w formacie RTTM |
--json | Format wyjściowy JSON |
--score-against | Referencyjny plik RTTM do oceny DER |
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ładnik | Wzór | Rozmiar | HuggingFace |
|---|---|---|---|
| Segmentacja | Pyannote-Segmentation-3.0 | - 5,7 MB | aufklarer / Pyannote- Segmentation- MLX |
| Przewodniczący | WeSpeaker-ResNet34-LM (MLX) | 25 MB | aufklarer / WeSpeaker-ResNet34-LM-MLX |
| Przewodniczący | WeSpeaker-ResNet34-LM (CoreML) | 25 MB | aufklarer / WeSpeaker-ResNet34-LM-CoreML |
| Gazociąg Community-1 | PyanNet + maskowany WeSpeaker + PLDA / VBx | ~ 32 MB | aufklarer / Pyannote-Community-1-CoreML |
| Sortformer | Diaryzacja Sortformer (CoreML) | 240 MB | aufklarer / Sortformer- Diarization- CoreML |
| Nemotron 3 | Diaryzacja INT8 (CoreML lub MLX) | ~ 100 MB każdy | CoreML · 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)
)