Skip to content

Commit 1d8989f

Browse files
committed
Improved Concurrency Safety & fixed typos in documentation
1 parent ac05a63 commit 1d8989f

2 files changed

Lines changed: 186 additions & 128 deletions

File tree

Documentation/SpeakerManager.md

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ Sometimes, there are already speakers in the database that may have the same ID.
7878
```swift
7979
let alice = Speaker(id: "alice", name: "Alice", currentEmbedding: aliceEmbedding)
8080
let bob = Speaker(id: "bob", name: "Bob", currentEmbedding: bobEmbedding)
81-
speakerManager.initializeKnownSpeakers([alice, bob], mode: .overwrite, preservePermanent: false) // replace any speakers with ID "alice" or "bob" with the new speakers, even if the old ones were marked as permanent.
81+
speakerManager.initializeKnownSpeakers([alice, bob], mode: .overwrite, preserveIfPermanent: false) // replace any speakers with ID "alice" or "bob" with the new speakers, even if the old ones were marked as permanent.
8282
```
8383

8484
> The `mode` argument dictates how to handle redundant speakers. It is of type `SpeakerInitializationMode`, and can take on one of four values:
@@ -87,7 +87,7 @@ speakerManager.initializeKnownSpeakers([alice, bob], mode: .overwrite, preserveP
8787
> - `.overwrite`: overwrite existing speakers with the same IDs as the new ones
8888
> - `.skip`: skip adding speakers whose IDs match existing ones
8989
>
90-
> The `preservePermanent` argument determines whether existing speakers marked as permanent should be preserved (i.e., not overwritten or merged). It is `true` by default.
90+
> The `preserveIfPermanent` argument determines whether existing speakers marked as permanent should be preserved (i.e., not overwritten or merged). It is `true` by default.
9191
9292
**Use case:** When you have pre-recorded voice samples of known speakers and want to recognize them by name instead of numeric IDs.
9393

@@ -191,6 +191,13 @@ Make the speaker not permanent.
191191
speakerManager.revokePermanence(from: "alice") // mark "alice" as not permanent
192192
```
193193

194+
#### resetPermanentFlags
195+
Mark all speakers as not permanent.
196+
197+
```swift
198+
speakerManager.resetPermanentFlags()
199+
```
200+
194201
### Speaker Retrieval
195202

196203
#### findSpeaker
@@ -263,6 +270,15 @@ let allSpeakers = speakerManager.getSpeakerList()
263270
// Returns: [Speaker] - Array of speakers
264271
```
265272

273+
#### hasSpeaker
274+
Check if the speaker database has a speaker with a given ID.
275+
276+
```swift
277+
if speakerManager.hasSpeaker("alice") {
278+
print("Alice was found in the database")
279+
}
280+
```
281+
266282
#### speakerCount
267283
Get the total number of tracked speakers.
268284

@@ -285,7 +301,7 @@ Clear all speakers from the database.
285301

286302
```swift
287303
speakerManager.reset()
288-
speakerManager.reset(keepPermanent: true) // remove all non-permanent speakers from the database
304+
speakerManager.reset(keepIfPermanent: true) // remove all non-permanent speakers from the database
289305
```
290306

291307
Useful for:
@@ -696,23 +712,25 @@ class RealtimeDiarizer {
696712
| Method | Returns | Description |
697713
|--------|---------|-------------|
698714
| `assignSpeaker(_:speechDuration:confidence:)` | `Speaker?` | Assign/create speaker from embedding |
699-
| `initializeKnownSpeakers(_:mode:preservePermanent:)` | `Void` | Pre-load known speaker profiles |
715+
| `initializeKnownSpeakers(_:mode:preserveIfPermanent:)` | `Void` | Pre-load known speaker profiles |
700716
| `findSpeaker(with:speakerThreshold:)` | `(id: String?, distance: Float)` | Find speaker that matches an embedding |
701-
| `findMatchingSpeaker(with:speakerThreshold:)` | `[(id: String, distance: Float)]` | Find all speakers that match an embedding |
702-
| `findSpeakers(where:)` | [String] | Find all speakers that meet a certain predicate
703-
| findMergeablePairs(speakerThreshold:excludeIfBothPermanent:) | [(speakerToMerge: String, destination: String)] | Find all pairs of very similar speakers |
704-
| `removeSpeaker(_:keepIfPermanent:)` | `Bool` | Remove a speaker from the database |
705-
| `removeSpeakersInactive(since:keepIfPermanent:)` | `Bool` | Remove speakers inactive since a given date |
706-
| `removeSpeakersInactive(for:keepIfPermanent:)` | `Bool` | Remove speakers inactive for a given duration |
707-
| `removeSpeakers(where:)` | `Bool` | Remove speakers that satisfy a given predicate |
708-
| `removeSpeakers(where:keepIfPermanent:)` | `Bool` | Remove speakers that satisfy a given predicate |
709-
| `mergeSpeaker(_:into:mergedName:stopIfPermanent:)` | `Bool` | Merge a speaker into another one |
717+
| `findMatchingSpeakers(with:speakerThreshold:)` | `[(id: String, distance: Float)]` | Find all speakers that match an embedding |
718+
| `findSpeakers(where:)` | `[String]` | Find all speakers that meet a certain predicate
719+
| `findMergeablePairs(speakerThreshold:excludeIfBothPermanent:)` | `[(speakerToMerge: String, destination: String)]` | Find all pairs of very similar speakers |
720+
| `removeSpeaker(_:keepIfPermanent:)` | `Void` | Remove a speaker from the database |
721+
| `removeSpeakersInactive(since:keepIfPermanent:)` | `Void` | Remove speakers inactive since a given date |
722+
| `removeSpeakersInactive(for:keepIfPermanent:)` | `Void` | Remove speakers inactive for a given duration |
723+
| `removeSpeakers(where:)` | `Void` | Remove speakers that satisfy a given predicate |
724+
| `removeSpeakers(where:keepIfPermanent:)` | `Void` | Remove speakers that satisfy a given predicate |
725+
| `mergeSpeaker(_:into:mergedName:stopIfPermanent:)` | `Void` | Merge a speaker into another one |
710726
| `upsertSpeaker(_:)` | `Void` | Update or insert speaker (from object) |
711727
| `upsertSpeaker(id:currentEmbedding:duration:...)` | `Void` | Update or insert speaker (from params) |
712728
| `getSpeaker(for:)` | `Speaker?` | Get speaker by ID |
713729
| `getAllSpeakers()` | `[String: Speaker]` | Get all speakers (debugging) |
714-
| `reset()` | `Void` | Clear speaker database |
715-
| `reassignSegment(segmentId:from:to:)` | `Bool` | Move segment between speakers |
730+
| `getSpeakerList()` | `[Speaker]` | Get array of all speakers (debugging) |
731+
| `hasSpeaker(_:)` | `Bool` | Check if database has a speaker with a given ID |
732+
| `reset(keepIfPermanent:)` | `Void` | Clear speaker database |
733+
| `resetPermanentFlag()` | `Void` | Mark all speakers as not permanent |
716734
| `getCurrentSpeakerNames()` | `[String]` | Get sorted speaker IDs |
717735
| `getGlobalSpeakerStats()` | `(Int, Float, Float, Int)` | Aggregate statistics |
718736

@@ -726,6 +744,7 @@ class RealtimeDiarizer {
726744
| `minEmbeddingUpdateDuration` | `Float` | Min duration to update embeddings (seconds) |
727745
| `speakerCount` | `Int` | Number of tracked speakers |
728746
| `speakerIds` | `[String]` | Sorted array of speaker IDs |
747+
| `permanentSpeakerIds` | `[String]` | Sorted array of speaker IDs of permanent speakers |
729748

730749
### Speaker Properties
731750

@@ -762,6 +781,7 @@ class RealtimeDiarizer {
762781
| `averageEmbeddings(_:)` | `[Float]?` | Average multiple embeddings |
763782
| `createSpeaker(id:name:duration:embedding:config:)` | `Speaker?` | Create validated speaker |
764783
| `updateEmbedding(current:new:alpha:)` | `[Float]?` | EMA update (pure function) |
784+
| `reassignSegment(segmentId:from:to:)` | `Bool` | Move segment between speakers |
765785

766786
## See Also
767787

0 commit comments

Comments
 (0)