1

我刚刚尝试使用来自链接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());
       }
}

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

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

4

1 回答 1

2

将上面的代码从 Microsoft.Speech.Recognition 移动到 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

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

于 2013-05-07T14:00:21.137 回答