use candle::{Result, Tensor}; // https://github.com/facebookresearch/audiocraft/blob/69fea8b290ad1b4b40d28f92d1dfc0ab01dbab85/audiocraft/data/audio_utils.py#L57 pub fn normalize_loudness( wav: &Tensor, sample_rate: u32, loudness_compressor: bool, ) -> Result { let energy = wav.sqr()?.mean_all()?.sqrt()?.to_vec0::()?; if energy < 2e-3 { return Ok(wav.clone()); } let wav_array = wav.to_vec1::()?; let mut meter = crate::bs1770::ChannelLoudnessMeter::new(sample_rate); meter.push(wav_array.into_iter()); let power = meter.as_100ms_windows(); let loudness = match crate::bs1770::gated_mean(power) { None => return Ok(wav.clone()), Some(gp) => gp.loudness_lkfs() as f64, }; let delta_loudness = -14. - loudness; let gain = 10f64.powf(delta_loudness / 20.); let wav = (wav * gain)?; if loudness_compressor { wav.tanh() } else { Ok(wav) } }