From ebd80f4c7948c25a547f84c32ab6b2181a0acfba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81lvarez?= Date: Thu, 20 Apr 2023 23:06:55 +0200 Subject: [PATCH] v2.0.3: use input device default buffer size --- Cargo.lock | 84 +++++++++++++++++++++++------------------------ Cargo.toml | 2 +- src/cli/record.rs | 6 ++-- src/cli/spot.rs | 58 +++++++++++++++++++++----------- 4 files changed, 84 insertions(+), 66 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ca2858d..61ca2a2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -26,42 +26,51 @@ dependencies = [ [[package]] name = "anstream" -version = "0.2.6" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "342258dd14006105c2b75ab1bd7543a03bdf0cfc94383303ac212a04939dff6f" +checksum = "9e579a7752471abc2a8268df8b20005e3eadd975f585398f17efcfd8d4927371" dependencies = [ "anstyle", "anstyle-parse", + "anstyle-query", "anstyle-wincon", - "concolor-override", - "concolor-query", + "colorchoice", "is-terminal", "utf8parse", ] [[package]] name = "anstyle" -version = "0.3.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23ea9e81bd02e310c216d080f6223c179012256e5151c41db88d12c88a1684d2" +checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" [[package]] name = "anstyle-parse" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7d1bb534e9efed14f3e5f44e7dd1a4f709384023a4165199a4241e18dff0116" +checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" dependencies = [ "utf8parse", ] +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys 0.48.0", +] + [[package]] name = "anstyle-wincon" -version = "0.2.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3127af6145b149f3287bb9a0d10ad9c5692dba8c53ad48285e5bec4063834fa" +checksum = "4bcd8291a340dd8ac70e18878bc4501dd7b4ff970cfa21c207d36ece51ea88fd" dependencies = [ "anstyle", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -178,9 +187,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.2.1" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046ae530c528f252094e4a77886ee1374437744b2bff1497aa898bbddbbb29b3" +checksum = "956ac1f6381d8d82ab4684768f89c0ea3afe66925ceadb4eeb3fc452ffc55d62" dependencies = [ "clap_builder", "clap_derive", @@ -189,9 +198,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.2.1" +version = "4.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "223163f58c9a40c3b0a43e1c4b50a9ce09f007ea2cb1ec258a687945b4b7929f" +checksum = "84080e799e54cff944f4b4a4b0e71630b0e0443b25b985175c7dddc1a859b749" dependencies = [ "anstream", "anstyle", @@ -209,7 +218,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.14", + "syn 2.0.15", ] [[package]] @@ -218,6 +227,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "combine" version = "4.6.6" @@ -228,21 +243,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "concolor-override" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a855d4a1978dc52fb0536a04d384c2c0c1aa273597f08b77c8c4d3b2eec6037f" - -[[package]] -name = "concolor-query" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d11d52c3d7ca2e6d0040212be9e4dbbcd78b6447f535b6b561f449427944cf" -dependencies = [ - "windows-sys 0.45.0", -] - [[package]] name = "core-foundation-sys" version = "0.6.2" @@ -472,9 +472,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.141" +version = "0.2.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" +checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" [[package]] name = "libloading" @@ -488,9 +488,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" +checksum = "9b085a4f2cde5781fc4b1717f2e86c62f5cda49de7ba99a7c2eae02b61c9064c" [[package]] name = "lock_api" @@ -829,9 +829,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.11" +version = "0.37.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85597d61f83914ddeba6a47b3b8ffe7365107221c2e557ed94426489fefb5f77" +checksum = "f79bef90eb6d984c72722595b5b1348ab39275a5e5123faca6863bf07d75a4e0" dependencies = [ "bitflags", "errno", @@ -856,7 +856,7 @@ dependencies = [ [[package]] name = "rustpotter-cli" -version = "2.0.2" +version = "2.0.3" dependencies = [ "clap", "cpal", @@ -898,7 +898,7 @@ checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", "quote", - "syn 2.0.14", + "syn 2.0.15", ] [[package]] @@ -944,9 +944,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.14" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf316d5356ed6847742d036f8a39c3b8435cac10bd528a4bd461928a6ab34d5" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" dependencies = [ "proc-macro2", "quote", @@ -970,7 +970,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.14", + "syn 2.0.15", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 6d5cbd8..2f788ef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustpotter-cli" -version = "2.0.2" +version = "2.0.3" edition = "2021" license = "Apache-2.0" description = "CLI for Rustpotter, an open source wakeword spotter forged in rust." diff --git a/src/cli/record.rs b/src/cli/record.rs index 34c53e3..8da3d1e 100644 --- a/src/cli/record.rs +++ b/src/cli/record.rs @@ -10,13 +10,13 @@ use cpal::{FromSample, Sample}; #[clap()] pub struct RecordCommand { #[clap()] - /// Generated record path + /// Generated record path. output_path: String, #[clap(short = 'i', long)] - /// Input device index used for record + /// Input device index used for record. device_index: Option, #[clap(short, long)] - /// Input device index used for record + /// Input device configuration index used for record. config_index: Option, #[clap(short, long, default_value_t = 1.)] /// Adjust the recording volume. value > 1.0 amplifies, value < 1.0 attenuates diff --git a/src/cli/spot.rs b/src/cli/spot.rs index 98e22be..b1c0b28 100644 --- a/src/cli/spot.rs +++ b/src/cli/spot.rs @@ -17,8 +17,14 @@ pub struct SpotCommand { /// Input device index used for record. device_index: Option, #[clap(short, long)] - /// Input device index used for record. + /// Input device config index used for record. config_index: Option, + #[clap(long)] + /// Set the stream buffer size to a near value to the rustpotter buffer size. + custom_buffer_size: bool, + #[clap(long)] + /// Set the stream buffer size. + manual_buffer_size: Option, #[clap(short, long, default_value_t = 0.5)] /// Default detection threshold, only applies to models without threshold. threshold: f32, @@ -109,23 +115,28 @@ pub fn spot(command: SpotCommand) -> Result<(), String> { println!("Rustpotter config:\n{:?}", config); } let mut rustpotter = Rustpotter::new(&config)?; - - let required_buffer_size = if host_name == "ALSA" { - // force even buffer size to workaround issue mentioned here https://github.com/RustAudio/cpal/pull/582#pullrequestreview-1095655011 - rustpotter.get_samples_per_frame() as u32 * 2 + + let required_buffer_size: Option = if command.custom_buffer_size + || command.manual_buffer_size.is_some() + { + let mut required_buffer_size = command + .manual_buffer_size + .unwrap_or(rustpotter.get_samples_per_frame() as u32); + if host_name == "ALSA" && required_buffer_size % 2 != 0 { + // force even buffer size to workaround issue mentioned here https://github.com/RustAudio/cpal/pull/582#pullrequestreview-1095655011 + required_buffer_size = required_buffer_size + 1; + } + if !is_compatible_buffer_size(&device_config.buffer_size(), required_buffer_size) { + clap::Error::raw( + clap::error::ErrorKind::Io, + "Required buffer size does not matches device configuration, try selecting other.\n", + ) + .exit(); + } + Some(required_buffer_size) } else { - rustpotter.get_samples_per_frame() as u32 + None }; - if !is_compatible_buffer_size( - &device_config.buffer_size(), - required_buffer_size, - ) { - clap::Error::raw( - clap::error::ErrorKind::Io, - "Rustpotter required buffer size does not matches device configuration, try selecting other.\n", - ) - .exit(); - } for path in command.model_path { let result = rustpotter.add_wakeword_from_file(&path); if let Err(error) = result { @@ -146,7 +157,8 @@ pub fn spot(command: SpotCommand) -> Result<(), String> { let stream_config = cpal::StreamConfig { channels: device_config.channels(), sample_rate: device_config.sample_rate(), - buffer_size: cpal::BufferSize::Fixed(required_buffer_size), + buffer_size: required_buffer_size + .map_or(cpal::BufferSize::Default, |v| cpal::BufferSize::Fixed(v)), }; if command.debug { println!("Audio stream config: {:?}", stream_config); @@ -163,7 +175,9 @@ pub fn spot(command: SpotCommand) -> Result<(), String> { move |data: &[i16], _: &_| { buffer_i16.extend_from_slice(data); while buffer_i16.len() >= rustpotter_samples_per_frame { - let detection = rustpotter.process_i16(buffer_i16.drain(0..rustpotter_samples_per_frame).as_slice()); + let detection = rustpotter.process_i16( + buffer_i16.drain(0..rustpotter_samples_per_frame).as_slice(), + ); print_detection( &rustpotter, detection, @@ -183,7 +197,9 @@ pub fn spot(command: SpotCommand) -> Result<(), String> { move |data: &[i32], _: &_| { buffer_i32.extend_from_slice(data); while buffer_i32.len() >= rustpotter_samples_per_frame { - let detection = rustpotter.process_i32(&buffer_i32.drain(0..rustpotter_samples_per_frame).as_slice()); + let detection = rustpotter.process_i32( + &buffer_i32.drain(0..rustpotter_samples_per_frame).as_slice(), + ); print_detection( &rustpotter, detection, @@ -203,7 +219,9 @@ pub fn spot(command: SpotCommand) -> Result<(), String> { move |data: &[f32], _: &_| { buffer_f32.extend_from_slice(data); while buffer_f32.len() >= rustpotter_samples_per_frame { - let detection = rustpotter.process_f32(buffer_f32.drain(0..rustpotter_samples_per_frame).as_slice()); + let detection = rustpotter.process_f32( + buffer_f32.drain(0..rustpotter_samples_per_frame).as_slice(), + ); print_detection( &rustpotter, detection,