denoising actually works on desktop!

This commit is contained in:
2025-10-28 01:18:39 -06:00
parent 1ff302816e
commit 1efd32892e
+31 -14
View File
@@ -74,6 +74,7 @@ fn with_denoising_model<O>(
pub struct AudioProcessor { pub struct AudioProcessor {
denoise: bool, denoise: bool,
spawn: imp::SpawnHandle, spawn: imp::SpawnHandle,
buffer: Vec<f32>,
} }
impl AudioProcessor { impl AudioProcessor {
@@ -81,6 +82,7 @@ impl AudioProcessor {
AudioProcessor { AudioProcessor {
denoise: false, denoise: false,
spawn: imp::SpawnHandle::current(), spawn: imp::SpawnHandle::current(),
buffer: Vec::new(),
} }
} }
@@ -88,30 +90,45 @@ impl AudioProcessor {
AudioProcessor { AudioProcessor {
denoise: true, denoise: true,
spawn: imp::SpawnHandle::current(), spawn: imp::SpawnHandle::current(),
buffer: Vec::new(),
} }
} }
} }
impl AudioProcessor { impl AudioProcessor {
pub fn process(&mut self, audio: &[f32], output: &mut Vec<f32>) { pub fn process(&mut self, audio: &[f32], output: &mut Vec<f32>) {
let mut finished = false; let mut include_raw = true;
if self.denoise { if self.denoise {
with_denoising_model(&self.spawn, |df| { with_denoising_model(&self.spawn, |df| {
let start = output.len(); include_raw = false;
output.extend(std::iter::repeat_n(0f32, audio.len()));
finished = true; self.buffer.extend_from_slice(audio);
let output = &mut output[start..]; output.reserve(audio.len());
df.process(
slice_as_arrayview(audio, &[audio.len()]) let hop = df.hop_size;
.into_shape((1, audio.len())) let mut i = 0;
.unwrap(), while self.buffer[i..].len() >= hop {
mut_slice_as_arrayviewmut(output, &[output.len()]) let audio = &self.buffer[i..][..hop];
.into_shape((1, output.len())) i += audio.len();
.unwrap(),
); let j = output.len();
output.extend(std::iter::repeat_n(0f32, audio.len()));
let output = &mut output[j..];
df.process(
slice_as_arrayview(audio, &[audio.len()])
.into_shape((1, audio.len()))
.unwrap(),
mut_slice_as_arrayviewmut(output, &[output.len()])
.into_shape((1, output.len()))
.unwrap(),
);
}
self.buffer.splice(..i, []);
}); });
} }
if !finished {
if include_raw {
output.extend_from_slice(audio); output.extend_from_slice(audio);
} }
} }