Load the VAD when model loads in parallel (#1177)

Co-authored-by: CJ Pais <cj@cjpais.com>
This commit is contained in:
Jackson 2026-03-28 22:15:45 -07:00 committed by GitHub
parent 5bf7646609
commit 7ed8a558f2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 32 additions and 19 deletions

View file

@ -368,14 +368,21 @@ impl ShortcutAction for TranscribeAction {
// Load model in the background
let tm = app.state::<Arc<TranscriptionManager>>();
let rm = app.state::<Arc<AudioRecordingManager>>();
// Load ASR model and VAD model in parallel
tm.initiate_model_load();
let rm_clone = Arc::clone(&rm);
std::thread::spawn(move || {
if let Err(e) = rm_clone.preload_vad() {
debug!("VAD pre-load failed: {}", e);
}
});
let binding_id = binding_id.to_string();
change_tray_icon(app, TrayIconState::Recording);
show_recording_overlay(app);
let rm = app.state::<Arc<AudioRecordingManager>>();
// Get the microphone mode to determine audio feedback timing
let settings = get_settings(app);
let is_always_on = settings.always_on_microphone;

View file

@ -263,6 +263,25 @@ impl AudioRecordingManager {
}
}
pub fn preload_vad(&self) -> Result<(), anyhow::Error> {
let mut recorder_opt = self.recorder.lock().unwrap();
if recorder_opt.is_none() {
let vad_path = self
.app_handle
.path()
.resolve(
"resources/models/silero_vad_v4.onnx",
tauri::path::BaseDirectory::Resource,
)
.map_err(|e| anyhow::anyhow!("Failed to resolve VAD path: {}", e))?;
*recorder_opt = Some(create_audio_recorder(
vad_path.to_str().unwrap(),
&self.app_handle,
)?);
}
Ok(())
}
pub fn start_microphone_stream(&self) -> Result<(), anyhow::Error> {
let mut open_flag = self.is_open.lock().unwrap();
if *open_flag {
@ -276,23 +295,6 @@ impl AudioRecordingManager {
let mut did_mute_guard = self.did_mute.lock().unwrap();
*did_mute_guard = false;
let vad_path = self
.app_handle
.path()
.resolve(
"resources/models/silero_vad_v4.onnx",
tauri::path::BaseDirectory::Resource,
)
.map_err(|e| anyhow::anyhow!("Failed to resolve VAD path: {}", e))?;
let mut recorder_opt = self.recorder.lock().unwrap();
if recorder_opt.is_none() {
*recorder_opt = Some(create_audio_recorder(
vad_path.to_str().unwrap(),
&self.app_handle,
)?);
}
// Get the selected device from settings, considering clamshell mode
let settings = get_settings(&self.app_handle);
let selected_device = self.get_effective_microphone_device(&settings);
@ -309,6 +311,10 @@ impl AudioRecordingManager {
}
}
// Ensure VAD is loaded if it wasn't for whatever reason
self.preload_vad()?;
let mut recorder_opt = self.recorder.lock().unwrap();
if let Some(rec) = recorder_opt.as_mut() {
rec.open(selected_device)
.map_err(|e| anyhow::anyhow!("Failed to open recorder: {}", e))?;