Function pyannote_rs::segment::segment
source ยท pub fn segment(
samples: &[i16],
sample_rate: u32,
model_path: &Path,
) -> Result<Vec<(f64, f64)>>
Examples found in repository?
examples/diarize.rs (line 20)
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 44 45 46 47 48 49 50 51 52 53 54
fn main() -> Result<()> {
let model_path = Path::new("segmentation-3.0.onnx");
let (samples, sample_rate) =
wav::read_wav(&std::env::args().nth(1).expect("Please specify audio file"))?;
let mut samples_f32 = vec![0.0; samples.len()];
knf_rs::convert_integer_to_float_audio(&samples, &mut samples_f32);
let mut embedding_extractor =
EmbeddingExtractor::new(Path::new("wespeaker_en_voxceleb_CAM++.onnx")).unwrap();
let mut embedding_manager = EmbeddingManager::new(6);
let segments = segment::segment(&samples, sample_rate, model_path)?;
for (start, end) in segments {
// Convert start and end times to sample indices
let start_f64 = start * (sample_rate as f64);
let end_f64 = end * (sample_rate as f64);
// Ensure indices are within bounds
let start_idx = start_f64.min((samples_f32.len() - 1) as f64) as usize;
let end_idx = end_f64.min(samples_f32.len() as f64) as usize;
// Extract segment samples
let segment_samples = &samples_f32[start_idx..end_idx];
// Compute embedding
match embedding_extractor.compute(&segment_samples) {
Ok(embedding_result) => {
let speaker = embedding_manager
.get_speaker(embedding_result, 0.5)
.map(|r| r.to_string())
.unwrap_or("?".into());
println!(
"start = {:.2}, end = {:.2}, speaker = {}",
start, end, speaker
);
}
Err(error) => {
println!("start = {:.2}, end = {:.2}, speaker = {}", start, end, "?");
println!("error: {:?}", error);
}
}
}
Ok(())
}