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

Azure Speech SDK发音评估始终返回AccuracyScore=0求助

Azure Speech SDK发音评估AccuracyScore始终为0的问题排查与修复

问题描述

我尝试在代码中使用Azure Speech SDK添加发音评估功能,代码实现如下:

public static AudioConfig CreateAudioConfigFromBytes(byte[] audioBytes)
{
    var audioStream = new MemoryStream(audioBytes);

    var pushStream = AudioInputStream.CreatePushStream();

    pushStream.Write(audioBytes);
    pushStream.Close();

    var audioConfig = AudioConfig.FromStreamInput(pushStream);
    return audioConfig;
}


public async Task<float> AssessPronunciation(byte[] audioBytes, string referenceText)
{
    string subscriptionKey = Environment.GetEnvironmentVariable("STT_API_KEY");

    var pronunciationAssessmentConfig = new PronunciationAssessmentConfig(
        referenceText: referenceText,
        gradingSystem: GradingSystem.HundredMark,
        granularity: Granularity.Phoneme,
        enableMiscue: false);

    var audioConfig = CreateAudioConfigFromBytes(audioBytes);
    var speechConfig = SpeechConfig.FromSubscription(subscriptionKey, "eastus");

    using (var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig))
    {
        pronunciationAssessmentConfig.ApplyTo(speechRecognizer);
        var speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();

        // The pronunciation assessment result as a Speech SDK object
        var pronunciationAssessmentResult = PronunciationAssessmentResult.FromResult(speechRecognitionResult);

        // The pronunciation assessment result as a JSON string
        var pronunciationAssessmentResultJson = speechRecognitionResult.Properties.GetProperty(PropertyId.SpeechServiceResponse_JsonResult);
    }
}

测试时,无论发音正确与否,始终得到AccuracyScore = 0。例如测试单词“school”,正确发音和错误发音(说“pajama”)两次结果均为0。但在Azure门户中测试功能正常:正确发音“school”得分超90,错误发音“pajama”得分为2。

问题原因与修复方案

1. PushStream被提前关闭

CreateAudioConfigFromBytes方法中,写入音频字节后立刻调用pushStream.Close(),导致SpeechRecognizer尝试读取流时已无法获取数据,识别失败后返回的得分自然为0。PushStream必须保持打开状态,直到SpeechRecognizer完成识别。

修复后的CreateAudioConfigFromBytes:

public static AudioConfig CreateAudioConfigFromBytes(byte[] audioBytes)
{
    var pushStream = AudioInputStream.CreatePushStream();
    pushStream.Write(audioBytes);
    // 不要手动关闭流,SpeechRecognizer会在识别完成后处理
    return AudioConfig.FromStreamInput(pushStream);
}

2. 未检查识别结果状态

代码中没有判断识别是否成功,如果流提前关闭或音频格式错误,speechRecognitionResult.Reason会是ResultReason.NoMatch或其他失败状态,此时生成的发音评估结果得分就是0,必须添加状态校验。

3. 方法未返回得分

原方法声明返回float,但代码末尾没有返回AccuracyScore,这是语法错误,同时也导致无法获取正确结果。

4. 音频格式不匹配(潜在问题)

Azure Speech SDK要求音频为16kHz采样率、16位单声道PCM(WAV格式),如果你的音频字节不符合这个格式,识别会失败。可以显式指定音频格式避免问题:

public static AudioConfig CreateAudioConfigFromBytes(byte[] audioBytes)
{
    // 指定符合要求的音频格式
    var audioFormat = AudioFormat.GetWaveFormatPCM(16000, 16, 1);
    var pushStream = AudioInputStream.CreatePushStream(audioFormat);
    pushStream.Write(audioBytes);
    return AudioConfig.FromStreamInput(pushStream);
}

修复后的完整代码

public static AudioConfig CreateAudioConfigFromBytes(byte[] audioBytes)
{
    var audioFormat = AudioFormat.GetWaveFormatPCM(16000, 16, 1);
    var pushStream = AudioInputStream.CreatePushStream(audioFormat);
    pushStream.Write(audioBytes);
    return AudioConfig.FromStreamInput(pushStream);
}

public async Task<float> AssessPronunciation(byte[] audioBytes, string referenceText)
{
    string subscriptionKey = Environment.GetEnvironmentVariable("STT_API_KEY");
    var pronunciationAssessmentConfig = new PronunciationAssessmentConfig(
        referenceText: referenceText,
        gradingSystem: GradingSystem.HundredMark,
        granularity: Granularity.Phoneme,
        enableMiscue: false);

    var audioConfig = CreateAudioConfigFromBytes(audioBytes);
    var speechConfig = SpeechConfig.FromSubscription(subscriptionKey, "eastus");

    using (var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig))
    {
        pronunciationAssessmentConfig.ApplyTo(speechRecognizer);
        var speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();

        // 检查识别是否成功
        if (speechRecognitionResult.Reason != ResultReason.RecognizedSpeech)
        {
            // 可根据实际需求处理失败场景,比如日志记录或抛出异常
            Console.WriteLine($"识别失败: {speechRecognitionResult.Reason}");
            return 0;
        }

        var pronunciationAssessmentResult = PronunciationAssessmentResult.FromResult(speechRecognitionResult);
        // 返回正确的发音准确度得分
        return pronunciationAssessmentResult.AccuracyScore;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:27:02