use std::path::{Path, PathBuf};
use super::{CpuError, CpuModelFamily};
use crate::inference::{ExecutionMode, ModelLoadError};
#[derive(Debug)]
pub(crate) struct SegmentationAssets(PathBuf);
#[derive(Debug)]
pub(crate) struct EmbeddingAssets {
weights: PathBuf,
metadata: PathBuf,
}
impl SegmentationAssets {
pub(crate) fn resolve(selector: &Path) -> Result<Self, ModelLoadError> {
resolve(selector, CpuModelFamily::Segmentation).map(Self)
}
pub(crate) fn weights(&self) -> &Path {
&self.0
}
}
impl EmbeddingAssets {
pub(crate) fn resolve(selector: &Path) -> Result<Self, ModelLoadError> {
let weights = resolve(selector, CpuModelFamily::Embedding)?;
let metadata = selector.with_file_name("wespeaker-voxceleb-resnet34.min_num_samples.txt");
Ok(Self { weights, metadata })
}
pub(crate) fn weights(&self) -> &Path {
&self.weights
}
pub(crate) fn metadata(&self) -> &Path {
&self.metadata
}
}
fn resolve(selector: &Path, family: CpuModelFamily) -> Result<PathBuf, ModelLoadError> {
let (canonical, native) = match family {
CpuModelFamily::Segmentation => ("segmentation-3.0.onnx", "segmentation-3.0.safetensors"),
CpuModelFamily::Embedding => (
"wespeaker-voxceleb-resnet34.onnx",
"wespeaker-multimask-tail.safetensors",
),
};
let name = selector.file_name().and_then(|name| name.to_str());
if name != Some(canonical) && name != Some(native) {
return Err(CpuError::UnsupportedModel {
family,
path: selector.to_owned(),
}
.into());
}
let weights = selector.with_file_name(native);
if !weights.is_file() {
return Err(ModelLoadError::MissingNativeAsset {
mode: ExecutionMode::Cpu,
path: weights,
});
}
Ok(weights)
}
#[cfg(test)]
mod tests;