使用Azure Speech SDK Go版流式语音转文字遇超时的解决方法
解决Azure Speech SDK Go语言流输入语音转文字超时问题
以下是针对你代码中问题的具体修复方案:
写完数据后必须关闭推送流
Speech SDK会持续等待音频输入,若不主动关闭流,服务端会因等待更多数据触发超时。在Write操作后添加关闭逻辑:err = audioInputStream.Write(audioBytes[44:]) if err != nil { fmt.Println("write :", err) return } // 关键:告知SDK音频流已结束 audioInputStream.Close()明确指定音频格式
默认创建的流格式可能与你的音频数据不匹配,导致SDK无法解析有效数据进而超时。根据你的音频实际参数(比如16kHz单声道16位PCM)创建对应格式:// 按实际音频格式配置,示例为16kHz、16位、单声道PCM audioFormat, err := audio.NewAudioFormat(audio.SampleRate16KHz, audio.BitsPerSample16, audio.Channel1) if err != nil { fmt.Println("Create audio format err:", err) return } // 使用指定格式创建推送流 audioInputStream, err2 := audio.CreatePushAudioInputStreamFromFormat(audioFormat)需确保该格式与你去掉44字节WAV头后的PCM数据完全一致。
调整识别客户端超时参数
若音频较长或网络延迟高,可通过SpeechConfig延长超时时间:speechConfig, err := speech.NewSpeechConfigFromSubscription("你的订阅密钥", "服务区域") if err != nil { fmt.Println("Create speech config err:", err) return } // 设置连接超时(单位:毫秒,示例30秒) speechConfig.SetProperty(speech.PropertySpeechConnectionTimeout, "30000") // 设置识别超时(示例60秒) speechConfig.SetProperty(speech.PropertySpeechRecognitionTimeout, "60000")验证音频数据完整性
确认audioBytes[44:]是有效PCM数据:- 检查原音频是否为无压缩的WAV格式(若为MP3等压缩格式,需先解码为PCM)
- 验证解码后的字节长度是否符合格式要求(比如16kHz单声道16位PCM,每秒对应32000字节)
补全完整识别流程
确保你已实现完整的识别逻辑,启动识别并等待结果:recognizer, err := speech.NewSpeechRecognizerFromConfig(speechConfig, audioConfig) if err != nil { fmt.Println("Create recognizer err:", err) return } defer recognizer.Close() // 启动单次识别并等待结果 result, err := recognizer.RecognizeOnceAsync().WaitForCompletion() if err != nil { fmt.Println("Recognition err:", err) return } // 处理识别结果 switch result.Reason { case speech.ResultReasonRecognizedSpeech: fmt.Println("识别结果:", result.Text) case speech.ResultReasonNoMatch: fmt.Println("无匹配结果:", result.NoMatchDetails) case speech.ResultReasonCanceled: cancelDetails := result.CanceledDetails fmt.Println("识别取消:", cancelDetails.Reason) if cancelDetails.Reason == speech.CancelReasonError { fmt.Println("错误详情:", cancelDetails.ErrorDetails) } }
内容的提问来源于stack exchange,提问作者wcu
相关产品推荐
相关产品推荐

