System.InvalidOperationException“语法的语言与语音识别器的语言不匹配”

时间:2014-08-23 12:31:50

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

我目前正在重新创建一个我最近看到的教程项目,但我遇到了一些问题。首先我使用的是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;
        }

    }
}

首先,当我尝试文本到语音时,我得到错误"未处理的类型' System.IO.FileNotFoundException'发生在Microsoft.Speech.dll"在这一行:

_speechSynthesizer.Speak(_promptBuilder);

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

未处理的类型' System.InvalidOperationException'发生在Microsoft.Speech.dll

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

在线:

_speechRecognitionEngine.LoadGrammar(grammar);

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

1 个答案:

答案 0 :(得分:1)

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

其次,GrammarBuilder个对象具有Culture属性(默认为当前的UI文化)。在识别可行之前,您需要将其设置为识别器的文化。