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

时间:2013-04-09 04:57:19

标签: windows-phone-8 speech-recognition sapi

我正在尝试使用Windows Phone 8语音识别来识别单词的自定义发音。我尝试使用MSDN上提供的示例,但是我的内容很短。首先,我正在使用词典文件(.pls),因为内联发音的“sapi”命名空间失败(对于prondisplay属性) - 但也许我会保存对于另一个问题。无论如何,这就是我所拥有的:

<?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中使用自定义发音?如果是的话,你能帮忙吗?

1 个答案:

答案 0 :(得分:2)

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

当我在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。