You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 04:22:38