使用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
相关产品推荐
相关产品推荐

