我目前在我的Silverlight应用程序中实现了Cortana。语音命令存储在CortanaCommands.xml中,下面是代码:
<?xml version="1.0" encoding="utf-8"?>
<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.1">
<CommandSet xml:lang="en-US">
<CommandPrefix>Dr. Bailey</CommandPrefix>
<Example> Open app to take dictation </Example>
<Command Name="Text">
<Example> Is it going to rain? </Example>
<ListenFor> [create] {dictation} </ListenFor>
<Feedback> "" </Feedback>
<Navigate Target="/Views/CortanaText.xaml" />
</Command>
<PhraseTopic Label="dictation" Scenario="Dictation">
<Subject> Cal 123 </Subject>
</PhraseTopic>
</CommandSet>
</VoiceCommands>"
在此示例中,如果用户部署了Cortana并说“贝利博士,下雨了吗?”,则该应用程序导航到CortanaText.xaml。这是硬编码到XML中的,我希望用户能够自定义其命令前缀和命令。
通过利用2个文本框,我用C#编码了一个包含整个XML的字符串,但是从包含新的Command Prefix和Command的文本框中插入了选择。此字符串称为cortanaXMLstring。用新字符串覆盖CortanaCommands.xml中的现有代码的最佳方法是什么?我认为这比修改现有XML的2个不同区域要容易。我还认为可以删除CortanaCommands.xml(使用C#代码),然后仅通过插入字符串即可再次创建该XML,因为该字符串包含XML所需的所有文本?或者,关于如何修改XML中的这两个字段还有其他建议吗?这是命令前缀和命令示例。感谢您提供的任何帮助!
最佳答案
因此,我们在一段时间后解决了这个问题。
首先,我们使用以下命令将XML文件加载到隔离存储中,并从隔离存储中加载VCD文件:
await VoiceCommandService.InstallCommandSetsFromFileAsync(new Uri("ms-appdata:///local/CortanaCommands.xml", UriKind.RelativeOrAbsolute));
代替
ms-appx:///CortanaCommands.xml
。这
"ms-appdata:///local/CortanaCommands.xml"
是从绝缘存储文件夹而不是从XAP文件加载的内容。
然后,我们用代码完全重写了xml文件,替换了
<CommandPrefix>
和<ListenFor>
用户从两个文本框中输入内容。我们将其加载到流中并使用
document.Root.RemoveAll();
从CortanaCommands.xml删除旧的xml信息,并使用我们的新数据将流重写为xml并重新加载
VoiceCommandService.InstallCommandSetsFromFileAsync(new Uri("ms-appdata:///local/CortanaCommands.xml", UriKind.RelativeOrAbsolute));
做所有允许用户添加自定义命令前缀和短语的操作,以启动我们要启动的页面。这可用于更改xml文件中的任何内容,并将VCD完全重写为喜欢的用户。
我应该提到,出于我们的目的,我们只需要使用一个导航命令就不需要短语主题。我们删除了该短语主题,因为它仍然是可选的,并将监听中的[create] {dictation}更改为“是否下雨了”
关于c# - 如何在C#中修改Cortana语音激活命令(XML)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27670696/