From 8e868894cbcaf421c263f3555af4d29bef653420 Mon Sep 17 00:00:00 2001 From: salmonik Date: Sat, 5 Sep 2026 19:35:21 +0200 Subject: feat: piper now not a subprocess, cache system for TTS --- src/events/mod.rs | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'src/events') diff --git a/src/events/mod.rs b/src/events/mod.rs index e4f1b22..87333c8 100644 --- a/src/events/mod.rs +++ b/src/events/mod.rs @@ -28,15 +28,14 @@ fn format_duration(seconds: f64) -> String { } async fn play_tts_in_channel( - config: crate::config::Config, - http_client: reqwest::Client, + tts: std::sync::Arc, voice_manager: crate::voice::VoiceManager, guild_id: serenity::GuildId, channel_id: serenity::ChannelId, text: String, ) { - let audio_data = match crate::tts::synthesize(&config, &http_client, &text).await { - Ok((bytes, _)) => bytes, + let audio_data = match tts.synthesize(&text).await { + Ok(bytes) => bytes, Err(e) => { warn!("Failed to synthesize TTS: {e}"); return; @@ -51,13 +50,7 @@ async fn play_tts_in_channel( } }; - let input = match crate::voice::decode_audio(&audio_data) { - Ok(i) => i, - Err(e) => { - warn!("Failed to decode TTS audio: {e}"); - return; - } - }; + let input = crate::tts::pcm_bytes_to_input(audio_data); let mut call_lock = call.lock().await; if call_lock.current_channel().is_some() { @@ -97,6 +90,16 @@ pub async fn handle_voice_state_update( .map(|m| m.display_name().to_string()) .unwrap_or_default(); + // Pre-generate all 6 event phrases for this user (background, non-blocking). + // First event per user pays ~120ms; subsequent events are instant from cache. + { + let tts = data.tts.clone(); + let name = display_name.clone(); + tokio::spawn(async move { + tts.pre_generate(&name).await; + }); + } + let now = current_ts as f64; let user_id_str = user_id.to_string(); @@ -293,8 +296,7 @@ pub async fn handle_voice_state_update( && let Some(cid) = tts_channel.or(new_channel) { tokio::spawn(play_tts_in_channel( - data.config.clone(), - data.http_client.clone(), + data.tts.clone(), data.voice_manager.clone(), gid, cid, @@ -314,8 +316,7 @@ pub async fn handle_voice_state_update( && let Some(cid) = tts_channel.or(new_channel) { tokio::spawn(play_tts_in_channel( - data.config.clone(), - data.http_client.clone(), + data.tts.clone(), data.voice_manager.clone(), gid, cid, @@ -330,8 +331,7 @@ pub async fn handle_voice_state_update( && let Some(gid) = guild_id { tokio::spawn(play_tts_in_channel( - data.config.clone(), - data.http_client.clone(), + data.tts.clone(), data.voice_manager.clone(), gid, cid, -- cgit v1.2.3