我刚尝试使用来自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'类型的未处理异常 附加信息:词典数据无效或已损坏。 “
虽然使用内联发音时它有效,但外部链接中的发音似乎不起作用。 有没有解决方法?任何帮助,将不胜感激。请。
答案 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。