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

如何用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中配置候选语言列表,然后在识别结果中提取检测到的语言:

  1. 配置候选语言:
// 支持多语言候选,用逗号分隔,按需调整
config.SetProperty(speech.PropertyIdSpeechServiceConnectionAutoDetectSourceLanguages, "en-US,zh-CN")
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 16:39:21