【问题标题】:Microsoft Voice Recognition on a Single Word单个单词上的 Microsoft 语音识别
【发布时间】:2012-06-23 04:03:16
【问题描述】:

我正在尝试为客户实施语音提示系统,他们可以在 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;
}

我尝试提高置信度的阈值,但仍然得到太多误报。有没有办法提高语法?有件事告诉我,在语法接受列表中只添加一个单词会引发所有误报。

【问题讨论】:

  • 与其从头开始编写,不如查看 Mayhem [makemayhem.com/] 一个来自 Microsoft 的开源项目,它允许您将事件与触发器或操作联系起来。他们已经有了用于语音录制的附加模块和一个可以控制 PowerPoint 幻灯片的 Office 模块。
  • 我去看看,谢谢凯文的帮助。

标签: c# .net speech-recognition


【解决方案1】:

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

你关于一个单词语法引起问题的理论可能是公平的。 (这让我想起了一位老师在只有一个选择的考试中提出多项选择题,然后当这么多学生都答对时感到惊讶。)您是否尝试在语法中添加垃圾词作为其他选择,以便引擎不会只是默认为唯一的选择吗?尝试类似:

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

看看你的结果是否有所改善。

我知道在带有听写语法的 Windows 7 中,您可以使用 Windows 7 语音识别功能来训练识别器以更好地识别单个说话者。我不知道这是否可以帮助您使用您所描述的固定语法。您可能想尝试训练以查看结果是否有所改善。请参阅http://windows.microsoft.com/en-US/windows7/Set-up-Speech-Recognition 了解更多信息。

【讨论】:

  • 我不知道你为什么投了反对票...我给了你我的赞成票!我昨晚实施了这个并得到了很大的改善!事实上,现在,除非你发音完美,否则它不会识别这个词!我将发布我对该问题的解决方案,因为它最终是一个通宵的努力,但我认为我在您发布的内容方面取得了一些进展,这可能会使其他有类似问题的开发人员受益。
  • 不加评论的否决票对我来说始终是个谜。有时,我认为人们对这里的发帖规则和网站风格如此着迷,以至于他们宁愿遵守规则也不愿尝试帮助某人。我的回答有点含糊,我不确定我的建议,所以我认为这值得投反对票。由于您没有其他答案,我认为模糊的建议可能比沉默更有帮助。
【解决方案2】:

这是我想出的:

正如@Michael Levy 所说,当您只听一个词时,计算机不会做太多工作。它基本上只是在音频电平达到某个值时进行监听,然后假定它必须是那个词。所以我决定我必须给它另一个听起来相反的词。现在我的目标不是花费数周时间研究语音学并找出一个完美的算法来确定听起来与我要匹配的单词相距甚远的单词,所以我决定专注于第一个字母。以下是操作顺序:

  1. 从 XML 文件中提取触发词以进行幻灯片播放
  2. 查找单词的第一个字母
  3. 找出与第 2 步中找到的字母发音最不一样的 3 个字母
  4. 找出以第 3 步中找到的三个字母开头的 4 个不同长度、音节数、尾音和第二个字母的单词
  5. 将步骤 4 中找到的所有 12 个单词连同触发词一起添加到选择列表中。现在有13个字。一个是我们找到的词,另外 12 个听起来一点也不像这个词。所以计算机会在触发任何事件处理程序之前确定它是正确的:)

现在要确定相反的字母,我发布了一个问题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();
            }
        }
    }

【讨论】:

  • 我很高兴这对你有用。我想知道您是否尝试仅添加简单的垃圾词,而不是尝试策略性地选择听起来与目标词不同的垃圾词。识别器非常好,我很好奇你的策略词选择是否真的比随机选择的几个噪声词产生更好的结果。
  • 说实话,我没有,虽然这很有趣。我认为,从逻辑上讲,选择性的词选择会更好,但它是否明显更好是我想的真正问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多