Konekäännös · Englanninkielinen alkuperäinen
Puhujien erottelu
Tunnista puhujat, kun monikaiutin äänitys. Neljä moottoria on saatavilla: kevyt Pyannote (CLI-oletus), täysi putkijohto Community-1 (CoreML + natiivi PLDA/VBx), suoratoisto Lajittelija (CoreML, Neural Engine) ja Nemotron 3 (CoreML INT8 tai MLX INT8).
Moottorit
Valitse moottori, jossa on --engine pyannote (oletusarvo), --engine community1, --engine sortformer tai --engine nemotron3.
Pyannote (oletusarvo)
Kaksivaiheinen putkisto: Pyannote segmentointiprosessit, jotka ovat päällekkäisiä toimintoperusteisen kaiuttimen ketjutuksen kanssa (Pearson-koostumus päällekkäisillä vyöhykkeillä) kokonaiskaiuttimen tarrojen määrittämiseksi. Post-hoc WeSpeaker upotus mahdollistaa kohdekaiuttimen tunnistamisen ilmoittautumisen äänen avulla.
Community-1 (CoreML + natiivi VBx)
Täysi Pyannote Community-1 CoreML-yhdistelmä : 10 sekunnin PyanNet-segmentointiikkunat etenevät joka sekunti, naamioitu WeSpeaker -panevat syötteen centroid AHC ja 256→128 PLDA-muunnos, jonka jälkeen natiivi Swift VBx ja rajoitettu käyttö tuottavat maailmanlaajuisia klustereita. Se palauttaa yhden 256-ulotteisen centroidin havaittua kaiutinta kohti ja tukee tarkkoja, minimi- tai maksimiäänimääräisiä rajoitteita.
Lajittelija (CoreML)
NVIDIA:n hermojen diarisaatiomalli. Suorana ennustaa enintään 4 kaiuttimen liikettä ilman erillistä upotus- tai ryhmittelyvaihetta. Toimii Neural Engine CoreML:n kautta ja suoratoistotilassa olevat puskurit (FIFO + kaiutinvälimuisti).
Liveääni. SortformerStreamingSession käyttää .streaming Sortformer-malli kehittyy asteittain minkä tahansa kokoisilla 16 kHz mono PCM-puskureilla. Kun 560 ms lookear on saatavilla, se etenee 480 ms-ääniportaissa; viiden tiedoston M-sarjan Neural Engine-pilotti, joka mittaa 12.4:n ms:n mediaanilatenssia 500 Ms:n työntöä kohti. Kaiuttimen tarrat seuraavat saapumis-Order-kaiutinta Cachea jokaisen ikkunan uudelleenklusterien sijaan, ja jokainen push palauttaa koko virtakuvan. finish() puskuroitu häntä huuhtelee. Mallinmukaisessa vastaavuustestissä lopulliset segmentit sopivat kokonaispuskuriin. .streaming diarisaatio yhden 80 ms-rungon sisällä.
Nemotron 3 (CoreML tai MLX
NVIDIA Nemotron 3 ennustaa 10 ms:n kaiutintoiminnan jopa kahdeksalle nimettömälle puhujalle.Lopullinen INT8 vienti latautuu automaattisesti CoreML tai MLX. Oletus CLI-taustatuki on CoreML; valitse MLX --nemotron3-backend mlx. Molemmat tukevat paikallista nippua --nemotron3-directory.
Sisäisessä 132-tallennus diarisation set (12.82 tuntia, 0.25 s kaulus), lähetetty Nemotron 3 MLX sekä CoreML juoksuajat pisteytetyt 10.98% sekä 11.20% Yhdistetty DER, vastaavasti ilman epäonnistumisia. 48 Englantilaisia kokouksia, he tekivät maalin 10.31% sekä 10.24%. Katso kielikohtaisen vertailun ja arvioinnin rajat.
--target-speaker ja --embedding-engine liput ovat saatavilla ainoastaan oletuksena Pyannote moottori. Community-1 palauttaa ryppäiden keskipakot sen Swift API; Järjestäjä ja Nemotron 3 ei tuota kaiuttimia.
Mitatut tulokset diarisaatiojärjestelmissä ja kahdeksassa kielessä, jotka on tehty yhdellä viivoittimella, ks. kaiuttimen diarisaation viitearvot .
Julkaistu CALLHOME-perustaso
Seuraava on NVIDIA:n julkaistu nimetön lähtöarvo diar_streaming_sortformer_4spk-v2. Se on ulkoinen viite, ei paikallinen mittaus speech-swift:n CoreML konversiotulos, ei nimetty kaiutin.
| Dataaineisto | Ehto | DER |
|---|---|---|
| KESKUSTELU OSA 2 | 2 referenssipuhujaa | 6.57% |
| KESKUSTELU OSA 2 | 3 referenssikaiutinta | 10.05% |
| KESKUSTELU OSA 2 | 4 viitekaiutinta | 12.44% |
Kaikissa rivissä käytetään 1.04 s:n syöttöpuskurin latenssia, mukaan lukien päällekkäin oleva, 0,25 s:n kaulus ja jälkikäsittely, joka on viritetty dissijoint CALLHOME Part 1. CallHOME on lisensoitu eikä sitä ole niputettu. Paikallinen diarization-bench raportoi vertailukelpoiset tulokset erikseen viitekaiuttimella konsolissa ja JSONissa alle byReferenceSpeakerCount.
Community-1 putkijohto
Community-1 toimii molemmat hermovaiheet, joissa on CoreML ja kaikki isäntäkäsittely Swift, joten se ei kuormita MLX tai vaadi Metal shader-kirjastoa. Julkaistut oletusarvot säilyvät: kovatehoiset dekoodauslaitteet, puhtaat yhden kaiuttimen naamarit, joissa on ylävirtaan suuntautuva lyhytraidekäännös, 0,6 centroid-linkkauskynnys, Fa=0.07, Fb=0.8 ja enintään 20 VBx iteraatiot.
Kiinteässä viiden tiedoston VoxConverse julkaisun subset (1,057.49 sekuntia, 0.25-sekunnin kaulus, päällekkäisyyksiä mukana), Swift lähtö uudelleen pyannote.metrics mitattu 4.66% DER / 21.43% JER; julkaistu CoreML-vertailu mitattuna 4.65% / 21.42%. Tämä on pieni pariteettitarkistus, ei aineisto-koko laatuvaatimus.
Jos speech-swift:n frame-swrid-scorer samasta alaluokasta, Community-1 mitataan 9,31% DER / 16,20% JER, 25.5× reaaliaikainen ja 1,54 GB huippu RSS . Oletusarvo Pyannote moottori mitattuna 5,03% / 9,28%, 105,7× reaaliajassa ja 393 MB . Community-1 on siis valinnainen alkuvaiheen pariteettiputki, jossa on puhujien laskentaraja ja palautettu centroidit, ei yleinen tarkkuus tai nopeuspäivitys.
Pyannote Putkisto
Oletusputkisto toimii kahdessa vaiheessa:
Vaihe 1: Segmentaatio + Puheketjutus
Pyannote segmentation-3.0 prosessit 10 sekunnin liukuikkunat, joissa on 50% päällekkäin. A powerset-dekooderi muuntaa 7-luokan ulostulon todennäköisyyksiksi (jopa 3 paikalliskaiutinta ikkunaa kohti).Lisäikkunoissa on 5 sekunnin päällekkäinen puhuja-identiteetti, joka lisätään ikkunoiden välillä tietokoneella Pearson-korrelaatio todennäköisyysraitojen välillä päällekkäisyydessä vyöhykkeellä, ja ahnea yksinomaista vastaamista yhtenäisten maailmanlaajuisten puhujien tunnisteiden osalta.
Vaihe 2: Post-hoc-exbeding
Diarisoinnin jälkeen WeSpeaker ResNet34-LM ottaa esiin 256-ulotteisen centroidin upottamisen kaiutinta kohti. Nämä kaiuttimen upotteet mahdollistavat kohdekaiuttimen uuttoa (--target-speaker), mutta eivät aja kaiutinta itse.
Muuttaa Pyannote.audio
Jos olet tulossa Python pyannote.audio Kirjasto ... Pipeline alaluokka, joka asettaa pipeline.segmentation = ..., tai siirtyä pois palvelimen hosting pyannote/speaker-diarization-3.1 Soniqo kietoutuu samaan Pyannote-Segmentation-3.0-malliin ja käyttää sitä täysin on-device-laitteella Apple Silicon:llä. Ei Python runtime, ei CUDA:ta, ei Hugging Face tokennusta inference-ajalla.
| syannote.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 = ... (custom-alaluokka) |
Kiinteä: Pyannote-Segmentation-3.0 (MLX tai CoreML, auto-valikoitu) |
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 |
Pyannote-Segmentation-3.0 painot muunnetaan yläpuolelta HuggingFace -tarkastuspisteistä, joten segmentointilokit ovat numeerisesti samanarvoisia kelluvan tarkkuuden toleranssin sisällä.Segmentaation jälkeinen ketjutus (earson-koordifikaatio päällekkäisten ikkunoiden välillä + ahneus-yksinomaan matching) ja post-hoc WeSpeaker -testivaiheet toteutetaan uudelleen Swift -menetelmällä, mutta ne tuottavat vertailukelpoisen RTTM-tuotoksen kuin vertailu Python -putkisto.
Ei ole streaming OnlineSpeakerDiarization ekvivalenttia Pyannote -moottorille. Reaaliaikaista diarisointia varten käytetään --engine sortformer, joka sen sijaan toimii Järjestäjä-mallilla, jossa on FIFO- ja kaiutinvälimuistipuskurit.
CLI-käyttö
# 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
Kohdekaiuttimen poisto
Tarjoa ilmoittautuminen ääni tunnetun kaiuttimen poimia vain niiden segmentit tallennus. Putki laskee kaiutin upottaa sisääntuloäänen ja löytää klusterin korkein kosine samankaltaisuus.
# Extract segments for a specific speaker
.build/release/speech diarize meeting.wav --target-speaker enrollment.wav
DER-pisteytys
Arvioidaan diarisaation laatua pisteyttämällä RTTM-tiedostoa vastaan. Putkessa lasketaan diarisaatiovirheen nopeus (DER), joka mittaa väärin annetun ajan osuutta.
# Score against reference RTTM
.build/release/speech diarize meeting.wav --score-against reference.rttm
RTTM-tuloste
--rttm -lippu tuottaa Rich Transkriptioaika merkittyä ulostuloa, vakiomuotoa, jota käytetään diarisaation arvioinnissa.
SPEAKER filename 1 start_time duration <NA> <NA> speaker_id <NA> <NA>
Valinnat
| Vaihtoehto | Tavaran kuvaus |
|---|---|
--target-speaker | Ilmoittautumisääni kohdekaiuttimen poistoa varten (vain pyannote) |
--embedding-engine | Kaiuttimen upotusmoottori: mlx tai coreml (ainoastaan syannote) |
--vad-filter | Esisuodatin, jossa Silero VAD (vain pyannote) |
--community1-compute-units | ane (oletusarvo), cpu, gpu tai all |
--num-speakers | Tunnettu tarkka puhujamäärä (Community-1 vain) |
--min-speakers | Minimikaiutinmäärä (Community-1, oletus 1) |
--max-speakers | Kaiutinten enimmäismäärä (Community-1) |
--rttm | Tuotos RTTM-muodossa |
--json | JSON- tulostusmuoto |
--score-against | Viite RTTM-tiedosto DER-arviointia varten |
Diarisointi toimii parhaiten äänityksillä, joissa on selvät kaiuttimen käännökset. Erittäin päällekkäiset puheet voivat vähentää tarkkuutta.
Mallilataukset
Mallit ladataan automaattisesti ensimmäisestä käytöstä:
| Osa | Malli | Koko | HuggingFace |
|---|---|---|---|
| Segmentointi | Pyannote-Segmentation-3.0 | ~5,7 Mt | aufklarer/Pyannote-segmentaatio-MLX |
| Puheenjohtajuuden lisääminen | WeSpeaker-ResNet34-LM (MLX) | ~25 Mt | aufklarer/WeSpeaker-ResNet34-LM-MLX |
| Puheenjohtajuuden lisääminen | WeSpeaker-ResNet34-LM (CoreML) | ~25 Mt | aufklarer/WeSpeaker-ResNet34-LM-CoreML |
| Community-1 putkijohto | PyanNet + naamioitu WeSpeaker + PLDA/VBx | ~32 Mt | aufklarer/Pyannote-Community-1-CoreML |
| Lajittelija | Korjaaja-diarisaatio (CoreML) | ~240 Mt | aufklarer/Sortformer-Diarization-CoreML |
| Nemotron 3 | Diarisaatio INT8 (CoreML tai MLX | ~100 Mt kutakin | 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)
)