如何在Microsoft.Speech中使用DTMFRecognitionEngine类

肯德

Microsoft.Speech SDK有一个DTMFRecognitionEngine类,我想对其进行试验-我们需要检测WAV文件中的DTMF音(我知道还有其他方法可以这样做,但是我正在评估所有可能的方法)。

关于如何实际使用该类的文档尚不清楚:它是伴随类SpeechRecognitionEngine,具有大量示例和漂亮的清晰方法(如)SetInputToWaveFileDTMFRecognitionEngine没有任何这样的方法。

有人可以提供有关如何在自己的代码中使用此组件的见解吗?

编辑:看来,没有任何方法可以使用此类...好吧,真的很多。我正在寻找一个允许我检测音频文件中DTMF数字的位置和持续时间的库。我看过TapiEx,但他们没有回复电子邮件。如果有人有其他建议,我们将不胜感激。

粘土见瓦伦

看来这是不可能的。我什至还获得了DtmfRecognitionEngine的私有_engine,它是SpeechRecognitionEngine的包装器,没有运气就调用了它的SetInputToWaveFile。显然,向DtmfRecognitionEngine发出提示音的唯一方法是调用AddTone()。我提供了一个示例语法文件和一些可以使用的源代码。有趣的是,如果取消对dre.AddTone()的注释,则将看到sre的事件和dre的事件都被触发。

将呼叫切换到sre.RecognizeAsync()无济于事。

看来您需要一个不同的库...

PinGrammar.xml

<?xml version="1.0"?>
<grammar mode="dtmf" version="1.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.w3.org/2001/06/grammar 
                             http://www.w3.org/TR/speech-grammar/grammar.xsd"
         xmlns="http://www.w3.org/2001/06/grammar"
         root="pin">

  <rule id="digit">
    <one-of>
      <item> 0 </item>
      <item> 1 </item>
      <item> 2 </item>
      <item> 3 </item>
      <item> 4 </item>
      <item> 5 </item>
      <item> 6 </item>
      <item> 7 </item>
      <item> 8 </item>
      <item> 9 </item>
    </one-of>
  </rule>

  <rule id="pin" scope="public">
    <one-of>
      <item>
        <item repeat="4">
          <ruleref uri="#digit"/>
        </item>
        #
      </item>
      <item>
        * 9
      </item>
    </one-of>
  </rule>

</grammar>

来源:

using Microsoft.Speech.Recognition;
using System.Reflection;

namespace DTMF_Recognition
{
    class Program
    {
        static void Main(string[] args)
        {
            Grammar grammar = null;
            grammar = new Grammar("PinGrammar.xml");

            DtmfRecognitionEngine dre = new DtmfRecognitionEngine();
            dre.DtmfRecognized += dre_DtmfRecognized;

            FieldInfo field = typeof(DtmfRecognitionEngine).GetField("_engine", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
            var wrapper = field.GetValue(dre);
            FieldInfo engineField = wrapper.GetType().GetField("_engine", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
            SpeechRecognitionEngine sre = (SpeechRecognitionEngine)engineField.GetValue(wrapper);

            dre.DtmfHypothesized += dre_DtmfHypothesized;
            dre.DtmfRecognitionRejected += dre_DtmfRecognitionRejected;
            dre.RecognizeCompleted += dre_RecognizeCompleted;
            dre.LoadGrammar(grammar);

            //dre.AddTone(DtmfTone.One);
            //dre.AddTone(DtmfTone.Two);
            //dre.AddTone(DtmfTone.Three);
            //dre.AddTone(DtmfTone.Four);
            //dre.AddTone(DtmfTone.Hash);

            sre.SetInputToWaveFile(@"C:\Users\Clay Ver Valen\Desktop\3.wav");
            sre.SpeechHypothesized += sre_SpeechHypothesized;
            sre.SpeechDetected += sre_SpeechDetected;
            sre.SpeechRecognitionRejected += sre_SpeechRecognitionRejected;

            dre.RecognizeAsync();
            System.Threading.Thread.Sleep(30000);
        }

        static void sre_SpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e)
        {
            int i = 1;
        }

        static void sre_SpeechHypothesized(object sender, SpeechHypothesizedEventArgs e)
        {
            int i = 1;
        }

        static void sre_SpeechDetected(object sender, SpeechDetectedEventArgs e)
        {
            int i = 1;
        }

        static void dre_DtmfRecognitionRejected(object sender, DtmfRecognitionRejectedEventArgs e)
        {
            int i = 1;
        }

        static void dre_DtmfHypothesized(object sender, DtmfHypothesizedEventArgs e)
        {
            int i = 1;
        }

        static void dre_RecognizeCompleted(object sender, DtmfRecognizeCompletedEventArgs e)
        {
            int i = 1;
        }

        static void dre_DtmfRecognized(object sender, DtmfRecognizedEventArgs e)
        {
            int i = 1;
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Mac中使用Microsoft Edge?

来自分类Dev

如何在Sandboxie中使用Microsoft Edge?

来自分类Dev

如何在Ubuntu中使用Microsoft Maren?

来自分类Dev

如何在类中使用 If

来自分类Dev

如何在Microsoft Edge中使用Bootstrap Datepicker

来自分类Dev

如何在Java中使用Microsoft Bot Framework渲染降价?

来自分类Dev

如何在多租户环境中使用Microsoft Graph?

来自分类Dev

如何在React Native中使用Firebase实施Microsoft登录?

来自分类Dev

如何在Selinum Java中使用Microsoft Edge

来自分类Dev

如何在Microsoft Edge中使用Bootstrap Datepicker

来自分类Dev

如何在加载项中使用Microsoft图标?

来自分类Dev

如何在Microsoft Bot Framework中使用全局命令?

来自分类Dev

如何在PHP中正确实现Microsoft Text to Speech

来自分类Dev

如何在类中使用模块方法?

来自分类Dev

如何在类变量中使用@available

来自分类Dev

如何在Python中使用ITK类

来自分类Dev

如何在Asynctask类中使用Intent?

来自分类Dev

如何在类中使用cv :: setMouseCallback?

来自分类Dev

如何在鞋类中使用类?

来自分类Dev

如何在类中使用线程?

来自分类Dev

如何在Talend中使用Java类

来自分类Dev

如何在MonoDevelop中使用BigInteger类?

来自分类Dev

如何在类文件中使用IHostingEnvironment

来自分类Dev

如何在类组件中使用useMediaQuery

来自分类Dev

如何在函数中使用类变量?

来自分类Dev

如何在Typescript类中使用yield

来自分类Dev

如何在类变量中使用@available

来自分类Dev

如何在PHP中使用Snoopy类

来自分类Dev

如何在Java中使用LinkedList类?