Bot Framework - 使用自定义语音服务错误 400 C#

Bot Framework - Using Custom Speech Service Error 400 C#

我使用机器人框架创建了一个机器人,现在我正在尝试使用 CustomSpeech 服务而不是工作正常的 bing SpeechToText 服务。我尝试了各种方法来解决问题,但出现错误 400,我不知道如何解决。

我想从 wav pcm 音频流中获取文本的方法:

    public static async Task<string> CustomSpeechToTextStream(Stream audioStream)
    {
        audioStream.Seek(0, SeekOrigin.Begin);

        var customSpeechUrl = "https://westus.stt.speech.microsoft.com/speech/recognition/interactive/cognitiveservices/v1?cid=<MyEndPointId>";
        string token;

        token = GetToken();

        HttpWebRequest request = null;
        request = (HttpWebRequest)HttpWebRequest.Create(customSpeechUrl);
        request.SendChunked = true;
        //request.Accept = @"application/json;text/xml";
        request.Method = "POST";
        request.ProtocolVersion = HttpVersion.Version11;
        request.ContentType = "audio/wav; codec=\"audio/pcm\"; samplerate=16000";
        request.Headers["Authorization"] = "Bearer " + token;

        byte[] buffer = null;
        int bytesRead = 0;
        using (Stream requestStream = request.GetRequestStream())
        {
            // Read 1024 raw bytes from the input audio file.
            buffer = new Byte[checked((uint)Math.Min(1024, (int)audioStream.Length))];
            while ((bytesRead = audioStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                requestStream.Write(buffer, 0, bytesRead);
            }

            requestStream.Flush();
        }

        string responseString = string.Empty;

        // Get the response from the service.
        using (WebResponse response = request.GetResponse()) // Here i get the error
        {
            using (StreamReader sr = new StreamReader(response.GetResponseStream()))
            {
                responseString = sr.ReadToEnd();
            }
        }

        dynamic deserializedResponse = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString);

        if (deserializedResponse.RecognitionStatus == "Success")
        {
            return deserializedResponse.DisplayText;
        }
        else
        {
            return null;
        }
    }

using (WebResponse response = request.GetResponse()){} 我遇到异常(错误 400)。

我是否以正确的方式执行 HttpWebRequest?

我在互联网上看到问题可能出在文件音频上...但是为什么使用相同的流 bing 语音服务不会 return 这个错误?

在我的例子中,问题是我有一个没有 Cris(自定义语音服务)需要的文件头的 wav 流音频。解决方案是创建一个临时文件 wav,读取文件 wav 并将其复制到 Stream 中以将其作为数组发送给 Cris

byte[] buffer = null;
int bytesRead = 0;
using (Stream requestStream = request.GetRequestStream())
{
    buffer = new Byte[checked((uint)Math.Min(1024, (int)audioStream.Length))];
    while ((bytesRead = audioStream.Read(buffer, 0, buffer.Length)) != 0)
    {
        requestStream.Write(buffer, 0, bytesRead);
    }

    requestStream.Flush();
}

或将其复制到 MemoryStream 中并将其作为数组发送

using (Stream requestStream = request.GetRequestStream())
{
    requestStream.Write(audioStream.ToArray(), 0, audioStream.ToArray().Length);
    requestStream.Flush();
}