pub struct EmbeddingExtractor { /* private fields */ }
Implementations§
Source§impl EmbeddingExtractor
impl EmbeddingExtractor
Sourcepub fn new<P: AsRef<Path>>(model_path: P) -> Result<Self>
pub fn new<P: AsRef<Path>>(model_path: P) -> Result<Self>
Examples found in repository?
examples/infinite.rs (line 43)
35fn main() -> Result<(), eyre::Report> {
36 let audio_path = std::env::args().nth(1).expect("Please specify audio file");
37 let search_threshold = 0.5;
38
39 let embedding_model_path = "wespeaker_en_voxceleb_CAM++.onnx";
40 let segmentation_model_path = "segmentation-3.0.onnx";
41
42 let (samples, sample_rate) = pyannote_rs::read_wav(&audio_path)?;
43 let mut embedding_extractor = EmbeddingExtractor::new(embedding_model_path)?;
44 let mut embedding_manager = EmbeddingManager::new(usize::MAX);
45
46 let segments = pyannote_rs::get_segments(&samples, sample_rate, segmentation_model_path)?;
47
48 for segment in segments {
49 if let Ok(segment) = segment {
50 if let Err(error) = process_segment(
51 segment,
52 &mut embedding_extractor,
53 &mut embedding_manager,
54 search_threshold,
55 ) {
56 eprintln!("Error processing segment: {:?}", error);
57 }
58 } else if let Err(error) = segment {
59 eprintln!("Failed to process segment: {:?}", error);
60 }
61 }
62
63 Ok(())
64}
More examples
examples/max_speakers.rs (line 8)
3fn main() {
4 let audio_path = std::env::args().nth(1).expect("Please specify audio file");
5 let (samples, sample_rate) = pyannote_rs::read_wav(&audio_path).unwrap();
6 let max_speakers = 6;
7
8 let mut extractor = EmbeddingExtractor::new("wespeaker_en_voxceleb_CAM++.onnx").unwrap();
9 let mut manager = EmbeddingManager::new(6);
10
11 let segments =
12 pyannote_rs::get_segments(&samples, sample_rate, "segmentation-3.0.onnx").unwrap();
13
14 for segment in segments {
15 match segment {
16 Ok(segment) => {
17 if let Ok(embedding) = extractor.compute(&segment.samples) {
18 let speaker = if manager.get_all_speakers().len() == max_speakers {
19 manager
20 .get_best_speaker_match(embedding.collect())
21 .map(|s| s.to_string())
22 .unwrap_or("?".into())
23 } else {
24 manager
25 .search_speaker(embedding.collect(), 0.5)
26 .map(|s| s.to_string())
27 .unwrap_or("?".into())
28 };
29 println!(
30 "start = {:.2}, end = {:.2}, speaker = {}",
31 segment.start, segment.end, speaker
32 );
33 } else {
34 println!(
35 "start = {:.2}, end = {:.2}, speaker = ?",
36 segment.start, segment.end
37 );
38 }
39 }
40 Err(error) => eprintln!("Failed to process segment: {:?}", error),
41 }
42 }
43}
Sourcepub fn compute(&mut self, samples: &[i16]) -> Result<impl Iterator<Item = f32>>
pub fn compute(&mut self, samples: &[i16]) -> Result<impl Iterator<Item = f32>>
Examples found in repository?
examples/infinite.rs (line 17)
10fn process_segment(
11 segment: pyannote_rs::Segment,
12 embedding_extractor: &mut EmbeddingExtractor,
13 embedding_manager: &mut EmbeddingManager,
14 search_threshold: f32,
15) -> Result<(), eyre::Report> {
16 let embedding_result: Vec<f32> = embedding_extractor
17 .compute(&segment.samples)
18 .unwrap()
19 .collect();
20
21 let speaker = embedding_manager
22 .search_speaker(embedding_result.clone(), search_threshold)
23 .ok_or_else(|| embedding_manager.search_speaker(embedding_result, 0.0)) // Ensure always to return speaker
24 .map(|r| r.to_string())
25 .unwrap_or("?".into());
26
27 println!(
28 "start = {:.2}, end = {:.2}, speaker = {}",
29 segment.start, segment.end, speaker
30 );
31
32 Ok(())
33}
More examples
examples/max_speakers.rs (line 17)
3fn main() {
4 let audio_path = std::env::args().nth(1).expect("Please specify audio file");
5 let (samples, sample_rate) = pyannote_rs::read_wav(&audio_path).unwrap();
6 let max_speakers = 6;
7
8 let mut extractor = EmbeddingExtractor::new("wespeaker_en_voxceleb_CAM++.onnx").unwrap();
9 let mut manager = EmbeddingManager::new(6);
10
11 let segments =
12 pyannote_rs::get_segments(&samples, sample_rate, "segmentation-3.0.onnx").unwrap();
13
14 for segment in segments {
15 match segment {
16 Ok(segment) => {
17 if let Ok(embedding) = extractor.compute(&segment.samples) {
18 let speaker = if manager.get_all_speakers().len() == max_speakers {
19 manager
20 .get_best_speaker_match(embedding.collect())
21 .map(|s| s.to_string())
22 .unwrap_or("?".into())
23 } else {
24 manager
25 .search_speaker(embedding.collect(), 0.5)
26 .map(|s| s.to_string())
27 .unwrap_or("?".into())
28 };
29 println!(
30 "start = {:.2}, end = {:.2}, speaker = {}",
31 segment.start, segment.end, speaker
32 );
33 } else {
34 println!(
35 "start = {:.2}, end = {:.2}, speaker = ?",
36 segment.start, segment.end
37 );
38 }
39 }
40 Err(error) => eprintln!("Failed to process segment: {:?}", error),
41 }
42 }
43}
Trait Implementations§
Auto Trait Implementations§
impl Freeze for EmbeddingExtractor
impl !RefUnwindSafe for EmbeddingExtractor
impl Send for EmbeddingExtractor
impl Sync for EmbeddingExtractor
impl Unpin for EmbeddingExtractor
impl !UnwindSafe for EmbeddingExtractor
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