2015-02-16 5 views
5

Ich verwende MSDN SpeechRecognitionEngine in meinem Programm. Das Problem ist, dass Hintergrundgeräusche als Sprache erkannt werden.SpeechRecognition erkennt Hintergrundgeräusche als Sprache

Zum Beispiel, wenn schnappen meine Finger, tippen Sie auf den Tisch, oder bewegen Sie meinen Stuhl, es nimmt das als Sprache.

Warum in der Welt Dosis Hintergrundgeräusche als Sprache erkennen.

Ich schnappe meine Finger Dosis nicht das gleiche wie ich sage "Notepad" !!!

Hier ist der Code

using System; 
using System.Threading; 
using System.Speech; 
using System.Speech.Synthesis; 
using System.Speech.Recognition; 

namespace SpeachTest 
{ 
    public class MainClass 
    { 
     static void Main() 
     { 
     MainClass main = new MainClass(); 
     SpeechRecognitionEngine sre = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US")); 
      Choices choiceList = new Choices(); 
      choiceList.Add(new string[]{"Open", "Close", "Then", "Volume", "Up", "Firefox", "Notepad", "Steam","turn", "the", "now" }); 

      GrammarBuilder builder = new GrammarBuilder(); 
      builder.Append(choiceList); 
      Grammar grammar = new Grammar(new GrammarBuilder(builder,0, 10)); 

      sre.SpeechRecognized += main.sreRecognizedEvent; 
      sre.SpeechDetected += main.sreDetectEvent; 
      sre.SpeechRecognitionRejected += main.sreRejectEvent; 
      sre.RecognizeCompleted += main.sreCompleteEvent; 

      sre.InitialSilenceTimeout = TimeSpan.FromSeconds(0); 
      sre.BabbleTimeout = TimeSpan.FromSeconds(0); 
      sre.EndSilenceTimeout = TimeSpan.FromSeconds(0); 
      sre.EndSilenceTimeoutAmbiguous = TimeSpan.FromSeconds(0); 


      sre.SetInputToDefaultAudioDevice(); 
      sre.LoadGrammar(grammar); 

      while(true){ 
      sre.Recognize(); 
      } 
     } 


     void sreRecognizedEvent(Object sender, SpeechRecognizedEventArgs e){ 
     Console.Write("Reconized ~ " + e.Result.Text + " ~ with confidence " + e.Result.Confidence); 
     Console.WriteLine(); 
     } 


     void sreDetectEvent(Object sender, SpeechDetectedEventArgs e){ 
     Console.WriteLine("Detected some type of input"); 
     } 

     void sreRejectEvent(Object sender, SpeechRecognitionRejectedEventArgs e){ 
     Console.WriteLine("Rejected Input ~ " + e.Result.Text) ; 
     } 

     void sreCompleteEvent(Object sender, System.Speech.Recognition.RecognizeCompletedEventArgs e){ 
     Console.WriteLine("Completed Recongnization"); 
     } 
} 

} 
+0

Wenn Sie die Dokumente lesen, sieht es so aus, als ob Sie sich die Eigenschaften BabbleTimeout, InitialSilenceTimeout, EndSilenceTimeout und EndSilenceTimeoutAmbigny ansehen könnten. –

+0

Nur aktualisierten Code und alle diese Eigenschaft auf 0 gesetzt. Hat nichts geändert – JackBarn

+0

@JackBarn Warum hast du 0 für 'BabbleTimeout' versucht? Ich habe andere nicht überprüft, aber für 'BabbleTimeout' ist 0 der Standardwert. Was passiert für Werte über ein paar Sekunden? – Mehraban

Antwort

1

Es stellte sich heraus, dass meine Mikrofonempfindlichkeit zu hoch war. sehr, sehr hoch um genau zu sein. Es war bei 100, was bedeutet, dass es die kleinsten Töne (wie Hintergrundgeräusche) aufnehmen würde.

Meine Vermutung ist, dass diese kleinen Töne in einem so hohen Grad verstärkt werden würden, dass die SpeechRecognitionEngine Schwierigkeit haben würde, sie von der tatsächlichen Sprache zu unterscheiden.

Um die Empfindlichkeit auf 20 oder 30 zu reduzieren, war das der Trick. enter image description here

4

keine Filteralgorithmen vermeiden, können Sie die Confidence Eigenschaft überprüfen, die Sie im Moment sind die Anzeige. Es liegt zwischen 0.0 und 1.0, wobei 1 sehr zuversichtlich ist. Ich finde 0.7 funktioniert gut, aber Sie können mit Versuch und Irrtum herumspielen.

void sreRecognizedEvent(Object sender, SpeechRecognizedEventArgs e) 
{ 
    if(e.Result.Confidence >= 0.7) 
    { 
     Console.Write("Reconized ~ " + e.Result.Text + " ~ with confidence " + e.Result.Confidence); 
     Console.WriteLine(); 
    }   
} 
+0

Ich habe das schon ausprobiert. Die meiste Zeit erkennt es, dass ich ein Wort sage und ein Hintergrundgeräusch mit ungefähr der gleichen Sicherheit. Etwa 0,90 bis 0,95. – JackBarn

+1

Überprüfen Sie, ob die Mikrofoneinstellungen in Ihrem System korrekt sind. Vielleicht hast du es zu empfindlich. – keyboardP

+0

Ja. Das Verringern der Empfindlichkeit meiner Mikrofone zeigte eine wesentliche Verbesserung der Genauigkeit. Es war bei 100, aber ich habe es jetzt auf 20 reduziert. Es gibt immer noch gelegentlich falsche Positive (immer noch sehr irritierend, aber es wird für jetzt tun) – JackBarn

1

Was und wie stark Nichtsprachlaute von einem Erkenner zurückgewiesen werden, unterscheidet sich stark von Erkenner zu Erkenner. Meine Erfahrung mit dem Microsoft-Erkenner ist, dass es sehr bemüht ist, Wörter zu finden. Zum Beispiel mit DragonDictate oder Google Web-Erkennung können Sie Ihre Finger schnappen oder husten und sie werden abgelehnt. Auch der Microsoft-Erkenner verfolgt aggressiv den Audiopegel. Wenn er also viel Ruhe hört, simuliert er intern die Verstärkung, indem er die Erkennungsschwellen herunterskaliert. (Ich habe das Rascheln von Papieren oder den Klang der Klimaanlage als menschliche Sprache erkannt.)

Eine Lösung, die ich seit vielen Jahren mit großem Erfolg verwende, ist etwas kontraintuitiv. Sie müssen Ihr eigenes "Müll" -Sprachmodell hinzufügen. Da Sie nur eine Liste von Wörtern und keine ausgefeilte Grammatik verwenden, sollte dies gut funktionieren und leicht zu machen sein.

Sie hören gerade: "Open", "Close", "Dann", "Volume", "Up", "Firefox", "Notepad", "Steam", "drehen", "the" , "jetzt"

Sie sollten zu der Liste hinzufügen (die Sie hören) einige Wörter, die etwas sind (aber nicht zu) ähnlich. Zum Beispiel wird das Hinzufügen von "Schürze" und "passieren" effektiv Honigfallen in der Nähe des Wortes "offen" sein. Sie können mehr darauf vertrauen, dass die Person tatsächlich "offen" sagt, wenn sie als Ergebnis angezeigt wird. Wenn Sie mehrere kurze Wörter hinzufügen, die nichts mit Ihren Befehlswörtern zu tun haben, werden Sie außerdem mehr Nichtsprachlaute hören. Ich vermute, dass "Tippen" wahrscheinlich erkannt wird, wenn Sie mit den Fingern schnippen.

Zusammengefasst: Erkennen Sie diese längere Liste von Wörtern, aber handeln Sie nur, wenn sie in Ihrer Befehlsliste stehen. Wenn Sie in Ihrem Code eine case-Anweisung verwenden, ist das absurd einfach. Verzweigen Sie nur auf Ihre Befehle. Ansonsten müssen Sie gegen die "gute" Liste testen.

Hinweis: Diese Technik funktioniert auch, wenn Sie eine komplexere Erkennung mithilfe einer Spracherkennungsgrammatik durchführen. Sie setzen einfach alle diese "Müll" -Sätze unter eine Grammatikregel namens "Müll" und Sie können jede Äußerung zurückweisen, die von dieser Regel erkannt wurde.