【问题标题】:Speech Recognition feedback loop语音识别反馈回路
【发布时间】:2016-03-12 22:34:47
【问题描述】:

我正在开发一个语音识别系统来与我的电脑交谈。现在我将计算机音频输出设置为环绕声系统。这给识别系统带来了问题。例如,当我说“测试”以查看它是否在线时,系统会响应“测试完成”。麦克风听到“测试完成”并进入说测试完成的无限循环。我的问题是,有没有办法让程序在说话时停止收听,然后在它说完后再开始收听?我在想也许以某种方式确保它只响应我的声音。我愿意接受任何建议。

我的代码如下。

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;
    }
}

}

【问题讨论】:

  • 我不熟悉语音命名空间,但查看文档,SpeechSynthesizer 有一个 SpeakCompleted 事件,在发言完成时引发。您可以将麦克风静音,并连接一个监听器,在事件触发时再次取消静音。

标签: c# speech-recognition


【解决方案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() 方法并传入文本或单词数组 您要为其执行模拟识别。

【讨论】:

  • 没想到这么简单!谢谢你。您是否知道将其应用于我拥有的所有案例?还是我必须在每一个上都使用 RecognizeAsyncStop?
猜你喜欢
  • 2015-05-20
  • 2011-11-01
  • 2018-04-17
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多