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:
@@ -354,10 +354,17 @@ impl AndroidCaptureState {
|
|||||||
self.fallback_warned_backend = None;
|
self.fallback_warned_backend = None;
|
||||||
match vad_backend {
|
match vad_backend {
|
||||||
crate::VadBackend::SileroOnnx => {
|
crate::VadBackend::SileroOnnx => {
|
||||||
self.silero_vad_worker = None;
|
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.mark_vad_fallback_active(crate::VadBackend::SileroOnnx);
|
||||||
self.audio_processing_stats.set_vad_fallback_active(true);
|
self.audio_processing_stats.set_vad_fallback_active(true);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
self.silero_vad_worker = None;
|
self.silero_vad_worker = None;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -351,9 +351,15 @@ impl IosCaptureState {
|
|||||||
self.current_vad_backend = vad_backend;
|
self.current_vad_backend = vad_backend;
|
||||||
self.fallback_warned_backend = None;
|
self.fallback_warned_backend = None;
|
||||||
if vad_backend == crate::VadBackend::SileroOnnx {
|
if vad_backend == crate::VadBackend::SileroOnnx {
|
||||||
self.silero_coreml_worker = None;
|
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.mark_vad_fallback_active(crate::VadBackend::SileroOnnx);
|
||||||
self.audio_processing_stats.set_vad_fallback_active(true);
|
self.audio_processing_stats.set_vad_fallback_active(true);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
self.silero_coreml_worker = None;
|
self.silero_coreml_worker = None;
|
||||||
self.audio_processing_stats.set_vad_fallback_active(false);
|
self.audio_processing_stats.set_vad_fallback_active(false);
|
||||||
|
|||||||
Reference in New Issue
Block a user