From f5a2005500ba43d217bf5fb28d66bd63a48609e8 Mon Sep 17 00:00:00 2001 From: John Tennant Date: Mon, 27 Jul 2026 20:15:56 -0400 Subject: [PATCH] Split TTS playback speed regression test Signed-off-by: John Tennant --- desktop/src-tauri/src/huddle/tts.rs | 3 +++ .../src/huddle/tts_playback_speed_tests.rs | 26 +++++++++++++++++++ desktop/src-tauri/src/huddle/tts_tests.rs | 25 ------------------ 3 files changed, 29 insertions(+), 25 deletions(-) create mode 100644 desktop/src-tauri/src/huddle/tts_playback_speed_tests.rs diff --git a/desktop/src-tauri/src/huddle/tts.rs b/desktop/src-tauri/src/huddle/tts.rs index 2fcfc7c07..2c0e2cfdf 100644 --- a/desktop/src-tauri/src/huddle/tts.rs +++ b/desktop/src-tauri/src/huddle/tts.rs @@ -920,6 +920,9 @@ fn lock_player_ops(ops: &Mutex<()>) -> MutexGuard<'_, ()> { // ── Tests ───────────────────────────────────────────────────────────────────── +#[cfg(test)] +#[path = "tts_playback_speed_tests.rs"] +mod playback_speed_tests; #[cfg(test)] #[path = "tts_tests.rs"] mod tests; diff --git a/desktop/src-tauri/src/huddle/tts_playback_speed_tests.rs b/desktop/src-tauri/src/huddle/tts_playback_speed_tests.rs new file mode 100644 index 000000000..91f72393f --- /dev/null +++ b/desktop/src-tauri/src/huddle/tts_playback_speed_tests.rs @@ -0,0 +1,26 @@ +use super::*; + +/// Regression guard: playback decoration happens after speed processing, so +/// the fixed device cushion is never time-stretched. +#[test] +fn playback_speed_preserves_production_sentence_lead_in() { + let processed = process_complete_chunk(&vec![0.5; 2_400], 1.5, SAMPLE_RATE) + .expect("process synthesized model audio"); + let mut first = true; + let processed = + build_sentence_append_buffer(&mut first, processed, 2_400, true, true); + + assert_eq!(SENTENCE_LEAD_IN_SAMPLES, 480); + assert!( + processed[..SENTENCE_LEAD_IN_SAMPLES] + .iter() + .all(|&sample| sample == 0.0), + "the fixed device cushion must remain pure zero" + ); + assert!( + processed[SENTENCE_LEAD_IN_SAMPLES..] + .iter() + .any(|sample| sample.abs() > 0.1), + "speech energy must remain after the fixed device cushion" + ); +} diff --git a/desktop/src-tauri/src/huddle/tts_tests.rs b/desktop/src-tauri/src/huddle/tts_tests.rs index ef8391034..1908b096b 100644 --- a/desktop/src-tauri/src/huddle/tts_tests.rs +++ b/desktop/src-tauri/src/huddle/tts_tests.rs @@ -885,31 +885,6 @@ fn sentence_append_buffer_is_one_contiguous_source() { ); } -/// Regression guard: playback decoration happens after speed processing, so -/// the fixed device cushion is never time-stretched. -#[test] -fn playback_speed_preserves_production_sentence_lead_in() { - let processed = process_complete_chunk(&vec![0.5; 2_400], 1.5, SAMPLE_RATE) - .expect("process synthesized model audio"); - let mut first = true; - let processed = - build_sentence_append_buffer(&mut first, processed, 2_400, true, true); - - assert_eq!(SENTENCE_LEAD_IN_SAMPLES, 480); - assert!( - processed[..SENTENCE_LEAD_IN_SAMPLES] - .iter() - .all(|&sample| sample == 0.0), - "the fixed device cushion must remain pure zero" - ); - assert!( - processed[SENTENCE_LEAD_IN_SAMPLES..] - .iter() - .any(|sample| sample.abs() > 0.1), - "speech energy must remain after the fixed device cushion" - ); -} - // ── clamp_to_full_scale tests ───────────────────────────────────────────── /// In-range speech audio passes through bit-exact — no gain is applied.