use crate::config::VoxtralAudioConfig;
use anyhow::{Result, ensure};
pub use rlx_whisper::{
N_SAMPLES, SAMPLE_RATE, SpeechSegment, load_wav_mono_f32, parse_wav_mono_f32,
pcm_segments_by_vad,
};
pub const N_FRAMES: usize = 3_000;
#[derive(Debug, Clone)]
pub struct MelSpectrogram {
pub n_mels: usize,
pub n_frames: usize,
pub data: Vec<f32>,
}
pub fn pcm_to_mel(cfg: &VoxtralAudioConfig, pcm: &[f32]) -> Result<MelSpectrogram> {
ensure!(cfg.num_mel_bins > 0, "num_mel_bins must be > 0");
let padded = rlx_whisper::audio::pad_or_trim_pcm(pcm);
let mel = rlx_whisper::pcm_to_log_mel(&padded, cfg.num_mel_bins, N_FRAMES);
Ok(MelSpectrogram {
n_mels: mel.n_mels,
n_frames: mel.n_frames,
data: mel.data,
})
}
pub fn mel_from_flat(n_mels: usize, n_frames: usize, data: Vec<f32>) -> Result<MelSpectrogram> {
ensure!(
data.len() == n_mels * n_frames,
"mel flat len {} != {n_mels}×{n_frames}",
data.len()
);
Ok(MelSpectrogram {
n_mels,
n_frames,
data,
})
}