Load the VAD when model loads in parallel (#1177)
Co-authored-by: CJ Pais <cj@cjpais.com>
This commit is contained in:
parent
5bf7646609
commit
7ed8a558f2
2 changed files with 32 additions and 19 deletions
|
|
@ -368,14 +368,21 @@ impl ShortcutAction for TranscribeAction {
|
||||||
|
|
||||||
// Load model in the background
|
// Load model in the background
|
||||||
let tm = app.state::<Arc<TranscriptionManager>>();
|
let tm = app.state::<Arc<TranscriptionManager>>();
|
||||||
|
let rm = app.state::<Arc<AudioRecordingManager>>();
|
||||||
|
|
||||||
|
// Load ASR model and VAD model in parallel
|
||||||
tm.initiate_model_load();
|
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();
|
let binding_id = binding_id.to_string();
|
||||||
change_tray_icon(app, TrayIconState::Recording);
|
change_tray_icon(app, TrayIconState::Recording);
|
||||||
show_recording_overlay(app);
|
show_recording_overlay(app);
|
||||||
|
|
||||||
let rm = app.state::<Arc<AudioRecordingManager>>();
|
|
||||||
|
|
||||||
// Get the microphone mode to determine audio feedback timing
|
// Get the microphone mode to determine audio feedback timing
|
||||||
let settings = get_settings(app);
|
let settings = get_settings(app);
|
||||||
let is_always_on = settings.always_on_microphone;
|
let is_always_on = settings.always_on_microphone;
|
||||||
|
|
|
||||||
|
|
@ -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> {
|
pub fn start_microphone_stream(&self) -> Result<(), anyhow::Error> {
|
||||||
let mut open_flag = self.is_open.lock().unwrap();
|
let mut open_flag = self.is_open.lock().unwrap();
|
||||||
if *open_flag {
|
if *open_flag {
|
||||||
|
|
@ -276,23 +295,6 @@ impl AudioRecordingManager {
|
||||||
let mut did_mute_guard = self.did_mute.lock().unwrap();
|
let mut did_mute_guard = self.did_mute.lock().unwrap();
|
||||||
*did_mute_guard = false;
|
*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
|
// Get the selected device from settings, considering clamshell mode
|
||||||
let settings = get_settings(&self.app_handle);
|
let settings = get_settings(&self.app_handle);
|
||||||
let selected_device = self.get_effective_microphone_device(&settings);
|
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() {
|
if let Some(rec) = recorder_opt.as_mut() {
|
||||||
rec.open(selected_device)
|
rec.open(selected_device)
|
||||||
.map_err(|e| anyhow::anyhow!("Failed to open recorder: {}", e))?;
|
.map_err(|e| anyhow::anyhow!("Failed to open recorder: {}", e))?;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue