max_speakers/
max_speakers.rs

1use anyhow::Result;
2use pyannote_rs::{EmbeddingExtractor, EmbeddingManager, Segmenter, read_wav};
3
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}