2015-11-22 15 views
6

Microsoft.Speech SDK ha una classe DTMFRecognitionEngine, che mi piacerebbe sperimentare: dobbiamo rilevare i toni DTMF in un file WAV (mi rendo conto che ci sono altri modi per fai questo, ma sto valutando tutti i metodi possibili).Come utilizzare la classe DTMFRecognitionEngine in Microsoft.Speech

La documentazione non è chiara su come utilizzare effettivamente la classe: è la classe di accompagnamento, SpeechRecognitionEngine, ha un sacco di esempi e bei metodi chiari come SetInputToWaveFile. non ha nessuno di questi metodi.

Qualcuno può fornire informazioni su come posso utilizzare questo componente nel mio codice?

MODIFICA: Sembra che non ci sia modo di usare questa classe per ... beh, tutto molto molto. Sto cercando una libreria che mi consenta di rilevare la posizione e la durata delle cifre DTMF in un file audio. Ho guardato allo TapiEx, ma non rispondono alle e-mail. Se qualcuno ha qualche altro suggerimento, lo riceveranno con gratitudine ...

+0

... e, subito, un voto vicino per essere "troppo ampio". Non sono sicuro di come sia possibile rendere la domanda più "ristretta", data la documentazione vera e propria, che non fornisce molti indizi? Sembra che non sia l'unico: http://www.codeproject.com/Questions/423912/How-to-detect-a-DTMF-sound – KenD

+0

Penso che la parte difficile sia solo chiedere direttamente un esempio di fonte. Forse c'è un modo per riformulare questa domanda in cui è possibile renderlo un po 'meno simile, "Qualcuno per favore dammi codice" e qualcosa di più simile a "Qualcuno potrebbe fornire una panoramica su come funziona questa parte?" " –

+1

Fatto , Grazie. :) – KenD

risposta

1

Sembrerebbe che questo non sia possibile. Sono persino arrivato al punto di ottenere la _engine privata di DtmfRecognitionEngine che è un wrapper di SpeechRecognitionEngine e chiama il suo SetInputToWaveFile senza fortuna. Apparentemente l'unico modo per ottenere un tono nel DtmfRecognitionEngine è chiamare AddTone(). Ho incluso un file di grammatica di esempio e un codice sorgente con cui puoi giocare. È interessante notare che se disattivi il file dre.AddTone() vedi gli eventi di entrambe le sre e gli eventi di dre vengono licenziati.

Cambiare la chiamata a sre.RecognizeAsync() non è di aiuto.

Sembra che avrete bisogno di una libreria diversa ...

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> 

Fonte:

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

Avrai bisogno del tuo file WAV con toni DTMF, immaginavo che avessi già quello ... –

+0

Avevo paura che fosse il caso. Ho esaminato il componente di TapiEx, ma non rispondono alle e-mail che mi preoccupano ... aggiornerò la domanda originale: qualcuno può suggerire una libreria in grado di rilevare i toni DTMF (al fine di rimuoverli, quindi ho bisogno di posizioni esatte _e durate_ del tono)? – KenD