none
Speech Login RRS feed

  • Frage

  • Hey, ich versuche gerade in C# sich mit SpeechRecognition anzumelden.

    Also bevor sich die Form öffnet, soll die Authentifizierung statt finden. Nur leider kann ich das nicht in

            private void Form1_Load(object sender, EventArgs e)
    

    einfügen, weil EventArgs keine e.Result.Text unterstützt. Wie kann ich das so regeln das SpeechRecognizedEventArgs funktioniert ? 

    Ich hoffe ihr könnt mir helfen :D

    Samstag, 15. Februar 2014 10:41

Antworten

  • Hallo,
    Wenn der Benutzer etwas sagt, erfährst du es in SpeechRecognized. Dort musst du dir nun merken, ob der Benutzer sich angemeldet hat. Hier mal ein Code, der das in etwa macht:
    private void Form1_Load(object sender, EventArgs e)
    {
        Computer.Speak("Verifizieren");
        _recognizer.SetInputToDefaultAudioDevice();
        _recognizer.LoadGrammar(new Grammar(new GrammarBuilder(new Choices("Hallo", "User", username, "Box"))));
        _recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(_recognizer_SpeechRecognized);
        _recognizer.RecognizeAsync(RecognizeMode.Multiple);
    }
    
    private void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
    {
        if (!isLoggedIn)
        {
            //Nicht angemeldet
            if (e.Result.Text == username)
            {
                Computer.Speak("Eingeloggt");
                isLoggedIn = true;//Benutzer ist ab jetzt eingeloggt
            }
            else
            {
                Computer.Speak("Bitte sagen Sie ihren Benutzernamen!");
            }
        }
        else
        {
            //Befehle verarbeiten
            switch (e.Result.Text)
            {
                case "beenden":
                    Close();
                    break;
                case "box":
                    MessageBox.Show("Du wolltest eine Box sehen...");
                    break;
                default:
                    MessageBox.Show("Ich habe dich nicht verstanden. Sagtest du \"" + e.Result.Text + "\"?");
                    break;
            }
        }
    }
    
    bool isLoggedIn = false;//Bestimmt, ob der Benutzer eingeloggt ist
    
    string username = "Tom";//Der Benutzername für den Login
    
    SpeechSynthesizer Computer = new SpeechSynthesizer();
    SpeechRecognitionEngine _recognizer = new SpeechRecognitionEngine();
    Der Code sollte soweit verständlich sein. Sobald der Benutzer seinen Namen sagte, kann er dem Programm befehle erteilen.

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert rainb0w.x36 Montag, 17. Februar 2014 19:20
    Sonntag, 16. Februar 2014 12:30
    Moderator

Alle Antworten

  • Hallo,
    ich verstehe nicht so ganz was du vor hast. Zeige mal, wie du die Spracherkennung geplant hast. Welche API/Framework willst du dafür nutzen?

    e.Result.Text gibt es natürlich nicht, denn Form.Load hat garnichts mit Spracherkennung zu tun.
    Ich vermute mal, das du eine Klasse instanzieren musst, welche auf Spracheingaben reagiert. Von dieser Klasse kannst du dann ein Event abonnieren, welches den Text über die EventArgs bereit stellt.

    PS: Wenn du System.Speech verwendest, findest du hier ein kures Beispiel (Antowrt von Rob Segal). Dort wird auch ein Event abonniert und die Spracherkennung im Load-Event initialisiert. Das SpeechRecognized-Event wurde ebenfalls dort abonniert.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Samstag, 15. Februar 2014 11:03
    Moderator
  • Ja also, ich hab System.Speech schon. Also das Programm funktioniert ja soweit. Der Computer antwortet auf das was ich ihm sage... Aber ich wollte bevor er mir etwas antworten kann, dass er erstmal nach einem Passwort fragt.

    public Form1()
             
    {
         InitializeComponent();
    }
    
            private void Form1_Load(object sender, EventArgs e)
    {
    // hier der recognizer
    }
    
     void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
            {
    
    string speech = e.Result.Text;
                switch (speech)
    
                {
    // cases 
    }
    

    Also hier der ausschnitt. Ich hoffe es ist verständlich

     string text = e.Result.Text;
                    if (text != null)
                    {
                        if (text == "USERNAME")
                        {
    
                        }
    }

    Also so ungefähr


    • Bearbeitet rainb0w.x36 Samstag, 15. Februar 2014 12:21
    Samstag, 15. Februar 2014 12:18
  • Initialisiere im Load-Event (oder noch davor) den Recognizer. im SpeechRecognized-Event kannst du dann gucken, was der Benutzer sagte und es mit dem Passwort abgleichen.

    Wenn das Passwort korrekt ist, kannst du entsprechend die Form weiter laufen lassen. Wenn das Passwort dagegen falsch ist, kannst du es dem Benutzer mitteilen und eine weitere Spracheingabe verlangen.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Samstag, 15. Februar 2014 13:10
    Moderator
  •  void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
            {
                Computer.Speak("Verifizieren");
                if (e.Result.Text == "Username")
                {
    
                    string speech = e.Result.Text;
                    switch (speech)
                    {
                      //  CASES 
    
                            
                    }
    
                }
                else
                {
                    Computer.Speak("Falscher Username");
                    this.Close();
                }
            }
              
    Also wenn ich jetzt versuche einer der Cases zu sprechen kommt bitte verifizieren ( eigentlich so wie ich wollte) Aber er wartet gar nicht ab bis ich den Usernamen sage, sondern bricht gleich ab und sagt "Falscher Username". 
    • Als Antwort markiert rainb0w.x36 Samstag, 15. Februar 2014 13:35
    • Tag als Antwort aufgehoben rainb0w.x36 Samstag, 15. Februar 2014 13:35
    Samstag, 15. Februar 2014 13:35
  • Im Load-Event initiaisierst du den Recognizer und forderst den Benutzer auffordern sich zu verifizieren (Computer.Speak). Dann wird auch SpeechRecognzed ausgelöst und du kannst ds Gesprochene überprüfen.

    Die Befehle, was der Benutzer machen soll, dürfen nicht in das SpeechRecognized-Event. Denn sort bekommst du ja mit, das der Benutzer etwas sagte. U.u. erhälkt der Benutzer also nie eine Anweisung.

    Die Fehlermeldung "Falscher Username" musst du dagegen in diesem Event ausgeben. Wobei es hier angebracht wäre nochmal eine Verifizierung vom Benutzer zu fordern.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Samstag, 15. Februar 2014 13:56
    Moderator
  • Okay danke soweit das habe ich also:

    private void Form1_Load(object sender, EventArgs e)
            {
                Computer.Speak("Verifizieren");
                _recognizer.SetInputToDefaultAudioDevice();
                _recognizer.LoadGrammar(new Grammar(new GrammarBuilder(new Choices(File.ReadAllLines(@"Commands.txt")))));
                _recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(_recognizer_SpeechRecognized);
                _recognizer.RecognizeAsync(RecognizeMode.Multiple);
            }
    
    
     void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
            {
                string text = e.Result.Text;
                if (text != null)
                {
                if (e.Result.Text == "User")
                {
                    Computer.Speak("richtig");
                    string speech = e.Result.Text;
                    switch (speech)
                    {
                        case "Hallo":
                            Computer.Speak("Hallo");
                            break;
    }
    }
    }
    }

    Wenn ich jetzt starte, sagt er Verifizieren startet die Form, wenn ich aber User sage macht er nichts, wenn ich Hallo sage macht er aber auch nichts. Einen string habe ich in public form auch eingefügt funkt. trotzdem nicht

      public Form1()
            {
                InitializeComponent();
                str = new string[] { "User" };
                
            }
    Ich hab nicht ganz verstanden , wo sollen die Befehle hin was der Benutzer machen soll?


    • Bearbeitet rainb0w.x36 Sonntag, 16. Februar 2014 11:03
    Sonntag, 16. Februar 2014 10:59
  • Hallo,
    Wenn der Benutzer etwas sagt, erfährst du es in SpeechRecognized. Dort musst du dir nun merken, ob der Benutzer sich angemeldet hat. Hier mal ein Code, der das in etwa macht:
    private void Form1_Load(object sender, EventArgs e)
    {
        Computer.Speak("Verifizieren");
        _recognizer.SetInputToDefaultAudioDevice();
        _recognizer.LoadGrammar(new Grammar(new GrammarBuilder(new Choices("Hallo", "User", username, "Box"))));
        _recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(_recognizer_SpeechRecognized);
        _recognizer.RecognizeAsync(RecognizeMode.Multiple);
    }
    
    private void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
    {
        if (!isLoggedIn)
        {
            //Nicht angemeldet
            if (e.Result.Text == username)
            {
                Computer.Speak("Eingeloggt");
                isLoggedIn = true;//Benutzer ist ab jetzt eingeloggt
            }
            else
            {
                Computer.Speak("Bitte sagen Sie ihren Benutzernamen!");
            }
        }
        else
        {
            //Befehle verarbeiten
            switch (e.Result.Text)
            {
                case "beenden":
                    Close();
                    break;
                case "box":
                    MessageBox.Show("Du wolltest eine Box sehen...");
                    break;
                default:
                    MessageBox.Show("Ich habe dich nicht verstanden. Sagtest du \"" + e.Result.Text + "\"?");
                    break;
            }
        }
    }
    
    bool isLoggedIn = false;//Bestimmt, ob der Benutzer eingeloggt ist
    
    string username = "Tom";//Der Benutzername für den Login
    
    SpeechSynthesizer Computer = new SpeechSynthesizer();
    SpeechRecognitionEngine _recognizer = new SpeechRecognitionEngine();
    Der Code sollte soweit verständlich sein. Sobald der Benutzer seinen Namen sagte, kann er dem Programm befehle erteilen.

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert rainb0w.x36 Montag, 17. Februar 2014 19:20
    Sonntag, 16. Februar 2014 12:30
    Moderator
  • Hi,

                     

    Ist Deine Situation eigentlich abgeklärt ? Können wir den Thread schließen ? Wenn ja - bitte markiere die hilfreichen Beiträge "als Antwort".

     

    Viele Grüße,

    Ciprian


    Ciprian Bogdan, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.





    Montag, 17. Februar 2014 15:26
  • Hey, ja ist jetzt geklärt. Danke sehr :D Hast mir sehr geholfen.

    Liebe Grüße

    Montag, 17. Februar 2014 19:19