use std::path::Path;
use crate::TranscribeError;
pub fn read_wav_samples(wav_path: &Path) -> Result<Vec<f32>, TranscribeError> {
let mut reader = hound::WavReader::open(wav_path).map_err(|e| {
TranscribeError::Audio(format!("failed to open {}: {}", wav_path.display(), e))
})?;
let spec = reader.spec();
let expected_spec = hound::WavSpec {
channels: 1,
sample_rate: 16000,
bits_per_sample: 16,
sample_format: hound::SampleFormat::Int,
};
if spec.channels != expected_spec.channels {
return Err(TranscribeError::Audio(format!(
"Expected {} channels, found {}",
expected_spec.channels, spec.channels
)));
}
if spec.sample_rate != expected_spec.sample_rate {
return Err(TranscribeError::Audio(format!(
"Expected {} Hz sample rate, found {} Hz",
expected_spec.sample_rate, spec.sample_rate
)));
}
if spec.bits_per_sample != expected_spec.bits_per_sample {
return Err(TranscribeError::Audio(format!(
"Expected {} bits per sample, found {}",
expected_spec.bits_per_sample, spec.bits_per_sample
)));
}
if spec.sample_format != expected_spec.sample_format {
return Err(TranscribeError::Audio(format!(
"Expected Int sample format, found {:?}",
spec.sample_format
)));
}
let samples: Result<Vec<f32>, _> = reader
.samples::<i16>()
.map(|sample| sample.map(|s| s as f32 / i16::MAX as f32))
.collect();
Ok(samples?)
}