Петля обратной связи распознавания речи

Я работаю над системой распознавания речи, чтобы разговаривать с моим компьютером. Теперь у меня компьютерный аудиовыход настроен на систему объемного звука. Это вызвало проблемы для системы распознавания. Например, когда я говорю «тест», чтобы проверить, подключено ли оно к сети, система отвечает «тест завершен». Микрофон слышит «тест завершен» и переходит в бесконечный цикл, говоря, что тест завершен. У меня вопрос: есть ли способ остановить прослушивание программы, когда она говорит, а затем снова начать слушать после того, как она закончит говорить? Я думал, может быть, как-нибудь убедиться, что он реагирует только на мой голос. Я открыт для любых предложений.

Мой код ниже.

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;
using System.Diagnostics;
using System.Runtime.InteropServices;


namespace SpeechRecog
{
public partial class Form1 : Form
{
    private Choices onoff = new Choices();
    private Choices recChoices = new Choices();
    SpeechRecognitionEngine RE = new SpeechRecognitionEngine();
    SpeechSynthesizer ss = new SpeechSynthesizer();
    SpeechRecognitionEngine LRE = new SpeechRecognitionEngine();


    public Form1()
    {
        InitializeComponent();
        ss.SelectVoiceByHints(VoiceGender.Male);

    }

    private void btnEnable_Click(object sender, EventArgs e)
    {
        RE.RecognizeAsync(RecognizeMode.Multiple);
        btnDisable.Enabled = true;

    }

    private void Form1_Load(object sender, EventArgs e)
    {

        Choices commands = new Choices();        
        commands.Add(new string[] { "Say Hello", "Test","What's my name", "yahoo", "Thank you", "Hey", "Facebook", "Music", "Lock", "Time"});
        GrammarBuilder gb = new GrammarBuilder();
        gb.Append(commands);
        Grammar Grammar = new Grammar(gb);
        RE.LoadGrammarAsync(Grammar);
        RE.SetInputToDefaultAudioDevice();
        RE.SpeechRecognized += RE_SpeechRecognized;




    }

    private void LRE_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
    {
        if (e.Result.Text.Equals("Hey")) ;
        {
            RE.RecognizeAsync(RecognizeMode.Multiple);

        } }

    public string time()
    { DateTime n = DateTime.Now;
        string o = n.GetDateTimeFormats('t')[0];
            return o;
            }

    private void RE_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
    {

        string speech = e.Result.Text;




        switch (e.Result.Text)
        {
            case "Test":
                ss.SpeakAsync("Test Complete");
                break;
            case "Say Hello":
            case "Introduce yourself":
                ss.SpeakAsync("My name is Friday. I was designed to simplify daily life. How can I assist you today?");
                break;
            case "What's my name":
                ss.SpeakAsync("Arno");
                break;
            case "yahoo":
                System.Diagnostics.Process.Start("http://www.yahoo.com");
                break;
            case "Facebook":
                System.Diagnostics.Process.Start("http://www.Facebook.com");
                break;
            case "Music":
                System.Diagnostics.Process.Start("iTunes.exe");
                break;
            case "Lock":
                System.Diagnostics.Process.Start("Rundll32.exe", "User32.dll,LockWorkStation");
                break;
            case "Thank You":

                break;
            case "Time":
                ss.Speak(time());
                break;





                    }
    }

    private void btnDisable_Click(object sender, EventArgs e)
    {
        RE.RecognizeAsyncStop();
        btnDisable.Enabled = false;
    }
}

}


person TS777    schedule 12.03.2016    source источник
comment
Я не знаком с пространством имен речи, но, глядя на документ, SpeechSynthesizer имеет SpeakCompleted, которое возникает по завершении разговора. Вы можете отключить микрофон и подключить слушателя, который снова включит его при возникновении события.   -  person Jorn Vernee    schedule 13.03.2016


Ответы (1)


Вы должны использовать RecognizeAsyncCancel() или RecognizeAsyncStop ()

private void RE_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    RE.recognizer.RecognizeAsyncStop();

MSDN:

Чтобы остановить операцию асинхронного распознавания, используйте методы RecognizeAsyncCancel () или RecognizeAsyncStop (). Вы можете приостановить работающий экземпляр SpeechRecognitionEngine, чтобы обновить его конфигурацию или загрузить и выгрузить грамматики с помощью одного из методов RequestRecognizerUpdate (). SpeechRecognitionEngine может выполнять дополнительный режим распознавания (называемый эмуляцией), во время которого он принимает в качестве входных данных текст, а не речь. Эмулированное распознавание может быть полезно для отладки грамматик. Распознаватель речи вызывает события SpeechDetected, SpeechHypothesized, SpeechRecognitionRejected и SpeechRecognized, как если бы операция распознавания не эмулировалась. Чтобы инициировать эмулируемое распознавание, вызовите один из методов EmulateRecognize () или EmulateRecognizeAsync () и передайте текст или массив слов, для которых вы хотите выполнить эмулируемое распознавание.

person Valentin    schedule 12.03.2016
comment
Не думал, что это будет так просто! Спасибо. Вы знаете, как применить это ко всем имеющимся у меня случаям? Или мне нужно использовать RecognizeAsyncStop на каждом из них? - person TS777; 13.03.2016