C# 使用.net语音API在SRGS语法中引用外部规则时出错

C# 使用.net语音API在SRGS语法中引用外部规则时出错,c#,.net,speech-recognition,C#,.net,Speech Recognition,下面的程序是一个简单的C#语言语音识别控制台应用程序,使用Microsoft托管语音API,只识别单词“是”和“否”。当我使用Srgs方法内联创建Srgs规则“MyRule”时,一切正常。但是,如果我将规则放入外部XML文件并创建一个SrgsRuleRef来引用它,我总是会得到错误:“无法解析对导入语法的规则引用。”我尝试过更改各种参数,例如语言、媒体类型和语义标记格式,但似乎没有任何区别 using System; using System.Speech.Recognition; using

下面的程序是一个简单的C#语言语音识别控制台应用程序,使用Microsoft托管语音API,只识别单词“是”和“否”。当我使用Srgs方法内联创建Srgs规则“MyRule”时,一切正常。但是,如果我将规则放入外部XML文件并创建一个SrgsRuleRef来引用它,我总是会得到错误:“无法解析对导入语法的规则引用。”我尝试过更改各种参数,例如语言、媒体类型和语义标记格式,但似乎没有任何区别

using System;
using System.Speech.Recognition;
using System.Speech.Recognition.SrgsGrammar;

namespace SpeechRecognitionConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                System.Globalization.CultureInfo culture = 
                    new System.Globalization.CultureInfo("en-US");
                SrgsRule RootRule = new SrgsRule("RootRule");
                RootRule.Add(new SrgsRuleRef(
                    new Uri("c:\\projects.net\\speechrecognitionconsole\\MyGrammar.xml"), "MyRule"));
                RootRule.Scope = SrgsRuleScope.Public;
                SrgsDocument MyDocument = new SrgsDocument(RootRule);
                MyDocument.Culture = culture;
                Grammar g = new Grammar(MyDocument);
                g.Name = ("MyGrammar");
                SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(culture);
                recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>
                                               (recognizer_SpeechRecognized);
                recognizer.LoadGrammar(g);
                recognizer.SetInputToDefaultAudioDevice();
                recognizer.RecognizeAsync(RecognizeMode.Multiple);
                Console.WriteLine("Starting asynchronous recognition...");
                Console.Read();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        static void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            Console.WriteLine(e.Result.Text);
        }
    }
}
使用系统;
使用系统语音识别;
使用System.Speech.Recognition.SrgsGrammar;
命名空间SpeechRecognitionConsole
{
班级计划
{
静态void Main(字符串[]参数)
{
尝试
{
System.Globalization.CultureInfo文化=
新系统。全球化。文化信息(“en-US”);
SrgsRule RootRule=新的SrgsRule(“RootRule”);
添加(新的SrgsRuleRef(
新Uri(“c:\\projects.net\\speechrecognitionconsole\\MyGrammar.xml”),“MyRule”);
RootRule.Scope=SrgsRuleScope.Public;
SrgsDocument MyDocument=新的SrgsDocument(RootRule);
MyDocument.Culture=Culture;
语法g=新语法(MyDocument);
g、 名称=(“我的语法”);
SpeechRecognitionEngine识别器=新的SpeechRecognitionEngine(区域性);
recognizer.SpeechRecognized+=新事件处理程序
(识别器_speechrecogned);
识别器。加载语法(g);
recognizer.setInputOdeFaultAudioDevice();
识别器.RecognizeAsync(RecognizeMode.Multiple);
WriteLine(“启动异步识别…”);
Console.Read();
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
}
静态无效识别器\u SpeechRecognited(对象发送器,SpeechRecognitedEventArgs e)
{
Console.WriteLine(e.Result.Text);
}
}
}
语法文件“c:\projects.net\speechrecognitionconsole\MyGrammar.xml”包含:

<?xml version="1.0" encoding="utf-8"?>
<grammar xml:lang="en-US" tag-format="semantics/1.0" version="1.0" xmlns="http://www.w3.org/2001/06/grammar">
  <rule id="MyRule" scope="public">
    <one-of>
      <item>yes</item>
      <item>no</item>
    </one-of>
  </rule>
</grammar>

对
不

要在今天使用Visual Studio 2013实现这一点,我必须添加root=“MyRule”不确定在2012年提出问题时,相同的修复是否会有所帮助

<?xml version="1.0" encoding="utf-8"?>
<grammar xml:lang="en-US" tag-format="semantics/1.0"
 version="1.0" xmlns="http://www.w3.org/2001/06/grammar" root="MyRule">
  <rule id="MyRule" scope="public">
    <one-of>
      <item>yes</item>
      <item>no</item>
    </one-of>
  </rule>
</grammar>

对
不

访问本地文件系统不需要在URI前面加上“file://”前缀吗?文件路径由URI构造函数转换为'file:///c:/projects.net/speechrecognitionconsole/MyGrammar.xml“我认为这是本地文件的正确形式。我也用http uri测试了代码,它在LoadGrammar中给出了相同的错误。我想我在调试器中看到了一些奇怪的东西,其中带有文件url的SrgsRuleRef添加了#MyRule作为http url,但我在http中得到了相同的结果。另一个想法是文档中的根规则应该与SrgsRuleRef指定的规则匹配,这是在,但这对我也不起作用。所以,我被难住了。我还用一个http Uri测试了它,但它不起作用。我非常确定外部规则不必是根规则,因为这将使它的用途非常有限,尽管它必须是公共的,事实上是。我最终放弃了外部规则引用,只是加载了文件中的所有规则,然后以编程方式添加了我自己的规则,效果不错。