Skip to content

Commit d530ab1

Browse files
committed
add doc 2nd round
1 parent 5553244 commit d530ab1

1 file changed

Lines changed: 2 additions & 58 deletions

File tree

Documentation/SpeakerManager.md

Lines changed: 2 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ Tracks and manages speaker identities across audio chunks for streaming diarizat
44

55
## Overview
66

7-
`SpeakerManager` maintains an in-memory database of speakers, tracks their voice embeddings, and assigns consistent IDs across audio chunks. It's the core component for speaker identity management in **streaming/online diarization** (`DiarizerManager`).
7+
`SpeakerManager` maintains an in-memory database of speakers, tracks their voice embeddings, and assigns consistent IDs across audio chunks. It's used by `DiarizerManager` for streaming/real-time speaker diarization.
88

9-
**Important:** `SpeakerManager` is **NOT** used in offline batch diarization (`OfflineDiarizerManager`). The offline pipeline uses VBx clustering with PLDA scoring for speaker assignment instead of the online speaker tracking approach. See the [Offline vs Online](#offline-vs-online-diarization) section below for details.
9+
> **Note:** `SpeakerManager` is only compatible with `DiarizerManager` (streaming pipeline). It is not currently supported with `OfflineDiarizerManager`, which uses VBx clustering for speaker assignment.
1010
1111
## Configuration
1212

@@ -330,62 +330,6 @@ if let avgEmbedding = SpeakerUtilities.averageEmbeddings(embeddingArray) {
330330
}
331331
```
332332

333-
## Offline vs Online Diarization
334-
335-
### Online/Streaming Diarization (DiarizerManager)
336-
337-
**Uses `SpeakerManager`** for incremental speaker tracking:
338-
339-
```swift
340-
let diarizer = DiarizerManager() // Uses SpeakerManager internally
341-
diarizer.initialize(models: models)
342-
343-
// Process chunks - SpeakerManager maintains consistency
344-
for chunk in audioChunks {
345-
let result = try diarizer.performCompleteDiarization(chunk)
346-
// Speaker IDs remain consistent across chunks
347-
}
348-
```
349-
350-
**Approach:**
351-
- Incremental processing of audio chunks
352-
- Cosine distance matching against existing speakers
353-
- Exponential moving average for embedding updates
354-
- Speaker IDs persist across entire stream
355-
- Suitable for real-time applications
356-
357-
### Offline/Batch Diarization (OfflineDiarizerManager)
358-
359-
**Does NOT use `SpeakerManager`** - uses VBx clustering instead:
360-
361-
```swift
362-
let offlineDiarizer = OfflineDiarizerManager()
363-
try await offlineDiarizer.prepareModels()
364-
365-
// Process complete file - VBx clustering assigns speakers
366-
let result = try await offlineDiarizer.process(audioFile)
367-
// Speaker assignments from statistical clustering
368-
```
369-
370-
**Approach:**
371-
- Processes entire audio file at once
372-
- Agglomerative Hierarchical Clustering (AHC) warm-start
373-
- PLDA (Probabilistic Linear Discriminant Analysis) scoring
374-
- Variational Bayes (VBx) clustering refinement
375-
- Timeline reconstruction after clustering
376-
- Optimized for accuracy over latency
377-
378-
### When to Use Which
379-
380-
| Use Case | Manager | Reason |
381-
|----------|---------|--------|
382-
| Live microphone capture | `DiarizerManager` | Real-time processing |
383-
| Streaming audio | `DiarizerManager` | Incremental results |
384-
| Meeting recordings | `OfflineDiarizerManager` | Higher accuracy |
385-
| Podcast analysis | `OfflineDiarizerManager` | Batch processing |
386-
| Real-time transcription | `DiarizerManager` | Low latency needed |
387-
| Benchmark evaluation | `OfflineDiarizerManager` | DER parity with research |
388-
389333
## Threading and Concurrency
390334

391335
`SpeakerManager` is thread-safe:

0 commit comments

Comments
 (0)