pub struct EmbeddingManager { /* private fields */ }Implementations§
Source§impl EmbeddingManager
impl EmbeddingManager
Sourcepub fn new(max_speakers: usize) -> Self
pub fn new(max_speakers: usize) -> Self
Examples found in repository?
examples/max_speakers.rs (line 10)
4fn main() -> Result<()> {
5 let audio_path = std::env::args().nth(1).expect("Please specify audio file");
6 let (samples, sample_rate) = read_wav(&audio_path)?;
7 let max_speakers = 6;
8
9 let extractor = EmbeddingExtractor::new("src/nn/speaker_identification/model.bpk")?;
10 let mut manager = EmbeddingManager::new(max_speakers);
11 let segmenter = Segmenter::new("src/nn/segmentation/model.bpk")?;
12
13 for segment in segmenter.iter_segments(&samples, sample_rate)? {
14 let segment = segment?;
15 let embedding = extractor.extract(&segment.samples, sample_rate)?;
16
17 let speaker = if manager.is_full() {
18 manager.best_match(&embedding)
19 } else {
20 manager.upsert(&embedding, 0.5)
21 }
22 .map(|s| s.to_string())
23 .unwrap_or_else(|| "?".into());
24
25 println!(
26 "start = {:.2}, end = {:.2}, speaker = {}",
27 segment.start, segment.end, speaker
28 );
29 }
30
31 Ok(())
32}More examples
examples/infinite.rs (line 40)
31fn main() -> Result<()> {
32 let audio_path = std::env::args().nth(1).expect("Please specify audio file");
33 let search_threshold = 0.5;
34
35 let embedding_model_path = "src/nn/speaker_identification/model.bpk";
36 let segmentation_model_path = "src/nn/segmentation/model.bpk";
37
38 let (samples, sample_rate) = pyannote_rs::read_wav(&audio_path)?;
39 let embedding_extractor = EmbeddingExtractor::new(embedding_model_path)?;
40 let mut embedding_manager = EmbeddingManager::new(usize::MAX);
41 let segmenter = Segmenter::new(segmentation_model_path)?;
42
43 for segment in segmenter.iter_segments(&samples, sample_rate)? {
44 match segment {
45 Ok(segment) => {
46 if let Err(error) = process_segment(
47 segment,
48 &embedding_extractor,
49 &mut embedding_manager,
50 search_threshold,
51 sample_rate,
52 ) {
53 eprintln!("Error processing segment: {:?}", error);
54 }
55 }
56 Err(error) => eprintln!("Failed to process segment: {:?}", error),
57 }
58 }
59
60 Ok(())
61}Sourcepub fn upsert(&mut self, embedding: &Embedding, threshold: f32) -> Option<usize>
pub fn upsert(&mut self, embedding: &Embedding, threshold: f32) -> Option<usize>
Try to match a speaker; if none is found above threshold, register a new speaker
as long as capacity allows.
Examples found in repository?
examples/infinite.rs (line 18)
8fn process_segment(
9 segment: pyannote_rs::Segment,
10 embedding_extractor: &EmbeddingExtractor,
11 embedding_manager: &mut EmbeddingManager,
12 search_threshold: f32,
13 sample_rate: u32,
14) -> Result<()> {
15 let embedding = embedding_extractor.extract(&segment.samples, sample_rate)?;
16
17 let speaker = embedding_manager
18 .upsert(&embedding, search_threshold)
19 .or_else(|| embedding_manager.best_match(&embedding))
20 .map(|r| r.to_string())
21 .unwrap_or("?".into());
22
23 println!(
24 "start = {:.2}, end = {:.2}, speaker = {}",
25 segment.start, segment.end, speaker
26 );
27
28 Ok(())
29}More examples
examples/max_speakers.rs (line 20)
4fn main() -> Result<()> {
5 let audio_path = std::env::args().nth(1).expect("Please specify audio file");
6 let (samples, sample_rate) = read_wav(&audio_path)?;
7 let max_speakers = 6;
8
9 let extractor = EmbeddingExtractor::new("src/nn/speaker_identification/model.bpk")?;
10 let mut manager = EmbeddingManager::new(max_speakers);
11 let segmenter = Segmenter::new("src/nn/segmentation/model.bpk")?;
12
13 for segment in segmenter.iter_segments(&samples, sample_rate)? {
14 let segment = segment?;
15 let embedding = extractor.extract(&segment.samples, sample_rate)?;
16
17 let speaker = if manager.is_full() {
18 manager.best_match(&embedding)
19 } else {
20 manager.upsert(&embedding, 0.5)
21 }
22 .map(|s| s.to_string())
23 .unwrap_or_else(|| "?".into());
24
25 println!(
26 "start = {:.2}, end = {:.2}, speaker = {}",
27 segment.start, segment.end, speaker
28 );
29 }
30
31 Ok(())
32}Sourcepub fn best_match(&self, embedding: &Embedding) -> Option<usize>
pub fn best_match(&self, embedding: &Embedding) -> Option<usize>
Examples found in repository?
examples/infinite.rs (line 19)
8fn process_segment(
9 segment: pyannote_rs::Segment,
10 embedding_extractor: &EmbeddingExtractor,
11 embedding_manager: &mut EmbeddingManager,
12 search_threshold: f32,
13 sample_rate: u32,
14) -> Result<()> {
15 let embedding = embedding_extractor.extract(&segment.samples, sample_rate)?;
16
17 let speaker = embedding_manager
18 .upsert(&embedding, search_threshold)
19 .or_else(|| embedding_manager.best_match(&embedding))
20 .map(|r| r.to_string())
21 .unwrap_or("?".into());
22
23 println!(
24 "start = {:.2}, end = {:.2}, speaker = {}",
25 segment.start, segment.end, speaker
26 );
27
28 Ok(())
29}More examples
examples/max_speakers.rs (line 18)
4fn main() -> Result<()> {
5 let audio_path = std::env::args().nth(1).expect("Please specify audio file");
6 let (samples, sample_rate) = read_wav(&audio_path)?;
7 let max_speakers = 6;
8
9 let extractor = EmbeddingExtractor::new("src/nn/speaker_identification/model.bpk")?;
10 let mut manager = EmbeddingManager::new(max_speakers);
11 let segmenter = Segmenter::new("src/nn/segmentation/model.bpk")?;
12
13 for segment in segmenter.iter_segments(&samples, sample_rate)? {
14 let segment = segment?;
15 let embedding = extractor.extract(&segment.samples, sample_rate)?;
16
17 let speaker = if manager.is_full() {
18 manager.best_match(&embedding)
19 } else {
20 manager.upsert(&embedding, 0.5)
21 }
22 .map(|s| s.to_string())
23 .unwrap_or_else(|| "?".into());
24
25 println!(
26 "start = {:.2}, end = {:.2}, speaker = {}",
27 segment.start, segment.end, speaker
28 );
29 }
30
31 Ok(())
32}pub fn speaker_count(&self) -> usize
Sourcepub fn is_full(&self) -> bool
pub fn is_full(&self) -> bool
Examples found in repository?
examples/max_speakers.rs (line 17)
4fn main() -> Result<()> {
5 let audio_path = std::env::args().nth(1).expect("Please specify audio file");
6 let (samples, sample_rate) = read_wav(&audio_path)?;
7 let max_speakers = 6;
8
9 let extractor = EmbeddingExtractor::new("src/nn/speaker_identification/model.bpk")?;
10 let mut manager = EmbeddingManager::new(max_speakers);
11 let segmenter = Segmenter::new("src/nn/segmentation/model.bpk")?;
12
13 for segment in segmenter.iter_segments(&samples, sample_rate)? {
14 let segment = segment?;
15 let embedding = extractor.extract(&segment.samples, sample_rate)?;
16
17 let speaker = if manager.is_full() {
18 manager.best_match(&embedding)
19 } else {
20 manager.upsert(&embedding, 0.5)
21 }
22 .map(|s| s.to_string())
23 .unwrap_or_else(|| "?".into());
24
25 println!(
26 "start = {:.2}, end = {:.2}, speaker = {}",
27 segment.start, segment.end, speaker
28 );
29 }
30
31 Ok(())
32}pub fn speakers(&self) -> &HashMap<usize, Embedding>
Trait Implementations§
Source§impl Clone for EmbeddingManager
impl Clone for EmbeddingManager
Source§fn clone(&self) -> EmbeddingManager
fn clone(&self) -> EmbeddingManager
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreAuto Trait Implementations§
impl Freeze for EmbeddingManager
impl RefUnwindSafe for EmbeddingManager
impl Send for EmbeddingManager
impl Sync for EmbeddingManager
impl Unpin for EmbeddingManager
impl UnwindSafe for EmbeddingManager
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more