Лазурная речь в текст с числами

Пример использования моего приложения - преобразование речи (высказывания из одного слова) в текст. Для этого мне нужно использовать речь Azure для текста. Иногда речь нужно преобразовать в целое число - например, мне нужно отправить ответ в виде количества. Мой вопрос: есть ли в любом случае через REST API передать речь текстовой службе, что мне нужен числовой результат? В настоящее время он возвращает такие вещи, как «один» вместо «1» и «бесплатно» вместо «3». Я не думаю, что есть способ сделать это из документации, но я хотел узнать, решил ли кто-нибудь еще эту проблему, прежде чем я придумаю способ ее решения. Это код, который я использую в своем экспериментальном проекте:

 public static async Task SpeechToTextAsync(MemoryStream data, ISpeechResultCallback callBack)
    {
        string accessToken = await Authentication.GetAccessToken();

        IToast toastWrapper = DependencyService.Get<IToast>();

        if (accessToken != null)
        {
            toastWrapper.Show("Acquired token");
            callBack.SpeechReturned("Acquired token");
            using (var client = new HttpClient())
            {
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://westus.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=en-GB&format=detailed");

                request.SendChunked = true;
                request.Accept = @"application/json;text/xml";
                request.Method = "POST";
                request.ProtocolVersion = HttpVersion.Version11;
                request.Host = "westus.stt.speech.microsoft.com";
                request.ContentType = @"audio/wav; codecs=audio/pcm; samplerate=16000";
                // request.Headers["Ocp-Apim-Subscription-Key"] = Program.SubscriptionKey;
                request.Headers.Add("Authorization", "Bearer " + accessToken);
                request.AllowWriteStreamBuffering = false;

                data.Position = 0;
                byte[] buffer = null;
                int bytesRead = 0;
                using (Stream requestStream = request.GetRequestStream())
                {

                    buffer = new Byte[checked((uint)Math.Min(1024, (int)data.Length))];
                    while ((bytesRead = data.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        requestStream.Write(buffer, 0, bytesRead);
                    }

                    // Flush
                    requestStream.Flush();
                }

                try
                {
                    string responseData = null;
                    using (WebResponse response = request.GetResponse())
                    {
                        var encoding = Encoding.GetEncoding(((HttpWebResponse)response).CharacterSet);

                        using (var responseStream = response.GetResponseStream())
                        {
                            using (var reader = new StreamReader(responseStream, encoding))
                            {
                                responseData = reader.ReadToEnd();

                                AzureSTTResults deserializedProduct = JsonConvert.DeserializeObject<AzureSTTResults>(responseData);

                                if(deserializedProduct == null || deserializedProduct.NBest == null || deserializedProduct.NBest.Length == 0)
                                {
                                    toastWrapper.Show("No results");
                                    callBack.SpeechReturned("No results");
                                }
                                else
                                {
                                    toastWrapper.Show(deserializedProduct.NBest[0].ITN);
                                    callBack.SpeechReturned(deserializedProduct.NBest[0].ITN);
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    toastWrapper.Show(ex.Message);
                    callBack.SpeechReturned(ex.Message);
                }

            }
        }
        else
        {
            toastWrapper.Show("No token required");
            callBack.SpeechReturned("No token required");
        }
    }

А вот пример результата, который я хотел бы получить «1»:

{
 "RecognitionStatus": "Success",
  "Offset": 0,
  "Duration": 22200000,
  "NBest": [
    {
      "Confidence": 0.43084684014320374,
      "Lexical": "one",
      "ITN": "One",
      "MaskedITN": "One",
      "Display": "One."
    }
  ]
}

person David Christopher Reynolds    schedule 15.08.2019    source источник


Ответы (2)


Я предлагаю использовать этот nuget от Microsoft. Это работает как шарм, пример здесь.

NumberRecognizer.RecognizeNumber("I have two apples", Culture.English)
person user2297037    schedule 05.06.2020
comment
Потрясающе - я обязательно это проверю! Спасибо. - person David Christopher Reynolds; 05.06.2020
comment
Это библиотека, лежащая в основе LUIS, поэтому, как вы можете видеть в документации, она может интересные вещи (например, преобразование и нормализация дат). Если вас устраивает это решение, не могли бы вы отметить мой ответ как ответ? - person user2297037; 07.06.2020

Согласно официальному документу Speech-to-text REST API нет никакой возможности помочь преобразовать числовые слова в числа.

Учитывая, что числовые слова в английском языке имеют шаблон в синтаксисе, вы можете использовать простой алгоритм для реализации функции преобразования слов в числа. В качестве ссылок вы можете следовать этим нижеприведенным ссылкам, чтобы самостоятельно написать свой собственный на C #.

  1. Преобразование слов в числа в C ++
  2. Перевести (преобразовать) слова в числа RRS-канал в SQL Server
  3. Слова в числах

Надеюсь, это поможет.

person Peter Pan    schedule 19.08.2019