mirror of
https://github.com/huggingface/candle.git
synced 2025-06-19 11:56:45 +00:00

* Normalize loudness of the generated audio. * Lints. * One more lint. * Avoid running the bs1770 tests. * Another attempt at discarding doc comments. * Also normalize the loudness in the encodec example.
30 lines
968 B
Rust
30 lines
968 B
Rust
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<Tensor> {
|
|
let energy = wav.sqr()?.mean_all()?.sqrt()?.to_vec0::<f32>()?;
|
|
if energy < 2e-3 {
|
|
return Ok(wav.clone());
|
|
}
|
|
let wav_array = wav.to_vec1::<f32>()?;
|
|
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)
|
|
}
|
|
}
|