denoising actually works on desktop!
This commit is contained in:
+31
-14
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user