use anyhow::{anyhow, ensure, Result};
use crate::runtime::{InferenceSession, Tensor};
pub struct MelProcessor<S: InferenceSession> {
session: S,
}
impl<S: InferenceSession> MelProcessor<S> {
pub fn new(session: S) -> Self {
Self { session }
}
pub fn session_mut(&mut self) -> &mut S {
&mut self.session
}
pub fn process(&mut self, samples: &[f32]) -> Result<Tensor> {
let input = Tensor {
shape: vec![1, samples.len()],
data: samples.to_vec(),
};
let mut outputs = self.session.run(&[("audio_pcm", &input)])?;
let mel = outputs
.remove("mel_spectrogram")
.ok_or_else(|| anyhow!("Model missing 'mel_spectrogram' output"))?;
ensure!(
mel.shape.len() == 3 && mel.shape[0] == 1 && mel.shape[2] == 128,
"Unexpected mel shape: {:?}",
mel.shape
);
Ok(mel)
}
}
pub fn num_frames(mel: &Tensor) -> usize {
mel.shape[1]
}