如何用Azure Speech to Text服务Go SDK解决超时并实现语言检测与转写?
问题解决方案
一、解决超时问题
你的超时核心原因是误用了识别方法:RecognizeOnceAsync仅针对15秒以内的短音频,如果音频时长超过这个限制,必然会触发超时或无法返回完整结果。需要切换为连续识别模式:
替换为连续识别逻辑
修改代码,用StartContinuousRecognitionAsync启动识别,并通过事件回调接收结果:
func recognizingHandler(event speech.SpeechRecognitionEventArgs) { defer event.Close() fmt.Printf("识别中: %s\n", event.Result.Text) } func recognizedHandler(event speech.SpeechRecognitionEventArgs) { defer event.Close() if event.Result.Reason == speech.ResultReasonRecognizedSpeech { fmt.Printf("识别完成: %s\n", event.Result.Text) // 获取检测到的语言 if lang, ok := event.Result.Properties.GetProperty(speech.PropertyIdSpeechServiceConnectionRecognitionLanguage); ok { fmt.Printf("检测到语言: %s\n", lang) } } else if event.Result.Reason == speech.ResultReasonNoMatch { fmt.Printf("无匹配结果: %v\n", event.Result.NoMatchDetails) } } func sessionStoppedHandler(event speech.SessionEventArgs) { defer event.Close() fmt.Println("会话结束 (ID=", event.SessionID, ")") done <- struct{}{} } var done = make(chan struct{}) func main() { speechKey := os.Getenv("SPEECH_KEY") speechRegion := os.Getenv("SPEECH_REGION") file := "./OSR_us_000_0010_8k.wav" audioConfig, err := audio.NewAudioConfigFromWavFileInput(file) if err != nil { fmt.Printf("创建音频配置失败: %v\n", err) return } defer audioConfig.Close() config, err := speech.NewSpeechConfigFromSubscription(speechKey, speechRegion) if err != nil { fmt.Printf("创建语音配置失败: %v\n", err) return } defer config.Close() // 启用自动语言检测,指定候选语言列表 config.SetProperty(speech.PropertyIdSpeechServiceConnectionAutoDetectSourceLanguages, "en-US,zh-CN") speechRecognizer, err := speech.NewSpeechRecognizerFromConfig(config, audioConfig) if err != nil { fmt.Printf("创建语音识别器失败: %v\n", err) return } defer speechRecognizer.Close() speechRecognizer.SessionStarted(sessionStartedHandler) speechRecognizer.Recognizing(recognizingHandler) speechRecognizer.Recognized(recognizedHandler) speechRecognizer.SessionStopped(sessionStoppedHandler) // 启动连续识别 err = speechRecognizer.StartContinuousRecognitionAsync() if err != nil { fmt.Printf("启动识别失败: %v\n", err) return } // 等待识别结束 <-done // 停止识别 err = speechRecognizer.StopContinuousRecognitionAsync() if err != nil { fmt.Printf("停止识别失败: %v\n", err) return } }
二、实现语言检测功能
要开启自动语言检测,只需在SpeechConfig中配置候选语言列表,然后在识别结果中提取检测到的语言:
- 配置候选语言:
// 支持多语言候选,用逗号分隔,按需调整 config.SetProperty(speech.PropertyIdSpeechServiceConnectionAutoDetectSourceLanguages, "en-US,zh-CN")
- 在
recognizedHandler中获取检测结果:
if lang, ok := event.Result.Properties.GetProperty(speech.PropertyIdSpeechServiceConnectionRecognitionLanguage); ok { fmt.Printf("检测到语言: %s\n", lang) }
三、额外排查点
- 音频格式检查:确保WAV文件为PCM编码,推荐使用16kHz、16位单声道格式(8kHz格式虽支持,但可能影响识别效率)。
- 环境变量验证:确认
SPEECH_KEY和SPEECH_REGION配置正确,区域需与你的Azure Speech服务所在区域完全一致。 - 短音频场景调整:如果确实是15秒以内的短音频仍超时,可延长
time.After的等待时长,但优先推荐使用连续识别模式适配多数场景。
内容的提问来源于stack exchange,提问作者djy
相关产品推荐
相关产品推荐

