Следующая программа представляет собой простое консольное приложение для распознавания речи в C #, использующее управляемый Microsoft API речи, который просто распознает слова «да» и «нет».Когда я создаю правило Srgs 'MyRule', используя методы Srgs, все работает нормально.Однако, если я помещаю правило во внешний 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);
}
}
}
Файл грамматики "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>