【问题标题】:System.InvalidOperationException "The language for the grammar does not match the language of the speech recognizer"System.InvalidOperationException “语法的语言与语音识别器的语言不匹配”
【发布时间】:2016-10-17 03:25:33
【问题描述】:

我目前正在重新创建一个我最近看到的教程项目,但我面临一些问题。首先,我使用的是 Windows 7 Home Premium,并且我的操作系统是土耳其语。

因此,System.Speech 仅在我执行文本转语音时才有效,否则会引发异常,提示未安装语音识别器。我也从控制面板检查了这个,它说语音识别在这种语言中不可用。由于我没有最终版本的 windows,我无法使用语言包来完全更改语言。

在对 stackoverflow 进行了一些研究后,我发现安装 micosoft 语音平台并将 System.Speech 更改为 Microsoft.Speech 是可行的。所以我按照这个网站上的说明(http://msdn.microsoft.com/en-us/library/hh362873.aspx)安装了包括en-US语言包的组件。

我更改了代码以反映更改,现在我在不同的行上遇到了不同的错误。这是我的代码:

using System;
using System.Globalization;
using Microsoft.Speech.Recognition;
using Microsoft.Speech.Synthesis;
using System.Windows.Forms;

namespace SpeechRecognitionTest
{
    public partial class Form1 : Form
    {
        private SpeechRecognitionEngine _speechRecognitionEngine = new SpeechRecognitionEngine(new CultureInfo("en-US"));
        private SpeechSynthesizer _speechSynthesizer = new SpeechSynthesizer();
        private PromptBuilder _promptBuilder = new PromptBuilder();

        public Form1()
        {
            InitializeComponent();
        }

        private void btnSpeakText_Click(object sender, EventArgs e)
        {
            _promptBuilder.ClearContent();
            _promptBuilder.AppendText(txtSpeech.Text);
            _speechSynthesizer.SetOutputToDefaultAudioDevice();
            _speechSynthesizer.Speak(_promptBuilder);
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            btnStart.Enabled = false;
            btnEnd.Enabled = true;
            var choicesList = new Choices();
            choicesList.Add(new string[]{"hello","yes"});
            var grammar = new Grammar(new GrammarBuilder(choicesList));
            _speechRecognitionEngine.RequestRecognizerUpdate();
            _speechRecognitionEngine.LoadGrammar(grammar);
            _speechRecognitionEngine.SpeechRecognized += _speechRecognitionEngine_SpeechRecognized;
            _speechRecognitionEngine.SetInputToDefaultAudioDevice();
            _speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple);
        }

        void _speechRecognitionEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            MessageBox.Show(e.Result.Text);
        }

        private void btnEnd_Click(object sender, EventArgs e)
        {
            btnStart.Enabled = true;
            btnEnd.Enabled = false;
        }

    }
}

首先,当我尝试将文本转语音时,我在此行收到错误“Microsoft.Speech.dll 中出现类型为 'System.IO.FileNotFoundException' 的未处理异常”:

_speechSynthesizer.Speak(_promptBuilder);

其次,当我尝试进行语音识别时,出现以下异常:

Microsoft.Speech.dll 中出现“System.InvalidOperationException”类型的未处理异常

附加信息:语法的语言与语音识别器的语言不匹配。

上线:

_speechRecognitionEngine.LoadGrammar(grammar);

我确实搜索了互联网,发现对这个问题的反应不一。有些人可以毫无问题地使用 System.Speech,因为他们安装了英语,一些非英语操作系统所有者通过 Microsoft.Speech 解决了这个问题。但对此没有明确的答案。我目前没有选择,真的很想有人能解释什么是错误的,或者即使我可以在我的机器上运行这段代码,因为本机操作系统语言。

【问题讨论】:

标签: c# .net speech-recognition text-to-speech


【解决方案1】:

合成引擎中的异常是由于合成引擎试图找到默认语音而失败引起的。如果您明确指定语音(使用SelectVoiceByHintsGetInstalledVoices(CultureInfo)),合成将成功。

其次,GrammarBuilder 对象有一个Culture 属性(默认为当前的 UI 文化)。您需要将其设置为识别器的文化,然后识别才会起作用。

【讨论】:

  • 添加代码建议后,它可以完美运行!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 2019-06-26
相关资源
最近更新 更多