use crate::transcript::WhisperTranscript;
use anyhow::Result;
pub fn assign_speakers(
diar: &mut rlx_diarize::DiarizeSession,
pcm: &[f32],
transcript: &mut WhisperTranscript,
) -> Result<()> {
let turns = diar.diarize(pcm)?;
for seg in &mut transcript.segments {
seg.speaker = best_speaker(&turns, seg.start, seg.end).map(|id| format!("SPEAKER_{id:02}"));
}
Ok(())
}
fn best_speaker(turns: &[rlx_diarize::SpeakerTurn], start: f32, end: f32) -> Option<usize> {
let mut best: Option<(usize, f32)> = None;
for t in turns {
let overlap = (end.min(t.end) - start.max(t.start)).max(0.0);
if overlap > 0.0 {
if best.map(|(_, o)| overlap > o).unwrap_or(true) {
best = Some((t.speaker_id, overlap));
}
}
}
best.map(|(id, _)| id)
}