【问题标题】:Azure speech to text with numbersAzure 语音到带有数字的文本
【发布时间】:2019-12-21 17:42:13
【问题描述】:

我的应用程序的一个用例是将语音(单个单词的表达)转换为文本。为此,我需要使用 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."
    }
  ]
}

【问题讨论】:

    标签: azure azure-cognitive-services azure-speech


    【解决方案1】:

    我建议使用来自 Microsoft 的 nuget。它就像一个魅力,here 一个例子。

    NumberRecognizer.RecognizeNumber("I have two apples", Culture.English)
    

    【讨论】:

    • 太棒了——我一定会去看看的!谢谢。
    • 它是LUIS 背后的库,因此您可以在文档中看到它能够处理很多有趣的东西(例如转换和规范化日期)。如果您对此解决方案满意,请您将我的回复标记为答案吗?
    【解决方案2】:

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

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

    1. Converting words to numbers in c++
    2. SQL Server 中的Translate (Convert) Words to Numbers RRS feed
    3. Words in Numbers

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2023-01-31
      • 2019-05-10
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 2021-02-26
      • 2011-08-06
      相关资源
      最近更新 更多