תרגום מכונה · המקור באנגלית
הפרדה לפי דוברים
לזהות מי דיבר בעת הקלטה רב-קולרית של ארבעה מנועים זמינים: קל משקל Pyannote (התחילה CLI), במלואה Community-1 (CoreML + Native PLDA/VBx) המונחים (CoreML, Neural Engine) Nemotron 3 (CoreML INT8 או או MLX INT8).
מנועים
בחר את המנוע עם --engine pyannote (default), --engine community1, --engine sortformer, או --engine nemotron3.
Pyannote (default)
צינור שני שלבים: Pyannote תהליכים חופפים חלונות עם רמקולים מבוסס פעילות שרשרתing (Pearson מתאם באזורי חפיפה) כדי להקצות תוויות רמקולים גלובליות. Post-hoc WeSpeakerהטמעת החילוץ מאפשר דובר יעד באמצעות זיהוי באמצעות רישום אודיו.
Community-1 (CoreML + Native VBx)
המלא Pyannote Community-1 CoreML: 10- השני PyanNet פלח חלונות להתקדם כל שנייה WeSpeaker הטמיעו את הזנה של ה-AHC ו-AHC 256→128 PLDA משתנה, ואז יליד Swift VBx ומשימה מוגבלת לייצר אשכולות גלובליים.הוא מחזיר אחד 256- Centroid per Recognized רמקולים ותומכת באופן מדויק, מינימלי, או מקסימום דובר שורות.
(CoreML)
NVIDIA"מודל לדיאריזציה עצבית מקצה לקצה.באופן ישיר צופה פעילות הדוברת לכל מסגרת עבור עד 4 רמקולים ללא שלבים מטביעים או מקובצים נפרדים. Neural Engine באמצעות CoreML עם מטמון המדינה הזרמת (FIFO + רמקולים cache).
עבור אודיו חי, SortformerStreamingSession רץ .streaming מודל מסובייקט עולה בקנה אחד עם 16 kHz מונו PCM buffers של כל גודל. 560 ms Lookahead זמין, הוא מתקדם 480 מדרגות אודיו: 5-file M-series Neural Engine הטייס נמדד 12.4 המונחים: median latency per 500 תוויות מ's Push. Speakers Follow the Arrival-Order Cache במקום לפוצץ מחדש כל חלון, וכל דחיפה מחזירה תמונה של זרם שלם. finish() שטף את הזנב המבולבל. במבחן השוויון של המודל, פלחות סופיות תואמים את כל ה-buffered. .streaming פיזור בתוך מסגרת 80.
Nemotron 3 (CoreML או MLX)
NVIDIA Nemotron 3 צופה כי 10 ms פעילות הדוברת של עד שמונה רמקולים אנונימיים.היצוא INT8 הסופי מוריד באופן אוטומטי מהיצוא של ZXQXQ3XZ. CoreML או או MLXברירת המחדל CLI backend היא CoreML; בחר MLX עם --nemotron3-backend mlxשניהם תומכים בחבילה מקומית דרך --nemotron3-directory.
על פנים 132רישום diarization להגדיר (12.82 שעות, 0.25 צווארון, המשלוח Nemotron 3 MLX ו CoreML הופעות בRuntimesהבקיע 10.98% ו 11.20% ב-DER, בהתאמה, ללא תקלות. 48 מפגשים אנגליים, הם זכו 10.31% ו 10.24%ראה את השוואות שפה ומגבלות הערכה.
The The The --target-speaker ו --embedding-engine דגלים זמינים רק עם ברירת המחדל Pyannote מנוע Community-1 מחזירים את הצפרדעים דרך Swift APIהמונחים: miter and Nemotron 3 אל תפיקו רמקולים מטביעות.
עבור תוצאות נמדדות על פני מערכות הדיאריזציה ושמונה שפות, הבקיע עם שליט אחד, ראה את מדד הסימון רמקולer diarization .
מוציא לאור CALLHOME Baseline
הבא הוא NVIDIA's מפרסם בסיס רמקולים נאמניים עבור ZXQQ0QxZ diar_streaming_sortformer_4spk-v2זוהי הפניה חיצונית, לא מדידה מקומית של המרה speech-swift של CoreML, ולא של רמקול בשם.
| Dataset | מצב | DER |
|---|---|---|
| CALLHOME חלק 2 | 2 דוברים | 6.57% |
| CALLHOME חלק 2 | 3 דוברים | 10.05% |
| CALLHOME חלק 2 | 4 דוברים | 12.44% |
כל השורות משתמשות ב- 1.04 s-bu-buffer latency, חפיפה הכלולה, צווארון 0.25, ולאחר עיבוד מכוון על disjoint CALLHOME חלק 1. CALLHOEX הוא מורשה ואינו ארוז. diarization-bench דוחות דומים בנפרד על ידי דובר הפניה ספירה בקונסולה וב-JSON תחת JSON byReferenceSpeakerCount.
Community-1 Pipeline
Community-1 שני השלבים העצביים עם CoreML וכל עיבוד מארח Swiftאז זה לא העומס MLX או לדרוש Metal ספריית הצלר: ברירת מחדל שפורסמו נשמרים: מסיכות מתפתלות קשות, נקיות ורמקולים עם נפילה במסלול הקצר במעלה הזרם, 0.6 סף חיוג אלקטרוני, Fa=0.07, Fb=0.8, וברוב ה- 20 VBx.
על גבי חמש תמונות קבועות VoxConverse השחרור subset (1,057.49 שניות, 0.25-II צווארון, חפיפה הכלולים), Swift תפוקה מוטבעת עם ZXQXQ2XZ pyannote.metrics מדד 4.66% DER / 21.43% JERהמונחים: CoreML Reference Measure 4.65% / 21.42%זהו מבחן הסתברותי קטן, לא תביעה איכותית של נתונים.
עם speech-swift"התוצאה של המסגרת-grid באותה תת-קרקעית, Community-1 מדד 9.31% DER / 16.20% JER, 25.5® בזמן אמת, ו 1.54 GB שיא RSSמנוע Pyannote שנמדד 5.03% / 9.28%, 105.7× בזמן אמת, 393 MBCommunity-1 הוא אפוא צינור אופציונלי של שקיפות הזרם עם גבולות מספרים הדוברים והחזירו צנטרירוטינים, לא דיוק או שדרוג מהירות אוניברסלי.ציונים משני שיטות הניקוד אינם דומים ישירות.
Pyannote Pipeline
צינור ברירת המחדל פועל בשני שלבים:
שלב 1: סגמנטציה + יושב ראש
Pyannote segmentation-3.0 מעבד 10-II מכווץ חלונות עם 50%. Powerset decoder ממיר את הפלט 7-class להסתברות לרמקולים (עד 3 רמקולים מקומיים לחלון). חלונות Adjacent חולקים חפיפה 5 שניות - זהות הדוברת מופצה על פני חלונות על ידי מחשוב מחשוב מתורגמן מתאם בין מסלולי ההסתברות באזור החפיפה, עם התאמה בלעדית חמדנית עבור תעודות זהות רמקולים גלובליות עקביות.
שלב 2: Post-hoc Embedding
לאחר דיאריזציה, WeSpeaker ResNet34-LM תמצית של 256 חלקיקים ממדיים המטביעים לרמקול. אלה הטמיעו הטמעת רמקול היעד (--target-speaker
הצצה ל- piannote.audio
אם אתה מגיע Python pyannote.audio ספרייה - להחליף Pipeline תת-מחלקה שקובעת pipeline.segmentation = ...או בורח מ-A Server Hosting pyannote/speaker-diarization-3.1 Soniqo עוטפת את אותו דגם Pyannote-Segmentation-3.0 ומפעיל אותו לחלוטין על-ידי Apple Silicon. No Python בזמן ריצה, ללא CUDA, no Hugging Face token atference time.
| 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 = ... (תתיכון) |
קבוע: Pyannote-Segmentation-3.0 (MLX או CoreML, שנבחר אוטומטית) |
diarization.itertracks(yield_label=True) |
for seg in result.segments { ... } |
diarization.write_rttm(file) |
--rttm |
pyannote.metrics.diarization.DiarizationErrorRate |
CLI: --score-against reference.rttm |
The The The Pyannote-Segmentation-3.0 משקלים מומרים מן הזרם HuggingFace מחסומים, כל כך גליונות פלח הם שווה ערך רב בתוך סובלנות צף מראש.השלכה שלאחר הדגימה (Pearson על פני חלונות חופפים + התאמה בלעדית חמדנית) ופוסט-hoccation. WeSpeaker שלבים מטבוליים מחדש Swift אך לייצר תפוקה RTTM דומה ל-Sing Python צינורות.
אין הזרמת OnlineSpeakerDiarization שווה ערך עבור מנוע Pyannote. עבור שימוש בזמן אמת דיאריזציה --engine sortformer במקום זאת, אשר פועל מודל מפורמנדר עם FIFO ו-cache המדינה buffers.
CLI Usage
# 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
מיצוי פנים-ראש
לספק אודיו הרשמה של דובר ידוע כדי לחלץ רק את הקטעים שלהם מהקלטה.הצנרת קובעת את הדובר להטביע של אודיו ההרשמה ומוצאת את האישכול עם הדומה הקוסטין הגבוהה ביותר.
# Extract segments for a specific speaker
.build/release/speech diarize meeting.wav --target-speaker enrollment.wav
תגית: Scoring
הערכת איכות דיאריזציה על ידי ניקוד נגד קובץ RTTM הפניה.הצנרת קובעת את שיעור שגיאות הדירקיזציה (DER), אשר מודד את מידת הזמן שהוא מיוחס באופן שגוי.
# Score against reference RTTM
.build/release/speech diarize meeting.wav --score-against reference.rttm
RTTM Output
דגל --rttm מייצר את זמן ה- Rich Transcription Time Marked פלט, פורמט סטנדרטי המשמש להערכה של דירקיזציה.כל קו עוקב אחר התבנית:
SPEAKER filename 1 start_time duration <NA> <NA> speaker_id <NA> <NA>
אפשרויות אפשרויות
| אפשרות | תיאור תיאור |
|---|---|
--target-speaker | אודיו עבור מיצוי של דובר היעד (איור בלבד) |
--embedding-engine | שם המחבר: mlx או coreml (pyannote בלבד) |
--vad-filter | Pre-filter with Silero VAD (pyannote בלבד) |
--community1-compute-units | ane (default), cpu, gpu, או all |
--num-speakers | ספירת הדוברים המדויקת (Community-1 בלבד) |
--min-speakers | מינימום רמקולים ספירה (Community-1, ברירת מחדל 1) |
--max-speakers | ספירת הדוברים המקסימלית (Community-1) |
--rttm | Output בפורמט RTTM |
--json | פורמט JSON |
--score-against | קובץ RTTM עבור DER הערכה |
Diarization עובד הכי טוב עם הקלטות שיש להם רמקולים ברורים פונה. דיבור חפיפה גבוה עשוי להפחית דיוק. ספירת הדוברים נקבעת באופן אוטומטי.
דגם Downloads
המודלים הורידו באופן אוטומטי לשימוש ראשון:
| המונחים | מודל מודל | גודל | HuggingFace |
|---|---|---|---|
| המונחים | Pyannote-Segmentation-3.0 | 5.7 MB | aufklarer/Pyannote-Segmentation-MLX |
| יושב ראש | WeSpeaker-ResNet34-LM (MLX) | 25 MB | aufklarer/WeSpeaker-ResNet34-LM-MLX |
| יושב ראש | WeSpeaker-ResNet34-LM (CoreML) | 25 MB | aufklarer/WeSpeaker-ResNet34-LM-CoreML |
| Community-1 | PyanNet + מסיכה WeSpeaker + PLDA / VBx | 32 MB | aufklarer/Pyannote-Community-1-CoreML |
| המונחים | דיאריזציה (CoreML) | -240 MB | aufklarer / Sortformer-Diarization-CoreML |
| Nemotron 3 | Diarization INT8 CoreML או MLX) | 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)
)