我正在尝试为客户端实现语音提示系统,他们可以在PowerPoint中为幻灯片分配单词或短语,当他们说出该单词或短语时,幻灯片就会前进。这是我用来创建语法的代码(我使用Microsoft的SpeechRecognitionEngine
进行实际工作)。
Choices choices = new Choices();
string word = speechSlide.Scenes[speechSlide.currentslide].speechCue;
if (word.Trim() != "")
{
choices.Add(word);
GrammarBuilder builder = new GrammarBuilder(choices);
Grammar directions = new Grammar(builder);
return directions;
}
我尝试提高信心的门槛,但我仍然得到太多的误报。有没有办法改善语法?有些东西告诉我,在语法接受列表中只添加一个单词就是引发所有误报的原因。
答案 0 :(得分:3)
识别器结果可能因许多因素而异。其中包括:背景噪音,麦克风质量以及音频输入设置和级别。尝试一个带有良好麦克风的安静房间,看看你的结果是否更好。
你的单词语法理论可能是公平的。 (它让我想起一位老师在只有一个选择的测试中询问多项选择题,然后当这么多学生得到正确的答案时感到惊讶。)你是否尝试在句法中添加垃圾词作为其他选择以便引擎不只是默认为唯一的选择吗?尝试类似:
choices.Add("zebra");
choices.Add("umbrella");
choices.Add("plunger");
并查看您的结果是否有所改善。
我知道在Windows 7中使用Dictation语法,您可以使用Windows 7语音识别功能来训练识别器以更好地识别单个扬声器。我不知道这是否会像你所描述的那样帮助你修复固定的语法。您可能希望尝试培训以查看结果是否有所改善。有关详细信息,请参阅http://windows.microsoft.com/en-US/windows7/Set-up-Speech-Recognition。
答案 1 :(得分:3)
以下是我提出的建议:
正如@Michael Levy所说,当你用一个词来聆听时,计算机并没有做太多工作。它基本上只是监听音频电平何时达到某个值,然后假定它必须是那个字。所以我决定我必须说出其他相反的声音。现在我的目标不是花费数周的研究语音,并找出一个完美的算法来确定远离我想要匹配的单词的单词,所以我决定专注于第一个字母。以下是操作顺序:
现在确定相反的字母,我发布了一个问题here,但在我得到任何有用的建议之前它已经关闭了):我不知道为什么,我检查了常见问题解答,看来我在那里描述的条款。我决定对我的家人和朋友进行民意调查,我们的综合智慧提出了一系列对立面。每个字母都有3个字母,可以使声音远离原始字母的声音。
最后一步是为每个字母找到单词。我发现每个字母有四个单词,总共104个单词。我想要不同长度,第二个字母和结束声音的单词,这样我就可以覆盖所有基础,并尽可能地“分散”计算机远离目标单词。我用这个University Vocab List提出了大词,并用我微不足道的英语思维来提出单词< 5个字母,最后我觉得我有一个很好的清单。我用XML格式化它,添加了解析代码,并检查了结果.....好多了!几乎太好了!没有误报,而且表达能力差的人会很难使用我的程序!我可以通过删除分散注意力的词数来使它变得更容易一些,但总体而言我对结果非常满意,并欣赏@Michael Levy和@Kevin Junghans的建议
代码:
<?xml version="1.0" encoding="utf-8" ?>
<list>
<a opposite="m,q,n">abnegate,apple,argent,axe</a>
<b opposite="k,l,s">berate,barn,bored,battology</b>
<c opposite="v,r,j">chrematophobia,cremate,cease,camoflauge</c>
<d opposite="l,q,w">dyslogy,distemper,dog,dilligent</d>
<e opposite="j,n,k">exoteric,esoteric,enumerate,elongate</e>
<f opposite="g,i,t">flagitious,flatulate,fart,funeral</f>
<g opposite="f,v,z">gracile,grace,garner,guns</g>
<h opposite="q,d,x">hebetate,health,habitat,horned</h>
<i opposite="m,n,f">isomorphic,inside,iterate,ill</i>
<j opposite="c,e,x">jape,juvenescent,jove,jolly</j>
<k opposite="l,w,v">kinetosis,keratin,knack,kudos</k>
<l opposite="b,d,g">lactate,lord,limaceous,launder</l>
<m opposite="v,i,f">malaria,mere,morbid,murcid</m>
<n opposite="h,r,v">name,nemesis,noon,nuncheon</n>
<o opposite="b,n,j">orarian,opiate,opossum,oculars</o>
<p opposite="n,m,d">pharmacist,phylogeny,pelt,puny</p>
<q opposite="d,h,f">query,quack,quick,quisquous</q>
<r opposite="c,f,x">random,renitency,roinous,run</r>
<s opposite="b,y,d">sand,searing,sicarian,solemn,</s>
<t opposite="l,m,f">tart,treating,thunder,thyroid</t>
<u opposite="f,g,j">unasinous,unit,ulcer,unthinkable</u>
<v opposite="c,k,m">version,visceral,vortex,vulnerable</v>
<w opposite="d,k,n">wand,weasiness,whimsical,wolf</w>
<x opposite="m,l,p">xanthopsia,xanthax,xylophone,xray</x>
<y opposite="s,j,d">yellow,york,yuck,ylem</y>
<z opposite="m,n,g">zamboni,zip,zoology,zugzwang </z>
</list>
解析代码:
private Dictionary<string, List<string>> opposites;
private Dictionary<string, List<string>> words = new Dictionary<string, List<string>>();
private void StartSpeechRecognition(Media_Slide slide)
{
if (opposites == null)
{
opposites = new Dictionary<string, List<string>>();
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
string file = System.IO.Path.GetDirectoryName(Assembly.GetAssembly(typeof(MainWindow)).CodeBase).Remove(0, 6) + "\\buzzlist.xml";
doc.Load(file);
foreach (System.Xml.XmlNode node in doc.ChildNodes[1].ChildNodes)
{
opposites.Add(node.Name, new List<string>(node.Attributes[0].InnerText.Split(',')));
words.Add(node.Name, new List<string>(node.InnerText.Split(',')));
}
}
speechSlide = slide;
rec = new SpeechRecognitionEngine();
rec.SpeechRecognized += rec_SpeechRecognized;
rec.SetInputToDefaultAudioDevice();
try
{
rec.LoadGrammar(GetGrammar());
rec.RecognizeAsync(RecognizeMode.Multiple);
}
catch
{
}
}
检查代码:
void rec_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
if (e.Result.Text == speechSlide.Scenes[speechSlide.currentslide].speechCue)
{
rec.UnloadAllGrammars();
ScreenSettings.NextSlide(speechSlide);
try
{
rec.LoadGrammar(GetGrammar());
}
catch
{
rec.RecognizeAsyncCancel();
}
}
}