Awtomatikong salin · Orihinal sa Ingles
Paghihiwalay ng mga tagapagsalita
Kilalanin kung sino ang nagsasalita kapag nasa isang multi-specker recording. Apat na makina ang makukuha: magaan na ilaw Pyannote (ang CLI default), full-pipeline Community-1 (CoreML + katutubong PLDA/VBx), dumadaloy Pinag - isipan (CoreML, Neural Engine), at Nemotron 3 (CoreML INT8 o MLX INT8).
Mga makina
Pumili ng makina gamit ang --engine pyannote (default), --engine community1, --engine sortformer, o --engine nemotron3.
Pyannote (default)
Dalawang-stage pipeline: Pyannote segments pagsanib ng mga bintana sa mga activity-based speaker chaining (Pearson correlation sa mga couple zones) upang mag-atas ng mga global speaker labels. Post-hoc WeSpeaker embending na ang mga target na pagkakakilanlan ng tagapagsalita sa pamamagitan ng register audio.
Community-1 (CoreML + katutubong VBx)
Ang lahat Pyannote Community-1 CoreML bungkos: 10- Pangalawang mga bintana ng PyanNet segmentation ang tumatakbo sa bawat segundo, nakabalatkayo WeSpeaker Ang mga dike ay nagpapakain ng centroid AHC at isang 256→128 Pagbabago ng PLDA, pagkatapos ay katutubo Swift Ang VBx at ang takdang - aralin ay lumilikha ng pangglobong mga kumpol, at ito'y nagbabalik ng isa 256--dimensional centroid kada natutop na speaker at sumusuporta sa eksakto, minimum, o maximum speaker-count hangganan.
Bukud - bukod (CoreML)
NVIDIA's end-to-end neural diarization model. Tuwirang hulaan ang per-frame speaker activity para sa hanggang 4 na tagapagsalita nang walang hiwalay na embedding o cluting stages. tumatakbo sa Neural Engine sa pamamagitan ng CoreML na may dumadaloy na state cachesitions (FIF + speaker cache).
Para sa live audio, SortformerStreamingSession ang tanong .streaming Ang uri ng modelo ay hindi kasuwato ng pag - iisip 16 KHz mono PCM mga standing na may anumang laki. 560 May makukuhang mga ms spectahead, ito'y sumusulong 480 ms audio steps; isang limang-file M-seryes Neural Engine panukat ng piloto 12.4 mga m na median latency sa bawat 500 Ang mga tatak ng pagsasalita ay sumusunod sa cometer-Order Speaker Cache sa halip na muling i-cluster ang bawat bintana, at ang bawat pagtulak ay nagbabalik ng isang buong-stream snap. finish() Sa model-goted equivalence test, ang mga huling bahagi ay nagtutugma ng buong-buffer .streaming Ang diarisasyon sa loob ng mga isang balangkas na 80 ms.
Nemotron 3 (CoreML o MLX)
Ang NVIDIA Nemotron 3 ay humuhula ng 10 ms speaker activity para sa hanggang walong hindi kilalang tagapagsalita. Ang mga panghuling INT8 imports na awtomatikong download mula sa mga transports mula sa mga kusang pag-download mula sa mula sa mga dyaryo mula sa CoreML o MLX. Ang default CLI backend ay CoreML; pumili ng MLX na may ZXQXZ --nemotron3-backend mlx. Pareho nilang sinusuportahan ang isang lokal na bungkos --nemotron3-directory.
Sa loob ng isang silid 132-Recording diarization set (pagkakaiba)12.82 oras, 0.25 kuwelyo), ang ipinadala Nemotron 3 MLX at CoreML Ang mga panahon ng pagtakbo ay nakakuha 10.98% at 11.20% Pag - uusap - usap ng may - ari, ayon sa pagkakasunod - sunod, nang walang kabiguan. 48 Mga pulong sa Ingles, sila'y nakakuha ng iskor 10.31% at 10.24%. Tingnan ang per-wikang paghahambing at limitasyon sa pagtatasa.
Ang --target-speaker at --embedding-engine Ang mga bandila ay makukuha lamang na may default Pyannote engine. Community-1 return cluster centroids sa pamamagitan ng Swift API; Despecated at Nemotron Ang 3 ay hindi gumagawa ng speaker emberdings.
Para sa mga nasukat na resulta sa ibayo ng mga sistema ng diarisasyon at walong wika, na naglalaman ng isang pinuno, tingnan ang speaker diarization benks.
Inilathalang CALHOME Baseline
Ang sumusunod ay NVIDIA's nalathalang hilaw na di-kilalang baseline ng Specker para sa diar_streaming_sortformer_4spk-v2. Ito ay isang panlabas na reperensiya, hindi isang lokal na pagsukat ng speech-swift's CoreML na konbersiyon at hindi isang pinangalanang-speater na pagpapalagay na resulta.
| Talaan ng mga Nilalaman | Kalagayan | MATAAS |
|---|---|---|
| TAMANG Bahagi 2 | 2 reperensiya | 6.57% |
| TAMANG Bahagi 2 | 3 tagapagsalita ng reperensiya | 10.05% |
| TAMANG Bahagi 2 | 4 na tagapagsalitang reperensiya | 12.44% |
Ang lahat ng hanay ay gumagamit ng 1.04 s input-buffer latency, complegment kabilang, isang 0.25 na welch, at post-processing na naka-set sa disjoint CALLHOME Part 1. CALHOMEL ay lisensiyado at hindi naka-block. diarization-bench ang katulad na mga resulta nang hiwalay sa pamamagitan ng pagbilang ng tagapagsalita sa console at sa JSON sa ilalim ng lupa byReferenceSpeakerCount.
Community-1 Pipeline
Community-1 ang dalawang yugto ng neural kasama ng CoreML at lahat ng mga host na nagpoproseso Swift, kaya hindi ito nagbubuhat MLX o kaya'y humiling ng Metal Tampok na aklatan. Ang inilathalang mga default ay napreserba: hard powerset decoding, linisin ang mga isahang-specker mask na may street-track na short-track fallback, 0.6 Halaga ng centroid-linkage, Fa=0.07, Fb=0.8, at sa karamihan ng 20 VBx ineberasyon.
Sa nakapirmeng limang-file VoxConverse release subset (1,057.49 segundo, 0.25-second welch, couple), Swift output recombined kasama ang ZXQXZ pyannote.metrics panukat 4.66% DER / 21.43% JER; ang inilathalang CoreML reference ay may sukat 4.65% / 21.42%. Ito ay isang maliit na parsiyal na tseke, hindi isang dataset-wild demand.
Dahil sa balangkas na speech-swift's-grid scorer sa parehong subset, ang Community-1 ay nasukat 9.31% DER / 16.20% JER, 25.5× real-time, at 1.54 GB peak RSSS. Ang default Pyannote na makina ay sumukat 5.03% / 9.28%, 105.7× real-time, at 393 MB Samakatuwid ang Community-1 ay isang opsyonal na tubong pasalungat-pareha na may speaker-count entities at ibinalik na centroids, hindi isang unibersal na katumpakan o mabilis na pag-upgrade.Ang mga masa mula sa dalawang mga pamamaraang pampribado ay hindi direktang maihahambing.
Pyannote Pipeline
Ang default pipeline ay may dalawang yugto:
Stagage 1: Segmentation + Pagtitili
Ang Pyannote segmentation-3.0 ay nagpoproseso ng 10-second slasting windows na may 50% coup. Decoder na de - kuryente Komberte ang 7-class output sa per-specker probabilities (hanggang 3 Ang mga lokal na tagapagsalita sa bawat bintana). adjacent na mga bintana ay kabahagi ng isang 5 - second complegion — ang pagkakakilanlan ng tagapagsalita ay pinalaganap sa mga bintana sa pamamagitan ng pagkodigo ng mga bintana Pag - uugnay ng Pearson sa pagitan ng mga bakas ng probabilidad sa sonang nagsasanib, na may sakim na bukod - tanging katumbas para sa di - nagbabagong pangglobong tagapagsalita na mga ID.
Stage 2: Post-hoc Embeding
Pagkatapos ng diarisasyon, WeSpeaker ResNet34-LM Kumuha ng 256-dimensional centroid embeding kada speaker. Ang mga embeding na ito ay nagpapangyari sa tinatarget na speaker retract (pagkuha ng target speaker)--target-speaker) ngunit huwag mong itulak ang atas sa tagapagpahayag mismo.
Nandarayuhan mula sa pyannote.audio
Kung ikaw ay galing sa Python pyannote.audio aklatan — Palitan ang isang Pipeline Mga subclass na naglalagay ng pipeline.segmentation = ..., o papalayo sa isang server na punong - abala pyannote/speaker-diarization-3.1 Ang Soniqo ay nagbabalot ng parehong modelong Pyannote-Segmentation-3.0 at tuluyan itong tumatakbo sa-device sa Apple Silicon. no Python runtime, walang CUDA, walang Hugging Face standard sa oras ng regulator.
| pyannote.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 = ... (customic subclass) |
Fixed: Pyannote-Segmentation-3.0 (MLX o CoreML, auto-selected) |
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 |
Ang Pyannote-Segmentation-3.0 Ang mga pabigat ay ginagawa mula sa itaas ng ilog HuggingFace Checkpoint, kaya ang mga segmentation logits ay katumbas ng numero sa loob ng bloom-precision na pagpaparaya. Ang post-segmentation chaining (Pearson correlation sa ibayo ng mga bintanang pinagsanib + sakim na eksklusibong pagtutugma) at post-hoc WeSpeaker Ang mga yugto ng pag - eembbed ay muling ginagawa Swift ngunit gumagawa ng kahalintulad na RTM output sa pagtukoy Python Mga tubo.
Walang dumadaloy na OnlineSpeakerDiarization katumbas para sa Pyannote engine. Para sa real-time diarization gumamit ng --engine sortformer sa halip, na nagpapatakbo ng sedeformed model kasama ang FIFO at speaker-cache state champers.
Paggamit ng 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
Pag - aalis ng Target Speaker
Itala ang audio ng isang kilaláng tagapagsalita para kunin lamang ang kanilang mga bahagi mula sa rekording.
# Extract segments for a specific speaker
.build/release/speech diarize meeting.wav --target-speaker enrollment.wav
Pag - eespiya sa Pamamagitan ng Pagtanda
Evaluate diarization quality sa pamamagitan ng pag-eensayo laban sa isang reperensiyang RTTM file. Ang pipeline computies the Diarization Error Fixe (Dear), na sumusukat sa proporsiyon ng oras na maling ipinalalagay.
# Score against reference RTTM
.build/release/speech diarize meeting.wav --score-against reference.rttm
Ihinto ang RTTM
Ang --rttm flag ay gumagawa ng Rich Transcription Time Marked output, isang pamantayang format na ginagamit para sa pagtatasa ng diarisasyon. Ang bawat linya ay sumusunod sa format:
SPEAKER filename 1 start_time duration <NA> <NA> speaker_id <NA> <NA>
Mga Mapagpipilian
| Mapagpipilian | Paglalarawan |
|---|---|
--target-speaker | Inrolment audio para sa puntiryang pagkuha ng tagapagsalita (pyannote lamang) |
--embedding-engine | makinang nagsasalita ng embudyting: mlx o coreml (pyannote lamang) |
--vad-filter | Pre-fille na may Silero VAD (pyannote lamang) |
--community1-compute-units | ane (default), cpu, gpu, o all |
--num-speakers | Kilalang eksaktong bilang ng tagapagsalita (Community-1 lamang) |
--min-speakers | Minimum speaker count (Community-1, default 1) |
--max-speakers | Bilang ng nagsasalita ng Maximum (Community-1) |
--rttm | Isulat sa RTM format |
--json | Ang anyo ng output ng JSON |
--score-against | Reference RTM file para sa mas patiunang pagtatasa |
Ang diarisasyon ay pinakamahusay na gumagana sa pamamagitan ng mga rekording na may malinaw na mga ikot ng tagapagsalita, na maaaring makabawas sa katumpakan ng mga salita, at kusang tinitiyak ang bilang ng nagsasalita.
Modelong mga Pagpapababa ng Pabigat
Ang mga modelo ay awtomatikong nai - download sa unang gamit:
| Nakikipagtulungan | Huwaran | Laki | HuggingFace |
|---|---|---|---|
| Paglalagay ng Segment | Pyannote-Segmentation-3.0 | °5.7 MB | Aufklarer/Pyannote-Segmentation-MLX |
| Pagtaas ng Salita | WeSpeaker-ResNet34-LM (MLX) | °25 MB | Aufklarer/WeSpeaker-ResNet34-LM-MLX |
| Pagtaas ng Salita | WeSpeaker-ResNet34-LM (CoreML) | °25 MB | Aufklarer/WeSpeaker-ResNet34-LM-CoreML |
| Community-1 pipeline | PyanNet + maskarang WeSpeaker | °32 MB | Aufklarer/Pyannote-Community-1-CoreML |
| Pinag - isipan | Diarisasyon ng Urian (CoreML) | °240 MB | Aufklarer/Sortformor-Diarization-CoreML |
| Nemotron 3 | Diarisasyon INT8 (CoreML o MLX) | Bawat isa ay °100 MB | 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)
)