Visual Studio语音合成循环

时间:2018-10-13 09:12:06

标签: c# visual-studio speech-recognition speech-synthesis

我知道我目前正在尝试做一些超出我的水平的事情,但是尽管如此,我仍在努力。

直到现在,我一直专注于高中级别的c++-> Code::Blocks,但是现在我尝试在Visual Studio中搞乱,直到加入一个项目。

我在循环方面遇到一些问题(该程序基于系统语音,系统语音合成,语音识别器和进程启动)。

我有2种情况:

1)输入人声命令“ hi”->它以“ hi”响应。 2)输入“ hello”->并以“打开谷歌”作为响应并打开该特定网页。

好吧,如果它能按预期工作。 如果我输入“ hi”,则循环中以“ hi”-> [“打开google” +打开页面]->响应

如果我输入“ hello”,则会直接进入循环[“打开google” +打开页面] 我尝试了一些断点,看看我在做什么,但我没有希望。

您在这里有代码:

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.Synthesis;
using System.Speech.Recognition;
using System.Diagnostics;

namespace Command
{
    public partial class Speech : Form
    {
        SpeechSynthesizer s = new SpeechSynthesizer();
        public Speech()
        {
            InitializeComponent();
            SpeechRecognitionEngine reco = new SpeechRecognitionEngine();
            Choices list = new Choices();
            list.Add(new string[] { "hi", "hello" });
            Grammar gm = new Grammar(new GrammarBuilder(list));

            try
            {
                reco.RequestRecognizerUpdate();
                reco.LoadGrammar(gm);
                reco.SpeechRecognized += Reco_SpeechRecognized;
                reco.SetInputToDefaultAudioDevice();
                reco.RecognizeAsync(RecognizeMode.Multiple);
            }
            catch { }
        }

        private void Reco_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            string a = e.Result.Text;

            switch (a)
            {
                case ("hello"):
                    {
                        s.SpeakAsync("opening google");
                        Process.Start("https://www.google.com");
                        break;
                    }
                case ("hi"):
                    {
                        s.SpeakAsync("hi");
                        break;
                    }
            }
        }
    }
}

Code

1 个答案:

答案 0 :(得分:1)

经过测试,我得到的行为与您类似。在说出任一短语时,程序有时会重复一个或另一个响应。

已经进行了一些测试,我相信正在发生的事情是SpeechRecognitionEngine不仅在听您说的话,还在听SpeechSynthesizer的演奏。

为了演示,我更改了单词列表以添加catdog,并如下更改了事件处理程序:

private void Reco_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    string a = e.Result.Text;

    switch (a)
    {
        case ("cat"):
            {
                s.SpeakAsync("dog");
                break;
            }
        case ("dog"):
            {
                s.SpeakAsync("cat");
                break;
            }
    }
}

当我说“猫”时,系统以“狗”响应。然后,它听到自己说“ Dog”,并以“ Cat”作为响应,对此做出了“ Dog”响应。最终结果是“ Cat”,“ Dog”,“ Cat”,“ Dog”进行了几次迭代(在我的测试中通常是三到四次)。相反,当我注释掉对SpeakAsync()的调用时,没有出现循环。我不确定是什么原因导致它停止听到声音并因此停止循环播放,这可能是一些内部限制。只是要注意,我使用的是带麦克风的耳机,所以不是我的麦克风拾起扬声器在播放什么,而是DefaultAudioDevice拾起SpeechSynthesizer在播放什么。

我想可以将SpeechRecognitionEngine配置为仅监听默认输入设备(麦克风),或者将SpeechSynthesizer配置为仅通过默认输出设备(扬声器)输出),这样它就不会越过溪流。但是,在这方面缺少有关如何配置音频流的文档。

我不太确定“ hi”听起来像“ hello”的感觉还是“ opening google”听起来像“ hello”的感觉,但是由于语法如此有限,可能是识别引擎对什么很宽容匹配。

希望这会有所帮助