Проблемы с распознаванием речи - PullRequest
2 голосов
/ 11 июля 2011

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

using System.Speech.Recognition;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Create a new SpeechRecognizer instance.
            sr = new SpeechRecognizer();

            // Create a simple grammar that recognizes "red", "green", or "blue".
            Choices colors = new Choices();
            colors.Add("red");
            colors.Add("green");
            colors.Add("blue");
            colors.Add("white");

            GrammarBuilder gb = new GrammarBuilder();
            gb.Append(colors);

            // Create the actual Grammar instance, and then load it into the speech recognizer.
            Grammar g = new Grammar(gb);
            sr.LoadGrammar(g);

            // Register a handler for the SpeechRecognized event.
            sr.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sr_SpeechRecognized);
        }


        // Simple handler for the SpeechRecognized event.
        private void sr_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            MessageBox.Show(e.Result.Text);
        }    

        private SpeechRecognizer sr;
    }

Теперь из этого кода, когда я говорю красным цветом, я получаю красный цвет в окне сообщения, теперь я хочу управлять двигателями, поэтому мне нужно общаться с моими роботами, поэтому я СДЕЛАНО ОДНОМ КОНСОЛЬНОМ ПРИЛОЖЕНИИ из справки из Интернета ДЛЯ ОТПРАВКИ ДАННЫХ НА МОЙ СЕРВО КОНТРОЛЛЕР SSC 32 КОД ВЫШЕ ЭТО:

using System.IO.Ports;
using System.Threading;

namespace cConsoleAppMonitorServoCompletion
{
    class Program
    {
        static SerialPort _serialPort;

        static void Main(string[] args)
        {
            try
            {
                _serialPort = new SerialPort();
                _serialPort.PortName = "COM3";
                _serialPort.Open();
                _serialPort.Write("#27 P1600 S750\r");
                Console.WriteLine("#27 P1500 S750\r");
                string output;
                output = "";
                //Example: "Q <cr>" 
                //This will return a "." if the previous move is complete, or a "+" if it is still in progress. 
                while (!(output == ".")) //loop until you get back a period 
                {
                    _serialPort.Write("Q  \r");
                    output = _serialPort.ReadExisting();
                    Console.WriteLine(output);
                    Thread.Sleep(10);
                }
                _serialPort.Close();
            }
            catch (TimeoutException) { }
        }
    }
}

Теперь я хочу, чтобы, когда я говорил красным, вместо того, чтобы давать текстовое поле, я хочу получить последовательную команду, например _serialPort.Write("#27 P1600 S750\r");

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

Ответы [ 3 ]

2 голосов
/ 11 июля 2011

Похоже, вам нужно использовать System.Diagnostics.Process.Start

На этой странице есть пример - как запустить консольное приложение из формы Windows?

// Simple handler for the SpeechRecognized event. private void sr_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) { System.Diagnostics.Process.Start( @"cmd.exe", @"/k c:\path\my.exe" ); }

Действительно амбициозный стартовый проект!

Обновление

    private bool LaunchApp(String sAppPath, String sArg)
    {
        bool bSuccess = false;

        try
        {
            //create a new process
            Process myApp = new Process();
            myApp.StartInfo.FileName = sAppPath;
            myApp.StartInfo.Arguments = sArg;
            bSuccess = myApp.Start();
        }
        catch (Win32Exception e)
        {
            MessageBox.Show("Error Details: {0}", e.Message);
        }

        return bSuccess;
    }
2 голосов
/ 11 июля 2011

Управление роботом с помощью распознавания голоса ... амбициозный проект для начинающих!Здесь может произойти миллион ошибок.

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

Вы также можете попробовать отладочный вывод - например, Console.WriteLine - чтобы мы могли видетьсостояние переменных и поток кода во время его работы.

1 голос
/ 11 июля 2011

, если Now I want like when I speak red instead of giving a text box I want get serial command означает - просто _serialPort.Write("#27 P1600 S750\r"); вместо отображения окна сообщения (т.е. MessageBox.Show(e.Result.Text);), тогда задача действительно проста.просто скопируйте и вставьте этот код.и добавьте using System.IO.Ports;, чтобы вы могли работать с портами.

, чтобы ваш код выглядел так:

private void sr_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            //MessageBox.Show(e.Result.Text);
            try
            {
                _serialPort = new SerialPort();
                _serialPort.PortName = "COM3";
                _serialPort.Open();
                _serialPort.Write("#27 P1600 S750\r");
                Console.WriteLine("#27 P1500 S750\r");
                string output;
                output = "";
                //Example: "Q <cr>" 
                //This will return a "." if the previous move is complete, or a "+" if it is still in progress. 
                while (!(output == ".")) //loop until you get back a period 
                {
                    _serialPort.Write("Q  \r");
                    output = _serialPort.ReadExisting();
                    Console.WriteLine(output);
                    Thread.Sleep(10);
                }
                _serialPort.Close();
            }
            catch (TimeoutException) { }

        }

ps, если вы не понимаете, как работает SerialPort Class MSDN

...