Windows phone 8 未在WP8中加载(或正在使用)SRGS词典

Windows phone 8 未在WP8中加载(或正在使用)SRGS词典,windows-phone-8,speech-recognition,sapi,Windows Phone 8,Speech Recognition,Sapi,我正在尝试使用WindowsPhone8语音识别来识别单词的自定义发音。我正在尝试使用MSDN上提供的样本,但结果很差。首先,我使用的是一个词典文件(.pls),因为内联发音的“sapi”名称空间失败了(对于pron和display属性),但也许我会将其保存下来,用于另一个问题。所以不管怎样,我得到的是: <?xml version="1.0" encoding="utf-8" ?> <grammar version="1.0" xml:lang="en-US" tag-fo

我正在尝试使用WindowsPhone8语音识别来识别单词的自定义发音。我正在尝试使用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>
我还尝试将
type=“application/pls+xml”
添加到
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>

蓝色
W S1 AX T CH AX M AX K S2 AA L IH T
(注意:这两个文件都位于我的应用程序的根目录中,设置为“内容”,如果更新,则复制)

然后我点击了一个名为“speak”的按钮,该按钮的作用是
Dim recoResult=wait\u myRecognizer.RecognizeAsync()
。然后我说什么,它给了我很低的信心,说使用的规则是“颜色”,文本是“蓝色”。据我所知,它甚至没有使用PLS。如果我再这样做,这次说蓝色,我会有接近100%的信心

我希望PLS中的内容得到认可,而不是SRGS语法中的蓝色,但唯一得到高度信任的是“蓝色”(99%),这也是结果文本

我的PLS似乎在加载(我不能100%确定,但是除了我上面给出的URI之外的任何URI都会导致FileNotFound异常,所以我认为它正在加载)

注-不是这个问题的主题,尽管我们都在PLS中使用whatchamacallit示例。另外,这也给了我一些希望,因为这是我见过的PLS的唯一实现,但遗憾的是,这是一种不同的技术,在我的示例中不起作用


是否有人通过PLS文件(或使用
sapi
内联
)在WP8中使用自定义发音?如果是,你能帮忙吗?

托德,我试图复制你的问题,因为我强烈怀疑它与uri方案有关。我没有你的完整代码,但我可以通过将语法和词典文件放在应用程序本地存储的根文件夹中来复制它

当我在C#中使用type=“application/pls+xml”时,我没有得到80045003错误。更确切地说,我一直得到这个:

WinRT信息:发现语法错误: C:\Data\Users\DefApps\AppData{A7C75BFD-F873-4DA9-834C-C4CA3D97AA6B}\Local\SRGSGrammar.xml, 第4行:无法编译词典文件 “小姐-appdata:///local/SRGSLexicon.xml“:0x80004003

我认为这是一个文件指针未找到的错误。当我更加关注错误消息时,我注意到解析器认为语法文件和词典文件的文件路径是不同的,即使我使用“ms appdata:///”引用这两个文件

事实证明,语法分析器可能无法接受任何特殊的uri方案。我使用了PLS文件uri属性的错误消息中的文件路径的完整路径,这是有效的。您会注意到我仍然在使用type=“application/pls+xml”

所以我不确定这是一个可以接受的解决方案。。。但我相信这是问题的根源

这是代码(用C#)使这项工作

SRGSLexicon.pls(不变)

SRGSGrammar.xml(使用文件路径而不是uri方案)


我希望这能有所帮助。我认为语法分析器根本不知道如何处理uri方案。

您是否尝试过更改uri方案(在xml中引用的路径中)?我之前遇到过这样的情况,因为在Windows 8 Phone平台上,根据名称空间的不同,您必须使用appdata://而不是ms appx://@PatrickF,我确实尝试了
appdata://
,它启动了
系统。FormatException
as无法编译词典文件“appdata:/SRGSLexicon.xml”:作为PLS lexicon,“hr=0x80045003”。根据SAPI词典,“hr=0x80045003”“。从编译的角度来看,我当前使用的Uri似乎确实有效。它只是没有被用于语音识别,这就是问题所在。太棒了,谢谢你,帕特里克。我会在周末对它进行彻底测试,然后再给你回复。这很可能就是它所需要的;我也有完整的工作项目,如果这有助于tooHi Patrick,抱歉延误。你的解决方案很有效。我发现它不适用于IPA,只适用于MS自己的拼写muhjig,即alphabet=“x-microsoft-ups”而不是alphabet=“IPA”。但至少它起作用了。如果你能把你的完整的工作解决方案放在一个公共的dropbox文件夹中或某个可以下载的地方,那就太好了。真的很感谢你敏锐的洞察力给了我这样做的方法。
<?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>
<?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>
    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
    }