2015-11-22 11 views
6

Das Microsoft.Speech SDK hat eine DTMFRecognitionEngine Klasse, mit der ich gerne experimentieren würde - wir müssen DTMF Töne innerhalb einer WAV Datei erkennen (ich weiß, dass es andere Möglichkeiten gibt Mach das, aber ich evaluiere alle möglichen Methoden).Wie man die DTMFRecognitionEngine Klasse in Microsoft.Speech verwendet

Die Dokumentation ist nicht klar, wie man die Klasse tatsächlich verwendet: es ist Companion-Klasse, SpeechRecognitionEngine, hat viele Beispiele und schöne klare Methoden wie SetInputToWaveFile. hat keine solchen Methoden.

Könnte jemand einen Einblick geben, wie ich diese Komponente in meinem eigenen Code verwenden kann?

EDIT: Es scheint, dass es keine Möglichkeit gibt, diese Klasse für ... na ja, alles viel wirklich zu verwenden. Ich suche nach einer Bibliothek, mit der ich die Position und Dauer von DTMF-Ziffern in einer Audiodatei erkennen kann. Ich habe mir TapiEx angesehen, aber sie reagieren nicht auf E-Mails. Wenn jemand andere Vorschläge hat, würden sie dankbar empfangen werden ...

+0

... und sofort eine enge Abstimmung für "zu breit" sein. Ich bin mir nicht sicher, wie ich die Frage "enger" stellen kann, da die eigentliche Dokumentation nicht viel Ahnung hat. Es scheint, dass ich nicht der einzige bin: http://www.codeproject.com/Questions/423912/How-to-detect-a-DTMF-sound – KenD

+0

Ich denke, der schwierige Teil ist nur direkt nach einem Quellbeispiel zu fragen. Vielleicht gibt es eine Möglichkeit, diese Frage anders zu formulieren, wo man es irgendwie weniger so machen kann: "Jemand gibt mir Code" und etwas mehr wie "Kann jemand einen Einblick geben, wie dieser Teil funktioniert?" ' –

+1

Fertig , Vielen Dank. :) – KenD

Antwort

1

Es scheint, dass dies nicht möglich ist. Ich bin sogar so weit gegangen, die private _engine von DtmfRecognitionEngine, die ein Wrapper ist, die SpeechRecognitionEngine zu bekommen und ihre SetInputToWaveFile ohne Glück zu nennen. Anscheinend ist die einzige Möglichkeit, einen Ton in die DtmfRecognitionEngine zu bekommen, AddTone() aufzurufen. Ich habe eine Beispiel-Grammatikdatei und einen Quellcode hinzugefügt, mit dem Sie spielen können. Interessanterweise, wenn Sie die dre.AddTone() 'auskommentieren, sehen Sie beide Ereignisse von sre und die Ereignisse von dre werden gefeuert.

Das Umschalten auf sre.RecognizeAsync() hilft nicht.

Sieht aus wie Sie eine andere Bibliothek ...

PinGrammar.xml benötigen

<?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> 

Quelle:

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; 
     } 
    } 
} 
+0

Sie werden Ihre eigene WAV-Datei mit DTMF-Tönen brauchen, ich dachte, Sie hätten das schon ... –

+0

Ich hatte Angst, dass das der Fall wäre. Ich habe die Komponente von TapiEx angeschaut, aber sie reagieren nicht auf E-Mails, die mich beunruhigen ... Ich werde die ursprüngliche Frage aktualisieren: Kann jemand eine Bibliothek vorschlagen, die DTMF-Töne erkennen kann (um sie zu entfernen, also brauche ich genaue Positionen und Dauer des Tons)? – KenD