#![allow(deprecated)]
use crate::types::DiarizationConfig;
#[non_exhaustive]
#[derive(thiserror::Error, Debug)]
#[deprecated(
since = "0.7.0",
note = "use polyvoice::EmbedderError with the Embedder trait"
)]
pub enum EmbeddingError {
#[error("model not loaded: {0}")]
ModelNotLoaded(String),
#[error("inference failed: {0}")]
InferenceFailed(String),
#[error("resource exhausted: {0}")]
ResourceExhausted(String),
#[error("invalid input: expected {expected} samples, got {got}")]
InvalidInput { expected: usize, got: usize },
}
#[allow(deprecated)]
impl EmbeddingError {
pub fn is_resource_exhausted(&self) -> bool {
match self {
Self::ResourceExhausted(_) => true,
Self::InferenceFailed(msg) => msg.contains("pool exhausted"),
Self::ModelNotLoaded(_) | Self::InvalidInput { .. } => false,
}
}
}
#[deprecated(
since = "0.7.0",
note = "implement polyvoice::Embedder instead; EmbeddingExtractor still works via an automatic bridge"
)]
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),
}
}
fn next_unit_vector(&self) -> Vec<f32> {
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);
vec
}
}
impl crate::Embedder for DummyExtractor {
fn dim(&self) -> usize {
self.dim
}
fn embed(&self, _audio: &[f32]) -> Result<Vec<f32>, crate::EmbedderError> {
Ok(self.next_unit_vector())
}
}