2015-11-22 7 views
6

माइक्रोसॉफ्ट। स्टेच एसडीके में DTMFRecognitionEngine वर्ग है, जिसे मैं प्रयोग करना चाहता हूं - हमें डब्लूएवी फ़ाइल के भीतर डीटीएमएफ टोन का पता लगाने की आवश्यकता है (मुझे एहसास है कि अन्य तरीके हैं ऐसा करो, लेकिन मैं सभी संभावित तरीकों का मूल्यांकन कर रहा हूं)।माइक्रोसॉफ्ट में डीटीएमएफ रिकॉग्निशनइंजिन क्लास का उपयोग कैसे करें। स्पीच

प्रलेखन वास्तव में कक्षा का उपयोग करने के तरीके पर स्पष्ट नहीं है: यह साथी वर्ग, SpeechRecognitionEngine है, इसमें SetInputToWaveFile जैसे कई उदाहरण और अच्छी स्पष्ट विधियां हैं। में ऐसी कोई विधियां नहीं हैं।

क्या कोई इस बात का अंतर्दृष्टि प्रदान कर सकता है कि मैं अपने कोड में इस घटक का उपयोग कैसे कर सकता हूं?

संपादित करें: ऐसा प्रतीत होता है कि इस वर्ग का उपयोग करने के लिए कोई रास्ता नहीं है ... अच्छा, वास्तव में कुछ भी। मैं एक पुस्तकालय की तलाश में हूं जो मुझे ऑडियो फाइल में डीटीएमएफ अंकों की स्थिति और अवधि का पता लगाने की अनुमति देगा। मैंने TapiEx पर देखा है, लेकिन वे ईमेल का जवाब नहीं दे रहे हैं। अगर किसी के पास कोई अन्य सुझाव है, तो उन्हें आभारी रूप से प्राप्त किया जाएगा ...

+0

... और, सीधे, के लिए एक करीबी वोट "बहुत व्यापक" होने के नाते। यह सुनिश्चित नहीं है कि मैं किसी भी "संकुचित" प्रश्न को कैसे बना सकता हूं, वास्तविक दस्तावेज को एक सुराग नहीं देता है? ऐसा लगता है कि मैं केवल एकमात्र नहीं हूं: http://www.codeproject.com/Questions/423912/How-to-detect-a-DTMF- ध्वनि – KenD

+0

मुझे लगता है कि मुश्किल हिस्सा सिर्फ स्रोत स्रोत के लिए सीधे पूछ रहा है। हो सकता है कि इस सवाल को फिर से भरने का एक तरीका है जहां आप इसे थोड़ा कम कर सकते हैं, "कोई मुझे कृपया कोड दें" और कुछ और पसंद है, "क्या कोई इस बात को अंतर्दृष्टि प्रदान कर सकता है कि यह हिस्सा कैसे काम करता है?" ' –

+1

हो गया , धन्यवाद। :) – KenD

उत्तर

1

ऐसा लगता है कि यह संभव नहीं है। मैं अब भी डीटीएमएफ रिकॉग्निशनइंजिन की निजी _engine प्राप्त करने के लिए गया था, जो स्पीच रिकॉग्निशनइंजिन का एक रैपर है और बिना किसी किस्मत के अपने SetInputToWaveFile को कॉल करें। स्पष्ट रूप से DtmfRecognitionEngine में टोन प्राप्त करने का एकमात्र तरीका AddTone() को कॉल करना है। मैंने एक नमूना व्याकरण फ़ाइल और कुछ स्रोत कोड शामिल किया है जिसके साथ आप खेल सकते हैं। दिलचस्प बात यह है कि अगर आप ड्रे को अनदेखा करते हैं। AddTone() आप दोनों sre की घटनाओं को देखते हैं और ड्रे की घटनाओं को निकाल दिया जा रहा है।

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

आपको डीटीएमएफ टोन के साथ अपनी स्वयं की डब्ल्यूएवी फ़ाइल की आवश्यकता होगी, मुझे लगा कि आपके पास पहले से ही था ... –

+0

मुझे डर था कि यह मामला होगा। मैंने TapiEx से घटक को देखा है, लेकिन वे उन ईमेल का जवाब नहीं दे रहे हैं जो मुझे चिंतित करते हैं ... मैं मूल प्रश्न अपडेट करूंगा: क्या कोई भी ऐसी लाइब्रेरी सुझा सकता है जो डीटीएमएफ टोन का पता लगा सके (उन्हें हटाने के लिए, तो मुझे स्वर की सटीक स्थिति _ और durations_ की आवश्यकता है)? – KenD

संबंधित मुद्दे