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