Selbst programmierter Sprachassistent versteht undeutliche Sprache?


01.06.2020, 12:35
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Speech.Recognition;
using System.Speech.Synthesis;


namespace Jarvis_1._0
{
  public partial class Form1 : Form
  {
    SpeechRecognitionEngine h = new SpeechRecognitionEngine();
    SpeechSynthesizer s = new SpeechSynthesizer();

    Random rnd = new Random();

    public Form1()
    {
      InitializeComponent();
      timer1.Start();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

      Choices commands = new Choices();
      commands.Add(new string[] { "hallo", "wie geht es dir", "wie spät ist es", "welcher tag ist heute", "magst du dich einmal vorstellen" });

       

      GrammarBuilder gbuilder = new GrammarBuilder();
      gbuilder.Append(commands);

      Grammar grammar = new Grammar(gbuilder);

      h.LoadGrammar(grammar);
      h.SetInputToDefaultAudioDevice();
      h.SpeechRecognized += recEngine_SpeechRecognized;

      h.RecognizeAsync(RecognizeMode.Multiple);
      s.SelectVoiceByHints(VoiceGender.Male, VoiceAge.Adult);
      s.SpeakAsync("Wie kann ich ihnen behilflich sein sir");

    }

    void recEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)

    {
      switch (e.Result.Text)
      {
        case "hallo":
          s.SpeakAsync("hallo ");
          break;

        case "wie geht es dir":
          s.SpeakAsync("gut und dir");
          break;

        case "wie spät ist es":
          s.SpeakAsync(DateTime.Now.ToString("HH:mm:ss tt"));
          break;

        case "welcher tag ist heute":
          s.SpeakAsync(DateTime.Now.ToString("d"));
          break;
        case "magst du dich einmal vorstellen":
          s.SpeakAsync("Hallo.Ich werde Jarvis genannt und bin ein von karlo programmierter Sprachassistent");
          break;
      }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
      lbl_Time.Text = DateTime.Now.ToLongTimeString();
      lbl_Date.Text = DateTime.Now.ToLongDateString();
    }
  }
}

2 Antworten

Ich denke, die naheliegendste Option wäre es zunächst, das Mikrofon zu prüfen und dessen Lautstärke / Weitreiche zu erhöhen.

Die Microsoft Speech API bietet zudem für Klassen wie RecognizedPhrase (u.ä.) ein Property Confidence, über welches eine Gewichtung über die erkannten Wörter durchgeführt werden könnte. Das heißt, die am besten erkannten Wörter bekommen eine höhere Priorisierung. So könntest du die Eingaben priorisieren.

Grundsätzlich lassen sich Wörter nach ihrer Aussprache mit einem phonetischen Algorithmus indizieren. Ein paar bekanntere solcher Art wären Soundex oder für deutsche Wörter das Kölner Verfahren. Microsoft hat dazu auch ein eigenes Projekt veröffentlicht.

Des Weiteren gibt es Methoden (wie die Levenshtein Distance), um den Unterschied zwischen zwei Wörtern zu berechnen (Wie viele Operationen braucht es maximal, um ein Wort A in ein Wort B umzuwandeln?).

Hallo,

an deiner Stelle würde ich noch einen prefix einprogrammieren, da der Code sehr oft auch bei anderen Commands wie die die in dem Array stehen aktiviert wird. Außerdem würde ich noch ein paar weitere Commands hinzufügen. Du hast außerdem ein paar Zeilen etwas umständlich geschrieben. (ps. passe das Script aus dem Internet das nächste mal etwas mehr an.)

Woher ich das weiß:Hobby