none
DictationGrammar bearbeiten? RRS feed

  • Frage

  • Hallo Forum!

    Ich erstelle derzeit ein Programm, bei dem ich unter Anderem Spracherkennung (deutsche Sprache) einsetze. Wie im Betreff zu lesen benutze ich als Grammar das DictationGrammar, habe jedoch folgende Fragen dazu, zu denen ich bisher leider keine Antwort gefunden habe:

    1.) Ist es möglich, sich den Inhalt des DictationGrammar anzeigen zu lassen?
    2.) Kann man den Inhalt irgendwie bearbeiten, also z.B. Worte hinzufügen oder löschen?

    Hintergrund ist, dass beispielsweise sehr spezielles Vokabular nicht wirklich benötige und dementsprechend gerne löschen würde, aber bisher keinerleri Möglichkeit dazu gefunden habe. Alternativ könnte ich ein eigenes Grammar erstellen, bräuchte dazu jedoch idealerweise eine entsprechende Wörterbuch Datei, vielleicht hat da jemand eine Empfehlung, was man nutzen kann?

    Grüße,
    Schubstein

    Dienstag, 19. Juli 2011 10:28

Antworten

  • Hallo Schubstein,

    http://gotspeech.net/forums/thread/8634.aspx [1]

    Using Speech Dictionaries to Improve Handwriting Recognition Results (such mal nach Adding Words to the User Dictionary by Using C# und Removing Words from the User Dictionary by Using C# und Installing an Application Dictionary)...Folge vom Link [1]
     
    Schau auch das AddPronunciation an.
      

    Falls ein Custom DictationGrammar noch in Frage kommt dann schau mal hier: Speech Recognition with C# – Dictation and Custom grammar…es wird die GrammarBuilder Klasse verwendet.

    Grüße,

    Robert

    Donnerstag, 21. Juli 2011 17:01
    Moderator
  • Hallo Schubstein,

    hier erstmal ein kleines Beispielprogramm:

     

    using System;
    using System.Drawing;
    using System.Reflection;
    using System.Speech.Recognition; //System.Speech.dll
    using System.Text;
    using System.Windows.Forms;
    
    namespace Spracherkennung
    {
     public partial class Form1 : Form
     {
     SpeechRecognitionEngine engine;
     TextBox txtInfo;
     Button btnStarteErkennung;
     Button btnStop;
    
     public Form1()
     {
      InitializeComponent();
      ControlsHinzufügen();
      SprachInitialisierung();
     }
    
     private void SprachInitialisierung()
     {
      engine = new SpeechRecognitionEngine();
      engine.SetInputToDefaultAudioDevice();
      engine.SpeechRecognized += (s, args) =>
      {
      foreach (RecognizedWordUnit wort in args.Result.Words)
      {
       if (wort.Confidence > 0.8f) // ggf. anpassen
       txtInfo.Text += wort.Text + " ";
      }
      txtInfo.Text += Environment.NewLine;
      };
     }
    
     private Grammar ErzeugeBeispielGrammatik()
     {
      Choices zusatzWörter = new Choices("Dzaebel", "Luca", "Joshua", "Eva");
      GrammarBuilder grammarBuilder = new GrammarBuilder("Start");
      grammarBuilder.Append(zusatzWörter);
      Grammar g = new Grammar(grammarBuilder);
      g.Name = "Familiennamen";
      return g;
     }
    
     private void btnStarteErkennung_Click(object sender, EventArgs e)
     {
      engine.UnloadAllGrammars();
      Grammar beispielGrammar = ErzeugeBeispielGrammatik();
      engine.LoadGrammar(beispielGrammar);
      engine.LoadGrammar(new DictationGrammar());
      AnzeigeVerfügbareGrammars(engine);
      engine.RecognizeAsync(RecognizeMode.Multiple);
     }
    
     private void AnzeigeVerfügbareGrammars(SpeechRecognitionEngine engine)
     {
      StringBuilder info = new StringBuilder();
      foreach (Grammar grammar in engine.Grammars)
      info.AppendLine("  - \"" + grammar.GetType().Name 
       + " " + grammar.Name + "\"\r\n" + GrammarBuilderElemente(grammar));
      MessageBox.Show("Grammars der Engine:\r\n" +
      info.ToString());
     }
    
     private string GrammarBuilderElemente(Grammar grammar)
     {
      FieldInfo builder = grammar.GetType().GetField("_grammarBuilder",
      BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.NonPublic);
      if (builder == null) return "";
      GrammarBuilder gb = builder.GetValue(grammar) as GrammarBuilder;
      if (gb == null) return "";
      return "   " + gb.DebugShowPhrases;
     }
    
     private void btnStop_Click(object sender, EventArgs e)
     {
      engine.RecognizeAsyncStop();
     }
    
     private void ControlsHinzufügen()
     {
      txtInfo = new TextBox();
      btnStarteErkennung = new Button();
      btnStop = new Button();
    
      txtInfo.Location = new Point(15, 53);
      txtInfo.Multiline = true;
      txtInfo.Name = "txtInfo";
      txtInfo.ScrollBars = ScrollBars.Both;
      txtInfo.Size = new Size(396, 171);
    
      btnStarteErkennung.Location = new Point(12, 12);
      btnStarteErkennung.Name = "btnStarteErkennung";
      btnStarteErkennung.Size = new Size(101, 23);
      btnStarteErkennung.TabIndex = 4;
      btnStarteErkennung.Text = "Starte Erkennung";
      btnStarteErkennung.UseVisualStyleBackColor = true;
      btnStarteErkennung.Click += btnStarteErkennung_Click;
    
      btnStop.Location = new Point(119, 12);
      btnStop.Name = "btnStop";
      btnStop.Size = new Size(38, 23);
      btnStop.TabIndex = 8;
      btnStop.Text = "Stop";
      btnStop.UseVisualStyleBackColor = true;
      btnStop.Click += btnStop_Click;
      ClientSize = new Size(420, 244);
    
      Controls.Add(btnStop);
      Controls.Add(btnStarteErkennung);
      Controls.Add(txtInfo);
      Text = "Spracherkennung mit zusätzlicher Grammar";
     }
     }
    }
    
    

    ---------------------------------------------

    Die anderen Grammars sind normal oft intern SAPI und werden oft über COM ausgelesen. 
    Obiges ist natürlich nur ein Beispiel - man könnte die Begriffe auch aus einer XML-Datei lesen, je nach Grammar-Kontruktor.


    ciao Frank
    Samstag, 23. Juli 2011 06:19
  • So, hier noch eine kurze Rückmeldung, bevor ich das Ganze vergesse.

    Ich habe ein wenig mit einer eigenen Grammar (erstellt aus dem OpenOffice Dictionary, aus dem ich verschiedene Worte herausgefiltert habe) herumexperimentiert,  und die Ergebnisse der Spracherkennung angeschaut. Im Endeffekt hat sich herausgestellt, dass das Standard DictationGrammar weitaus bessere Ergebnisse liefert, weshalb ich dieses nutze und die nicht gewünschten Worte im Nachhinein herausfiltere.

    Dienstag, 9. August 2011 09:00

Alle Antworten

  • Hallo Schubstein,

    http://gotspeech.net/forums/thread/8634.aspx [1]

    Using Speech Dictionaries to Improve Handwriting Recognition Results (such mal nach Adding Words to the User Dictionary by Using C# und Removing Words from the User Dictionary by Using C# und Installing an Application Dictionary)...Folge vom Link [1]
     
    Schau auch das AddPronunciation an.
      

    Falls ein Custom DictationGrammar noch in Frage kommt dann schau mal hier: Speech Recognition with C# – Dictation and Custom grammar…es wird die GrammarBuilder Klasse verwendet.

    Grüße,

    Robert

    Donnerstag, 21. Juli 2011 17:01
    Moderator
  • Hallo Schubstein,

    hier erstmal ein kleines Beispielprogramm:

     

    using System;
    using System.Drawing;
    using System.Reflection;
    using System.Speech.Recognition; //System.Speech.dll
    using System.Text;
    using System.Windows.Forms;
    
    namespace Spracherkennung
    {
     public partial class Form1 : Form
     {
     SpeechRecognitionEngine engine;
     TextBox txtInfo;
     Button btnStarteErkennung;
     Button btnStop;
    
     public Form1()
     {
      InitializeComponent();
      ControlsHinzufügen();
      SprachInitialisierung();
     }
    
     private void SprachInitialisierung()
     {
      engine = new SpeechRecognitionEngine();
      engine.SetInputToDefaultAudioDevice();
      engine.SpeechRecognized += (s, args) =>
      {
      foreach (RecognizedWordUnit wort in args.Result.Words)
      {
       if (wort.Confidence > 0.8f) // ggf. anpassen
       txtInfo.Text += wort.Text + " ";
      }
      txtInfo.Text += Environment.NewLine;
      };
     }
    
     private Grammar ErzeugeBeispielGrammatik()
     {
      Choices zusatzWörter = new Choices("Dzaebel", "Luca", "Joshua", "Eva");
      GrammarBuilder grammarBuilder = new GrammarBuilder("Start");
      grammarBuilder.Append(zusatzWörter);
      Grammar g = new Grammar(grammarBuilder);
      g.Name = "Familiennamen";
      return g;
     }
    
     private void btnStarteErkennung_Click(object sender, EventArgs e)
     {
      engine.UnloadAllGrammars();
      Grammar beispielGrammar = ErzeugeBeispielGrammatik();
      engine.LoadGrammar(beispielGrammar);
      engine.LoadGrammar(new DictationGrammar());
      AnzeigeVerfügbareGrammars(engine);
      engine.RecognizeAsync(RecognizeMode.Multiple);
     }
    
     private void AnzeigeVerfügbareGrammars(SpeechRecognitionEngine engine)
     {
      StringBuilder info = new StringBuilder();
      foreach (Grammar grammar in engine.Grammars)
      info.AppendLine("  - \"" + grammar.GetType().Name 
       + " " + grammar.Name + "\"\r\n" + GrammarBuilderElemente(grammar));
      MessageBox.Show("Grammars der Engine:\r\n" +
      info.ToString());
     }
    
     private string GrammarBuilderElemente(Grammar grammar)
     {
      FieldInfo builder = grammar.GetType().GetField("_grammarBuilder",
      BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.NonPublic);
      if (builder == null) return "";
      GrammarBuilder gb = builder.GetValue(grammar) as GrammarBuilder;
      if (gb == null) return "";
      return "   " + gb.DebugShowPhrases;
     }
    
     private void btnStop_Click(object sender, EventArgs e)
     {
      engine.RecognizeAsyncStop();
     }
    
     private void ControlsHinzufügen()
     {
      txtInfo = new TextBox();
      btnStarteErkennung = new Button();
      btnStop = new Button();
    
      txtInfo.Location = new Point(15, 53);
      txtInfo.Multiline = true;
      txtInfo.Name = "txtInfo";
      txtInfo.ScrollBars = ScrollBars.Both;
      txtInfo.Size = new Size(396, 171);
    
      btnStarteErkennung.Location = new Point(12, 12);
      btnStarteErkennung.Name = "btnStarteErkennung";
      btnStarteErkennung.Size = new Size(101, 23);
      btnStarteErkennung.TabIndex = 4;
      btnStarteErkennung.Text = "Starte Erkennung";
      btnStarteErkennung.UseVisualStyleBackColor = true;
      btnStarteErkennung.Click += btnStarteErkennung_Click;
    
      btnStop.Location = new Point(119, 12);
      btnStop.Name = "btnStop";
      btnStop.Size = new Size(38, 23);
      btnStop.TabIndex = 8;
      btnStop.Text = "Stop";
      btnStop.UseVisualStyleBackColor = true;
      btnStop.Click += btnStop_Click;
      ClientSize = new Size(420, 244);
    
      Controls.Add(btnStop);
      Controls.Add(btnStarteErkennung);
      Controls.Add(txtInfo);
      Text = "Spracherkennung mit zusätzlicher Grammar";
     }
     }
    }
    
    

    ---------------------------------------------

    Die anderen Grammars sind normal oft intern SAPI und werden oft über COM ausgelesen. 
    Obiges ist natürlich nur ein Beispiel - man könnte die Begriffe auch aus einer XML-Datei lesen, je nach Grammar-Kontruktor.


    ciao Frank
    Samstag, 23. Juli 2011 06:19
  • Hallo ihr beiden und vielen Dank für eure Antworten!
    Ich werde mir das Ganze mal zu Gemüte führen und mich später nochmal zurückmelden.

    Bis dahin erstmal ein schönes Wochenende!

     

    Samstag, 23. Juli 2011 07:28
  • So, hier noch eine kurze Rückmeldung, bevor ich das Ganze vergesse.

    Ich habe ein wenig mit einer eigenen Grammar (erstellt aus dem OpenOffice Dictionary, aus dem ich verschiedene Worte herausgefiltert habe) herumexperimentiert,  und die Ergebnisse der Spracherkennung angeschaut. Im Endeffekt hat sich herausgestellt, dass das Standard DictationGrammar weitaus bessere Ergebnisse liefert, weshalb ich dieses nutze und die nicht gewünschten Worte im Nachhinein herausfiltere.

    Dienstag, 9. August 2011 09:00