diff --git a/Cargo.lock b/Cargo.lock index 363019dec..6e759f689 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -581,6 +581,32 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "audioadapter" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1292ef9edf681b7426ed089004b021a42896492f58bd0c909ad44e5faec9ac4" + +[[package]] +name = "audioadapter-buffers" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c972db1b4829c49bc41f2f72d0b57faecd6f2d4732a5127680b734b6a6a35a6" +dependencies = [ + "audioadapter", + "audioadapter-sample", + "num-traits", +] + +[[package]] +name = "audioadapter-sample" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d4daf502185bc4e7ff68dad7c8b7681b30080272498812869764a324dca0ff6" +dependencies = [ + "num-traits", +] + [[package]] name = "autocfg" version = "1.5.1" @@ -9265,12 +9291,16 @@ dependencies = [ [[package]] name = "rubato" -version = "0.16.2" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5258099699851cfd0082aeb645feb9c084d9a5e1f1b8d5372086b989fc5e56a1" +checksum = "a7cb1ffaf8738df50aab642a7f6465df81c6ba9e2818268053487165298114be" dependencies = [ + "audioadapter", + "audioadapter-buffers", "num-integer", "num-traits", + "visibility", + "windowfunctions", ] [[package]] @@ -13055,6 +13085,17 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "visibility" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + [[package]] name = "vsimd" version = "0.8.0" @@ -13352,6 +13393,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windowfunctions" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90628d739333b7c5d2ee0b70210b97b8cddc38440c682c96fd9e2c24c2db5f3a" +dependencies = [ + "num-traits", +] + [[package]] name = "windows" version = "0.56.0" diff --git a/crates/goose/Cargo.toml b/crates/goose/Cargo.toml index b44ff28d8..3d1a46463 100644 --- a/crates/goose/Cargo.toml +++ b/crates/goose/Cargo.toml @@ -186,7 +186,7 @@ candle-transformers = { version = "0.11", default-features = false, optional = t byteorder = { version = "1.5", default-features = false, features = ["std"], optional = true } tokenizers = { version = "0.23", default-features = false, features = ["onig"], optional = true } symphonia = { version = "0.5", default-features = false, features = ["aac", "adpcm", "alac", "isomp4", "mkv", "mp3", "pcm", "vorbis", "wav"], optional = true } -rubato = { version = "0.16", default-features = false, optional = true } +rubato = { version = "5.0", default-features = false, optional = true } sys-info = { version = "0.9", default-features = false } schemars = { workspace = true, features = [ diff --git a/crates/goose/src/dictation/whisper.rs b/crates/goose/src/dictation/whisper.rs index 8d87c3836..d17e9fcfe 100644 --- a/crates/goose/src/dictation/whisper.rs +++ b/crates/goose/src/dictation/whisper.rs @@ -1103,7 +1103,8 @@ fn convert_to_mono(data: &[f32], channels: usize) -> Vec { fn resample_audio(data: &[f32], from_rate: u32, to_rate: u32) -> Result> { use rubato::{ - Resampler, SincFixedIn, SincInterpolationParameters, SincInterpolationType, WindowFunction, + audioadapter_buffers::direct::SequentialSliceOfVecs, Async, FixedAsync, Resampler, + SincInterpolationParameters, SincInterpolationType, WindowFunction, }; if from_rate == to_rate { @@ -1119,25 +1120,28 @@ fn resample_audio(data: &[f32], from_rate: u32, to_rate: u32) -> Result let params = SincInterpolationParameters { sinc_len: 256, - f_cutoff: 0.95, + f_cutoff: Some(0.95), interpolation: SincInterpolationType::Linear, oversampling_factor: 256, window: WindowFunction::BlackmanHarris2, }; - let mut resampler = SincFixedIn::::new( + let mut resampler = Async::::new_sinc( to_rate as f64 / from_rate as f64, 2.0, - params, - data.len(), + ¶ms, + 1024, 1, + FixedAsync::Input, )?; let waves_in = vec![data.to_vec()]; - let waves_out = resampler.process(&waves_in, None)?; + let input = SequentialSliceOfVecs::new(&waves_in, 1, data.len())?; + let output = resampler.process_all(&input, data.len(), None)?; + let output = output.take_data(); - tracing::debug!(output_samples = waves_out[0].len(), "resampling complete"); - Ok(waves_out[0].clone()) + tracing::debug!(output_samples = output.len(), "resampling complete"); + Ok(output) } #[cfg(test)]