pub mod audio;
pub mod backend;
pub mod bessel;
pub mod decode;
pub mod denoiser;
pub mod encode;
pub mod fft;
pub mod gain;
pub mod noise;
pub mod perceptual;
pub mod postfilter;
pub mod stft;
pub mod window;
pub use audio::{read_audio, read_wav, write_audio, write_wav, Audio};
pub use backend::{Backend, BackendOptions, OnnxModelConfig};
pub use decode::{decode_file, AudioFormat, DecodedPcm};
pub use denoiser::{Denoiser, DenoiserConfig, Preset};
pub use encode::{EncodeOptions, OutputFormat};
pub use gain::{Algorithm, SpecSubLaw};
pub use window::{WindowParams, WindowType};
pub fn denoise_file<P1, P2>(input: P1, output: P2, config: DenoiserConfig) -> Result<Audio, String>
where
P1: AsRef<std::path::Path>,
P2: AsRef<std::path::Path>,
{
denoise_file_with_backend(input, output, config, Backend::Classical)
}
pub fn denoise_file_with_backend<P1, P2>(
input: P1,
output: P2,
config: DenoiserConfig,
backend: Backend,
) -> Result<Audio, String>
where
P1: AsRef<std::path::Path>,
P2: AsRef<std::path::Path>,
{
denoise_file_with_backend_opts(input, output, config, backend, EncodeOptions::default())
}
pub fn denoise_file_with_backend_opts<P1, P2>(
input: P1,
output: P2,
config: DenoiserConfig,
backend: Backend,
encode_opts: EncodeOptions,
) -> Result<Audio, String>
where
P1: AsRef<std::path::Path>,
P2: AsRef<std::path::Path>,
{
denoise_file_with_backend_config(
input,
output,
config,
backend,
encode_opts,
BackendOptions::default(),
)
}
pub fn denoise_file_with_backend_config<P1, P2>(
input: P1,
output: P2,
mut config: DenoiserConfig,
backend: Backend,
encode_opts: EncodeOptions,
backend_options: BackendOptions,
) -> Result<Audio, String>
where
P1: AsRef<std::path::Path>,
P2: AsRef<std::path::Path>,
{
let mut audio = read_audio(input)?;
config.sample_rate = audio.sample_rate;
let t0 = std::time::Instant::now();
audio.channels = backend::process_channels(
backend,
&audio.channels,
audio.sample_rate,
&config,
&backend_options,
)?;
let elapsed = t0.elapsed();
write_audio(output, &audio, encode_opts)?;
eprintln!(
"denoize: {:?} | {}ch x {} frames ({:.2}s) in {:.2?} ({:.1}x realtime)",
backend,
audio.channels(),
audio.frames(),
audio.frames() as f64 / audio.sample_rate as f64,
elapsed,
(audio.frames() as f64 / audio.sample_rate as f64) / elapsed.as_secs_f64().max(1e-9),
);
Ok(audio)
}