1

我的应用程序的一个用例是将语音(单个单词的话语)转换为文本。为此,我需要使用 Azure 语音来发短信。有时需要将语音转换为整数 - 例如,我需要将响应作为数量提交。我的问题是无论如何,通过 REST API,告诉语音到文本服务我想要一个数字结果吗?目前它正在返回诸如“one”而不是“1”和“free”而不是“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."
    }
  ]
}
4

2 回答 2

1

我建议使用 Microsoft 的这个nuget。它就像一个魅力,这里是一个例子。

NumberRecognizer.RecognizeNumber("I have two apples", Culture.English)
于 2020-06-05T17:26:35.833 回答
0

根据官方文件Speech-to-text REST API,没有选项可以帮助将数字单词转换为数字。

考虑到英语中的数字词在句法上有规律,可以使用一个简单的算法来实现将单词转换为数字的功能。作为参考,您可以按照下面的这些来自己用 C# 编写自己的。

  1. 在 C++ 中将单词转换为数字
  2. 在 SQL Server 中将单词翻译(转换)为数字 RRS 提要
  3. 数字中的单词

希望能帮助到你。

于 2019-08-19T07:25:07.630 回答