Android14下Maui连续语音识别出现SpeechRecognizer.ErrorServerDisconnected问题求助
解决SpeechRecognizer.ErrorServerDisconnected问题的方案
1. 错误触发时销毁并重建SpeechRecognizer实例
当捕获到ErrorServerDisconnected错误时,旧的SpeechRecognizer实例已与系统语音服务失去有效连接,复用会导致后续请求持续失败。修改错误回调逻辑,主动销毁旧实例并标记需要重建:
Error = ex => { if (ex == SpeechRecognizer.ErrorServerDisconnected) { // 销毁旧实例释放资源 speechRecognizer?.Destroy(); speechRecognizer = null; taskResult.TrySetException(new Exception("语音服务连接断开,请重试")); } else { taskResult.TrySetException(new Exception("语音引擎出错 - " + ex)); } },
2. 每次启动识别前强制校验实例有效性
不要依赖全局复用的实例,每次调用识别前,先检查实例状态,若已标记失效则重新创建:
// 替换原有的实例初始化逻辑 if (speechRecognizer is null) { // 若之前实例被销毁,重新创建 speechRecognizer = SpeechRecognizer.CreateSpeechRecognizer(Android.App.Application.Context); } if (speechRecognizer is null) { throw new ArgumentException("语音识别器不可用"); }
3. 完善资源释放逻辑
在应用进入后台、长时间闲置或停止识别时,主动清理SpeechRecognizer资源,避免无效连接占用:
public void CleanupSpeechResources() { speechRecognizer?.Cancel(); speechRecognizer?.Destroy(); speechRecognizer = null; }
可在页面Disappearing事件、服务OnDestroy方法中调用该清理方法。
4. 添加有限重试机制
在出现断开错误时自动重试一次(避免无限循环),减少用户手动操作成本:
private async Task<string> PerformSpeechRecognition(CultureInfo culture, CancellationToken cancellationToken, int retryLeft = 1) { try { var taskResult = new TaskCompletionSource<string>(); listener = new SpeechRecognitionListener { Error = ex => { if (ex == SpeechRecognizer.ErrorServerDisconnected) { speechRecognizer?.Destroy(); speechRecognizer = null; } taskResult.TrySetException(new Exception("语音引擎出错 - " + ex)); }, PartialResults = sentence => recognitionResult?.Report(sentence), Results = sentence => taskResult.TrySetResult(sentence) }; if (speechRecognizer is null) speechRecognizer = SpeechRecognizer.CreateSpeechRecognizer(Android.App.Application.Context); if (speechRecognizer is null) throw new ArgumentException("语音识别器不可用"); speechRecognizer.Cancel(); speechRecognizer.SetRecognitionListener(listener); speechRecognizer.StartListening(CreateSpeechIntent(culture)); await using (cancellationToken.Register(() => { StopRecording(); taskResult.TrySetCanceled(); })) { int timeout = 10000; var completedTask = await Task.WhenAny(taskResult.Task, Task.Delay(timeout)); if (completedTask == taskResult.Task) { return await taskResult.Task; } else { throw new TimeoutException("语音识别操作超时"); } } } catch (Exception ex) { if (retryLeft > 0 && ex.Message.Contains("连接断开")) { return await PerformSpeechRecognition(culture, cancellationToken, retryLeft - 1); } throw; } }
问题根源
SpeechRecognizer.ErrorServerDisconnected是由于系统语音服务与应用的长连接超时或异常中断导致的,此时旧实例无法自动重建连接,必须销毁后重新创建新实例才能恢复功能。之前的实例复用逻辑导致重启前台服务时,无效连接依然存在,只有完全重启进程才能彻底清除无效实例。
内容的提问来源于stack exchange,提问作者Vladimir B
相关产品推荐
相关产品推荐

