1

我正在尝试使用 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>

(注意:这两个文件都在我的应用程序的根目录中,设置为 Content and Copy if Newer)。

然后我点击了一个名为“speak”的按钮,它确实如此Dim recoResult = Await _myRecognizer.RecognizeAsync()。然后我说whatchamacallit,它给了我非常低的信心,并说使用的规则是“thecolor”,文本是“blue”。据我所知,它甚至没有使用 PLS。如果我再次这样做并且这次说blue,我将获得接近 100% 的信心。

我希望识别 PLS 中的whatchamacallit ,而不是 SRGS 语法中的蓝色,但唯一获得很高置信度的是“蓝色”(99%),这也是结果文本。

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

注意 -如何将词典与 SpeechSynthesizer 一起使用?不是这个问题是关于什么的,尽管我们都在 PLS 中使用了 whatchamacallit示例。此外,在 Windows Phone 8 上使用 SSML 进行高级文本到语音转换给了我一些希望,因为它是我见过的唯一 PLS 实现,但可惜它用于不同的技术并且在我的示例中不起作用。

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

4

1 回答 1

2

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

当我在 C# 中使用 type="application/pls+xml" 时,我没有收到 80045003 错误。相反,我一直得到这个:

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

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

事实证明,语法解析器可能无法接受任何特殊的 uri-schemes。我使用 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。

于 2013-04-13T05:10:58.167 回答