2012-06-22 92 views
3

我试图为客户端实现语音提示系统,他们可以在PowerPoint中为幻灯片分配单词或短语,并且当他们说出该单词或短语时,幻灯片会前进。这里是我用来创建语法的代码(我使用微软的SpeechRecognitionEngine作为实际工作)。对单个词的Microsoft语音识别

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

而不是写此F从头开始,您可能想看看来自Microsoft的开源项目Mayhem [http://makemayhem.com/],它允许您使用触发器或操作来连接事件。他们已经有了用于语音录制的附加模块和一个可以控制PowerPoint幻灯片的Office模块。 –

+0

我会看看,谢谢你的帮助凯文。 –

回答

3

这里是我想出了:

正如@迈克尔利维说,当你给它一个词来听电脑并没有做太多的工作。它基本上只是监听音频电平何时达到某个值,然后假定它必须是该单词。所以我决定,我必须给它与SOUND相反的其他词语。现在我的目标不是花数周时间研究语音学,而是找出一个完美的算法来确定那些听起来远离我想匹配的单词的单词,所以我决定专注于第一个字母。下面是操作顺序:

  1. 提取触发字从XML文件进行操作的幻灯片
  2. 查找单词
  3. 的第一个字母查找3个字母是最不像信的步骤发现声音2
  4. 查找4个字的变长,音节计数,结束音,和第二个字母与每个在步骤中找到的三个字母的开始3
  5. Add找到所有12个字,在步骤4的选择列表,以及沿触发词。现在有13个字。一个是我们找到的单词,另外一个是12个单词。因此,计算机将织补确保它是正确的之前触发任何事件处理程序:)

我们判断相反的字母,我发布了一个问题here,但它得到了关闭之前,我得到任何有用的意见) :我不知道为什么,我查看了常见问题解答,看起来我是按照这里描述的条款。我决定对我的家人和朋友进行投票,而我们的综合智慧提出了一个对立的名单。每个字母都有三个字母,尽可能地让它们远离原始字母声音。

最后一步是为这些字母中的每一个查找单词。我发现每个字母四个字,共104个字。我想要不同长度,第二个字母和结尾声音的单词,这样我就可以覆盖所有的基础,尽可能“分散”计算机远离目标单词。我用这个University Vocab List想出了大话,用我小小的英语头脑写出了5个字母,最后我觉得我有一个很好的名单。我使用XML格式化它,添加解析代码,并检查结果.....好得多!几乎太好了!没有误报,有些人的表达能力不好,将会很难使用我的程序!我将使它更容易一些,也许是通过去除分心词的数量,但总体来说我还是很高兴的结果,并赞赏@迈克尔·利维和@Kevin荣汉斯

代码的建议:

<?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(); 
      } 
     } 
    } 
+0

我很高兴这是为你工作。我想知道,如果您尝试添加简单的垃圾单词,而不是试图从策略上选择与您的目标单词听起来不同的垃圾单词。识别器非常好,如果您的战略性字词选择实际上比仅仅几个随机选择的噪音字词给出更好的结果,我会很好奇。 –

+0

说实话,我没有,尽管这很有趣。我假设,仅仅从逻辑上来说,选择性词语选择会更好,但是它是否会起作用_noticeably_ better是我想的真正问题。 –

2

识别器结果可能因许多因素而异。这些包括:背景噪音,麦克风质量以及音频输入设置和级别。尝试一个带有良好麦克风的安静房间,看看你的结果是否更好。

你的一个单词语法造成问题的理论可能是公平的。 (它让我想起了一位老师在一次考试中提出了一个选择题,只有一个选择,然后当很多学生得到正确答案时感到惊讶)。你是否曾尝试在文法中添加垃圾单词作为其他选择,以便发动机不会仅仅默认唯一的选择?尝试类似:

choices.Add("zebra"); 
choices.Add("umbrella"); 
choices.Add("plunger"); 

并查看您的结果是否改善。

我知道在Windows 7中使用听写语法,您可以使用Windows 7语音识别功能来训练识别器以更好地识别单个扬声器。我不知道这是否可以帮助你使用固定的语法,正如你所描述的那样。您可能想要通过培训来了解结果是否有所改善。有关更多信息,请参阅http://windows.microsoft.com/en-US/windows7/Set-up-Speech-Recognition

+0

我不知道你为什么得到一票反对票......我给了你我的最高票数!我昨天晚上实施了这个,获得了很多改进的结果!事实上,现在,除非你完美地表达,否则它不认识这个词!我将发布我的解决方案来解决问题,因为它最终会成为一个彻夜的努力,但我认为我已经沿着您发布的内容取得了一些进展,可以让其他开发人员也遇到类似问题。 –

+2

downvotes没有评论总是对我来说是一个谜。有时候,我认为人们在发布规则和网站风格上如此紧张,以至于他们宁愿遵守规则,也不愿意帮助某人。我的回答有点模糊,我不确定我的建议,所以我认为保证投票。既然你没有其他答案,我认为一个模糊的建议可能比沉默更有帮助。 –