fix(audio): create CoreML/ONNX VAD worker on backend switch

Root cause: when VadBackend::SileroOnnx was selected, the capture
callback set the worker to None but never called try_new() to create
a replacement. The desktop path (engine.rs) correctly calls
SileroOnnxVadWorker::try_new(), but the iOS (CoreML) and Android
(ONNX) mobile paths only cleared the old worker without spawning a
new one. The VAD stayed stuck at 'warming up' forever, using the
WebRTC fallback for all voice activity detection.

Fix:
- iOS: call AppleCoreMlVadWorker::try_new() when SileroOnnx backend
  is selected; mark fallback only on failure
- Android: call SileroOnnxVadWorker::try_new() with the model bundle
  path when SileroOnnx backend is selected; same fallback logic
This commit is contained in:
Edison Jwa
2026-06-10 19:56:36 +09:00
parent 5ef0eee3f1
commit 7d6328db0f
2 changed files with 19 additions and 6 deletions
+10 -3
View File
@@ -354,9 +354,16 @@ impl AndroidCaptureState {
self.fallback_warned_backend = None;
match vad_backend {
crate::VadBackend::SileroOnnx => {
self.silero_vad_worker = None;
self.mark_vad_fallback_active(crate::VadBackend::SileroOnnx);
self.audio_processing_stats.set_vad_fallback_active(true);
let model_path = crate::vad::silero_model_bundle_path();
self.silero_vad_worker =
crate::vad::silero_onnx::SileroOnnxVadWorker::try_new(&model_path);
if self.silero_vad_worker.is_some() {
self.fallback_warned_backend = None;
self.audio_processing_stats.set_vad_fallback_active(false);
} else {
self.mark_vad_fallback_active(crate::VadBackend::SileroOnnx);
self.audio_processing_stats.set_vad_fallback_active(true);
}
}
_ => {
self.silero_vad_worker = None;
+9 -3
View File
@@ -351,9 +351,15 @@ impl IosCaptureState {
self.current_vad_backend = vad_backend;
self.fallback_warned_backend = None;
if vad_backend == crate::VadBackend::SileroOnnx {
self.silero_coreml_worker = None;
self.mark_vad_fallback_active(crate::VadBackend::SileroOnnx);
self.audio_processing_stats.set_vad_fallback_active(true);
self.silero_coreml_worker =
crate::vad::apple_coreml::AppleCoreMlVadWorker::try_new();
if self.silero_coreml_worker.is_some() {
self.fallback_warned_backend = None;
self.audio_processing_stats.set_vad_fallback_active(false);
} else {
self.mark_vad_fallback_active(crate::VadBackend::SileroOnnx);
self.audio_processing_stats.set_vad_fallback_active(true);
}
} else {
self.silero_coreml_worker = None;
self.audio_processing_stats.set_vad_fallback_active(false);