我正在尝试使用Windows Phone 8语音识别来识别单词的自定义发音。我尝试使用MSDN上提供的示例,但是我的内容很短。首先,我正在使用词典文件(.pls),因为内联发音的“sapi”命名空间失败(对于pron
和display
属性) - 但也许我会保存对于另一个问题。无论如何,这就是我所拥有的:
<?xml version="1.0" encoding="utf-8" ?>
<grammar version="1.0" xml:lang="en-US" tag-format="semantics/1.0" root="thecolor"
xmlns="http://www.w3.org/2001/06/grammar" >
<lexicon uri="ms-appx:///SRGSLexicon.pls" />
<rule id="thecolor">
<item>blue</item>
</rule>
</grammar>
这是我的SRGS语法。我像这样加载它:
Dim SRGSGrammar As Uri = New Uri("ms-appx:///SRGSGrammar.xml", UriKind.Absolute)
_myRecognizer.Grammars.AddGrammarFromUri("SRGSGrammar", SRGSGrammar)
我也尝试将type="application/pls+xml"
添加到lexicon
元素,但这会产生格式异常。
似乎工作得很好。但请注意<lexicon/>
标记。这是我的PLS文件:
<?xml version="1.0" encoding="utf-8" ?>
<lexicon version="1.0"
xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
alphabet="x-microsoft-ups" xml:lang="en-US">
<lexeme>
<grapheme> blue </grapheme>
<phoneme> W S1 AX T CH AX M AX K S2 AA L IH T </phoneme>
</lexeme>
</lexicon>
(注意:这两个文件都在我的应用根目录中,设置为内容,如果更新则复制)。
然后我点击一个名为“speak”的按钮,它会Dim recoResult = Await _myRecognizer.RecognizeAsync()
。然后我说 whatchamacallit 它给了我很低的信心,并说使用的规则是“thecolor”,文字是“蓝色”。就我所见,它甚至没有使用PLS。如果我再次这样做,这次说蓝色,我接近100%的信心。
我想要识别PLS中的 whatchamacallit ,而不是SRGS语法中的 blue ,但唯一获得高信度的是“蓝色”(99%) )这也是结果文本。
我的PLS 出现加载(我无法100%确定,但除了上面提供的URI之外的任何URI都会导致 FileNotFound 异常,所以这就是为什么我认为它正在加载)。
注意 - How do I use a lexicon with SpeechSynthesizer?不是这个问题的内容,尽管我们都在PLS中使用了 whatchamacallit 示例。另外,Using SSML for advanced text-to-speech on Windows Phone 8给了我一些希望,因为它是我见过的PLS的唯一实现,但是它是针对不同的技术而且在我的例子中不起作用。
是否有人通过PLS文件(或<Token/>
内联sapi
内容)在WP8中使用自定义发音?如果是的话,你能帮忙吗?
答案 0 :(得分:2)
当我在C#中使用type =“application / pls + xml”时,我没有收到80045003错误。相反,我一直这样做:
WinRT信息:发现语法错误: C:\数据\用户\ DefApps \应用程序数据{A7C75BFD-F873-4DA9-834C-C4CA3D97AA6B} \本地\ SRGSGrammar.xml, 第4行:无法编译词典文件 “ms-appdata:///local/SRGSLexicon.xml”:0x80004003
我认为是找不到文件指针的错误。当我更加关注错误消息时,我注意到解析器认为它对语法文件和词典文件有不同的文件路径,即使我使用“ms-appdata:///”来引用它们文件。
事实证明,语法分析器可能无法接受任何特殊的uri方案。我使用了PLS文件uri属性的错误消息中的文件路径的完整路径,并且工作正常。你会注意到我还在使用type =“application / pls + xml”
所以我不确定这项工作是否是可以接受的解决方案......但我相信这会解决问题的根源。
这是使这项工作的代码(在C#中)
SRGSLexicon.pls(未更改)
SRGSGrammar.xml(使用文件路径而不是uri-scheme)
<?xml version="1.0" encoding="utf-8" ?>
<grammar version="1.0" xml:lang="en-US" tag-format="semantics/1.0" root="thecolor"
xmlns="http://www.w3.org/2001/06/grammar" >
<lexicon uri="C:\Data\Users\DefApps\AppData\{A7C75BFD-F873-4DA9-834C-C4CA3D97AA6B}\Local\SRGSLexicon.pls" type="application/pls+xml" />
<rule id="thecolor">
<item>blue</item>
</rule>
</grammar>
我的应用代码(C#)
public MainPage()
{
InitializeComponent();
var srgsGrammar = new Uri("ms-appx:////SRGSGrammar.xml", UriKind.Absolute);
_recognizerUi.Recognizer.Grammars.AddGrammarFromUri("SRGSGrammar", srgsGrammar);
}
readonly SpeechRecognizerUI _recognizerUi = new SpeechRecognizerUI();
private async void Test_OnClick(object sender, RoutedEventArgs e)
{
//I used these next 2 lines to show the FilePath of the SRGSGrammar.xml file, and I used the same folder
//structure for the lexicon pls file uri (just changed the file name)
//var fileName = (await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/SRGSGrammar.xml"))).Path;
//MessageBox.Show(fileName);
var recoResult = await _recognizerUi.RecognizeWithUIAsync();
var x = recoResult.RecognitionResult.TextConfidence;
MessageBox.Show(((int)x).ToString()); //show confidence
}
我希望这会有所帮助。我认为语法分析器不知道如何处理uri-scheme。