use crate::types::DiarizationConfig;
#[derive(thiserror::Error, Debug)]
pub enum EmbeddingError {
#[error("model not loaded: {0}")]
ModelNotLoaded(String),
#[error("inference failed: {0}")]
InferenceFailed(String),
#[error("invalid input: expected {expected} samples, got {got}")]
InvalidInput { expected: usize, got: usize },
}
pub trait EmbeddingExtractor: Send + Sync {
fn extract(
&self,
samples: &[f32],
config: &DiarizationConfig,
) -> Result<Vec<f32>, EmbeddingError>;
fn embedding_dim(&self) -> usize;
}
pub struct DummyExtractor {
dim: usize,
seed: std::sync::atomic::AtomicU64,
}
impl DummyExtractor {
pub fn new(dim: usize) -> Self {
Self {
dim,
seed: std::sync::atomic::AtomicU64::new(1),
}
}
}
impl EmbeddingExtractor for DummyExtractor {
fn extract(
&self,
samples: &[f32],
_config: &DiarizationConfig,
) -> Result<Vec<f32>, EmbeddingError> {
let _ = samples; let mut seed = self.seed.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
let mut vec = vec![0.0f32; self.dim];
for v in &mut vec {
seed = seed.wrapping_mul(1103515245).wrapping_add(12345);
*v = ((seed % 1000) as f32 / 1000.0) - 0.5;
}
crate::utils::l2_normalize(&mut vec);
Ok(vec)
}
fn embedding_dim(&self) -> usize {
self.dim
}
}