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

使用Azure认知语音转文本.NET SDK处理长录音时缓冲溢出问题求助

解决Azure认知语音转文本长音频处理的缓冲区超时问题

针对你用.NET SDK处理60分钟录音时出现的Due to service inactivity, the client buffer exceeded the maximum size, resetting the buffer, did you update the subscription info错误,以下是可行的解决方法:

  • 确保音频流持续稳定推送
    错误本质是服务端检测到客户端长时间无数据输入,触发缓冲区溢出。如果是实时录音场景,检查录音设备是否有间歇性断流;如果是文件转写,不要一次性加载大文件再批量推送,改用流式读取+逐块推送的方式,比如每次从文件流读取4KB-32KB数据,持续推送到SDK的音频输入流,维持服务端的活动状态。

  • 调整SDK超时配置
    初始化SpeechConfig时,通过设置属性延长静默超时阈值,避免短时间无数据就触发中断:

    var speechConfig = SpeechConfig.FromSubscription("你的订阅密钥", "部署区域");
    // 设置初始静默超时为5分钟(根据实际场景调整,不要超过服务限制)
    speechConfig.SetProperty("SpeechServiceConnection_InitialSilenceTimeoutMs", "300000");
    // 设置结束静默超时,避免正常短静默触发中断
    speechConfig.SetProperty("SpeechServiceConnection_EndSilenceTimeoutMs", "10000");
    
  • 实现断点重连机制
    捕获会话停止事件,当检测到是缓冲区重置类错误时,记录当前已处理的音频位置,重新初始化识别器并从断点处继续转写。示例代码片段:

    private long _currentAudioPosition = 0;
    
    private async Task HandleRecognitionError(SessionStoppedEventArgs args)
    {
        if (args.Error?.Message.Contains("client buffer exceeded") == true)
        {
            // 从当前位置恢复转写
            await ResumeRecognition(_currentAudioPosition);
        }
    }
    
    private async Task ResumeRecognition(long resumePos)
    {
        var speechConfig = SpeechConfig.FromSubscription("你的订阅密钥", "部署区域");
        using var fileStream = new FileStream("目标音频文件.wav", FileMode.Open, FileAccess.Read);
        fileStream.Seek(resumePos, SeekOrigin.Begin);
        
        // 使用自定义音频输入流推送数据
        using var audioStream = AudioInputStream.CreatePushStream();
        using var audioConfig = AudioConfig.FromStreamInput(audioStream);
        using var recognizer = new SpeechRecognizer(speechConfig, audioConfig);
        
        // 绑定识别结果和错误处理事件
        recognizer.Recognized += (s, e) => { /* 处理识别结果,更新_currentAudioPosition */ };
        recognizer.SessionStopped += (s, e) => HandleRecognitionError(e);
        
        await recognizer.StartContinuousRecognitionAsync();
        
        // 逐块读取文件并推送
        byte[] buffer = new byte[16384];
        int bytesRead;
        while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            audioStream.Write(buffer, 0, bytesRead);
            _currentAudioPosition += bytesRead;
            await Task.Delay(10); // 模拟实时推送节奏,避免过快推送
        }
        
        await recognizer.StopContinuousRecognitionAsync();
    }
    
  • 验证订阅与区域配置
    确认订阅密钥未过期、区域与语音服务部署区域完全一致,跨区域调用会增加延迟,可能间接引发超时。可以通过Azure门户检查语音服务账户的状态,确保服务正常运行。

  • 拆分长音频为小片段
    对于超过30分钟的音频,手动或通过代码分割为多个30分钟以内的片段,分别转写后合并结果。这种方式可以规避单一会话的超时限制,降低单次失败的影响范围。

内容的提问来源于stack exchange,提问作者Upendra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:32:50