我知道我目前正在尝试做一些超出我的水平的事情,但是尽管如此,我仍在努力。
直到现在,我一直专注于高中级别的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;
}
}
}
}
}
答案 0 :(得分:1)
经过测试,我得到的行为与您类似。在说出任一短语时,程序有时会重复一个或另一个响应。
已经进行了一些测试,我相信正在发生的事情是SpeechRecognitionEngine
不仅在听您说的话,还在听SpeechSynthesizer
的演奏。
为了演示,我更改了单词列表以添加cat
和dog
,并如下更改了事件处理程序:
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”的感觉,但是由于语法如此有限,可能是识别引擎对什么很宽容匹配。
希望这会有所帮助