Microsoft.Speech.dll中发生了未处理的“System.FormatException”类型异常

时间:2013-05-05 11:30:33

标签: c# grammar speech formatexception

我刚尝试使用来自thr链接http://msdn.microsoft.com/en-us/library/hh378403(v=office.14).aspx的PLS词典来使用自定义发音。 我的.pls文件如下:

Additional information:词典数据无效或已损坏。

<?xml version="1.0" encoding="UTF-8"?>

<lexicon version="1.0" 
  xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon 
  http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
  alphabet="x-microsoft-ups" xml:lang="en-US">

    <lexeme>
        <grapheme> scale </grapheme>
        <phoneme> S K A L E </phoneme>
    </lexeme>
</lexicon>

and my grammar file is as pronunciation.grxml


<?xml version="1.0" encoding="UTF-8"?>
<grammar 
    version="1.0" 
    xml:lang="en-US" 
    root="colors" 
    sapi:alphabet="x-microsoft-ups" 
    xmlns:sapi="http://schemas.microsoft.com/Speech/2002/06/SRGSExtensions" 
    xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0" >

  <lexicon uri="C:\Users\sony vaio\Documents\Visual Studio 2012\Projects\ConsoleApplication5\ConsoleApplication5\bin\Debug\Blue.pls" type="application/vdn.ms-sapi-lex"/>

  <rule id="colors" scope="public">
      <one-of>  
        <item> scale </item>
      </one-of>
  </rule>

</grammar>

和我的c#程序是

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Xml;
using Microsoft.Speech;
using Microsoft.Speech.Recognition;
using Microsoft.Speech.Recognition.SrgsGrammar;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {

            using (SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US")))
            {

                String currDirPath = Environment.CurrentDirectory;

                string xmlGrammar = currDirPath + "\\pronunciation.grxml";
                string cfgGrammar = currDirPath + "\\pronunciation.cfg";
                FileStream fs = new FileStream(cfgGrammar, FileMode.Create);
                XmlReader reader = XmlReader.Create(xmlGrammar);

                //compile the grammar *.grxml to *.cfg file.
                SrgsGrammarCompiler.Compile(reader, (Stream)fs);
                fs.Close();
                Grammar g = new Grammar(cfgGrammar, "colors");
                Console.WriteLine(currDirPath+cfgGrammar);

                recognizer.LoadGrammarAsync(g);

                // Add a handler for the speech recognized event.
                recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);
                // Configure the input to the speech recognizer.
                recognizer.SetInputToDefaultAudioDevice();

                // Start asynchronous, continuous speech recognition.
                recognizer.RecognizeAsync(RecognizeMode.Multiple);

                // Keep the console window open.
                while (true)
                {
                    Console.ReadLine();
                }
            }
        }

        // speech recognised event handler

        static void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            string lines = e.Result.Text;
            Console.WriteLine("Speak loudly");
            Console.WriteLine("Recognized text: " + e.Result.Text);
            Console.WriteLine("semantic value: " + e.Result.Semantics.Value.ToString());
       }
}

但每当我尝试编译并使用它来识别“scale”时,它总是显示“Microsoft.Speech.dll中发生了'System.FormatException'类型的未处理异常 附加信息:词典数据无效或已损坏。 “

虽然使用内联发音时它有效,但外部链接中的发音似乎不起作用。 有没有解决方法?任何帮助,将不胜感激。请。

1 个答案:

答案 0 :(得分:1)

将上面的代码从Microsoft.Speech.Recogonition移到System.Speech.Recognition修复了上面的格式异常的问题。

至于为什么Microsoft.Speech.Recognition会抛出错误,我不确定。我知道官方的W3C规范确实正式支持xml文件中的词典标记(尽管微软有关于词典标记应该位于何处的非常具体的规则,这似乎是正确的):

http://www.w3.org/TR/speech-grammar/#S4.10

词典:语法格式不解决词典的加载或语法引用的单词的发音。 W3C语音浏览器工作组正在考虑开发标准词典格式。如果和何时开发格式,将对此语法规范进行适当的更新。

词典格式的实际规格尚未完成:

http://www.w3.org/TR/lexicon-reqs/#pronun

总之,如果微软自己的示例链接here不起作用,这似乎是一个错误。特别是如果您为修复格式异常所做的就是从Microsoft.Speech更改为System.Speech。