Ошибка при обращении к внешнему правилу в грамматике SRGS с использованием речевого API .net - PullRequest
1 голос
/ 26 января 2012

Следующая программа представляет собой простое консольное приложение для распознавания речи в 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>

1 Ответ

0 голосов
/ 27 октября 2014

Чтобы сегодня это работало с использованием 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>
...