Bot Framework - Ошибка при использовании настраиваемой речевой службы - PullRequest
0 голосов
/ 27 июня 2018

Я создал бота с бот-фреймворком, и теперь я пытаюсь использовать службу 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?

Я читал в интернете, что, возможно, проблема в аудио-файле ... но почему же с тем же сервисом Stream bing речь не возвращает эту ошибку?

1 Ответ

0 голосов
/ 29 июня 2018

В моем случае проблема заключалась в том, что у меня было аудио в формате wav, в котором не было заголовка файла, который нужен Cris (Custom Speech Service). Sulution создает временный файл WAV, прочитайте файл WAV и скопируйте его в поток, чтобы отправить его в виде массива в 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();
}
...