leo arellano Ответов: 1

Я хочу сделать распознавание голоса, но я хочу сделать это без использования выбора команды или даже текстового файла в качестве источника команды


Я хочу сделать распознавание голоса, но я хочу сделать это без использования выбора команды или даже текстового файла в качестве источника команды. Я думаю, что мне нужно добавить словарь, но я не знаю, как это сделать. Я также хочу, чтобы мой ИИ считал от 1 до 10 или от 1 до чего-то еще.

Что я уже пробовал:

using System;
using System.IO;
using System.Speech.Recognition;
using System.Speech.Synthesis;
using System.Windows.Forms;

namespace SpeechWindowsForms
{
    public partial class Form1 : Form
    {
        SpeechRecognitionEngine _recognizer = new SpeechRecognitionEngine();
        SpeechSynthesizer JARVIS = new SpeechSynthesizer();
        string QEvent;
        string ProcWindow;
        double timer = 10;
        int count = 1;
        Random rnd = new Random();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            _recognizer.SetInputToDefaultAudioDevice();
            _recognizer.LoadGrammar(new Grammar(new GrammarBuilder(new Choices(File.ReadAllLines(@"txt file location")))));
            _recognizer.SpeechRecognized += new EventHandler<speechrecognizedeventargs>(_recognizer_SpeechRecognized);
            _recognizer.RecognizeAsync(RecognizeMode.Multiple);
        }

        void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            int ranNum = rnd.Next(1, 10);
            string speech = e.Result.Text;
            switch (speech)
            {
                //GREETINGS
                case "hello":
                case "hello jarvis":
                    if (ranNum < 6) { JARVIS.Speak("Hello sir"); }
                    else if (ranNum > 5) { JARVIS.Speak("Hi"); }
                    break;
                case "goodbye":
                case "goodbye jarvis":
                case "close":
                case "close jarvis":
                    JARVIS.Speak("Until next time");
                    Close();
                    break;
                case "jarvis":
                    if (ranNum < 5) { QEvent = ""; JARVIS.Speak("Yes sir"); }
                    else if (ranNum > 4) { QEvent = ""; JARVIS.Speak("Yes?"); }
                    break;
                //WEBSITES
                case "open website":
                    System.Diagnostics.Process.Start("url");
                    break;
                //SHELL COMMANDS
                case "open program":
                    System.Diagnostics.Process.Start("file location");
                    JARVIS.Speak("Loading");
                    break;
                //CLOSE PROGRAMS
                case "close program":
                    ProcWindow = "process name";
                    StopWindow();
                    break;
                //CONDITION OF DAY
                case "what time is it":
                    DateTime now = DateTime.Now;
                    string time = now.GetDateTimeFormats('t')[0];
                    JARVIS.Speak(time);
                    break;
                case "what day is it":
                    JARVIS.Speak(DateTime.Today.ToString("dddd"));
                    break;
                case "whats the date":
                case "whats todays date":
                    JARVIS.Speak(DateTime.Today.ToString("dd-MM-yyyy"));
                    break;

                //OTHER COMMANDS
                case "go fullscreen":
                    FormBorderStyle = FormBorderStyle.None;
                    WindowState = FormWindowState.Maximized;
                    TopMost = true;
                    JARVIS.Speak("expanding");
                    break;
                case "exit fullscreen":
                    FormBorderStyle = FormBorderStyle.Sizable;
                    WindowState = FormWindowState.Normal;
                    TopMost = false;
                    break;
                case "switch window":
                    SendKeys.Send("%{TAB " + count + "}");
                    count += 1;
                    break;
                case "reset":
                    count = 1;
                    timer = 11;
                    lblTimer.Visible = false;
                    ShutdownTimer.Enabled = false;
                    lstCommands.Visible = false;
                    break;
                case "out of the way":
                    if (WindowState == FormWindowState.Normal || WindowState == FormWindowState.Maximized)
                    {
                        WindowState = FormWindowState.Minimized;
                        JARVIS.Speak("My apologies");
                    }
                    break;
                case "come back":
                    if (WindowState == FormWindowState.Minimized)
                    {
                        JARVIS.Speak("Alright?");
                        WindowState = FormWindowState.Normal;
                    }
                    break;
                case "show commands":
                    string[] commands = (File.ReadAllLines(@"txt file location"));
                    JARVIS.Speak("Very well");
                    lstCommands.Items.Clear();
                    lstCommands.SelectionMode = SelectionMode.None;
                    lstCommands.Visible = true;
                    foreach (string command in commands)
                    {
                        lstCommands.Items.Add(command);
                    }
                    break;
                case "hide listbox":
                    lstCommands.Visible = false;
                    break;        
            }
        }
    }
}

CHill60

Каков ваш реальный вопрос?

leo arellano

Как использовать словарь или импортировать словарь для команды, я имею в виду, что я не хочу использовать txt-файл или выбор в качестве команды

OriginalGriff

Мы более чем готовы помочь тем, кто застрял, но это не значит, что мы здесь, чтобы сделать все это для вас! Мы не можем сделать всю работу, вам либо платят за это, либо это часть ваших оценок, и было бы совсем несправедливо, если бы мы сделали все это за вас.

Поэтому нам нужно, чтобы вы сделали работу, и мы поможем вам, когда вы застряли. Это не значит, что мы дадим вам пошаговое решение, которое вы можете сдать!
Начните с объяснения, где вы находитесь в данный момент и каков следующий шаг в этом процессе. Затем расскажите нам, что вы пытались сделать, чтобы этот следующий шаг сработал, и что произошло, когда вы это сделали.

leo arellano

Лол Бру я уже застрял в этой части 😂
Но, во-первых, мне не платят за то, что lol делает такой код похожим на то, что ему платят, а во-вторых, я просто хочу импортировать словарь для команд, но не знаю, с чего мне начать.
Им кстати просто самостоятельно изучая 😁

1 Ответов

Рейтинг:
2

Pete O'Hanlon

Читая ваш вопрос, я собираюсь сделать здесь некоторые предположения.

1. Вы хотите удалить команды из оператора switch.
2. Вы все еще хотите, чтобы команды set выполнялись, поэтому, когда вы говорите "what time is it", вы все еще хотите, чтобы операция внутри соответствующего оператора case выполнялась.

Если это верно, то мы можем перейти к нескольким вариантам в качестве примера.

Первый подход заключается в том, что у вас будет словарь, где ключом является фраза и с ней связано действие, которое код выполняет соответствующим образом. Что-то вроде этого, возможно:

public class SynthesisMapper
{
  private readonly Dictionary<string, Action> mappings = new Dictionary<string, Action>();
  public void AddMapping(string command, Action operation)
  {
    mappings.Add(command, operation);
  }

  public void Do(string text)
  {
    if (mappings.ContainsKey(text))
    {
      mappings[text].Invoke();
    }
  }
}
Вы бы добавили команды к этому и вызвали его, используя что-то вроде этого:
private SynthesisMapper synthesis = new SynthesisMapper();

private void AddCommands()
{
  synthesis.Add("open program", () =>
  {
    System.Diagnostics.Process.Start("file location");
    JARVIS.Speak("Loading");
  });
  // And so on......
}

void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
  synthesis.Do(e.Result.Text);
}
Теперь второй подход работает как вариация этого. Вместо того чтобы хранить текст и команды внутри программы, вы будете работать с системой, основанной на плагинах. При этом вы бы разделили каждую команду на свои собственные сборки, которые вы можете "обнаружить" во время выполнения - посмотрите примеры плагинов на этом сайте, чтобы получить примеры того, как это может работать.