如何在C#中修改Cortana语音激活命令(XML)?

时间:2014-12-27 19:21:07

标签: c# xml windows-phone-8.1 cortana

我目前在我的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并且说#34; Dr。 Bailey,它会下雨吗?&#34;然后应用导航到CortanaText.xaml。这被硬编码到XML中,我希望用户能够自定义其命令前缀及其命令。

通过使用2个文本框,我在C#中编码了一个包含整个XML的字符串,但是从包含新命令前缀和命令的文本框中插入选项。这个字符串叫做cortanaXMLstring。使用新字符串覆盖CortanaCommands.xml中现有代码的最佳方法是什么?我认为这比修改现有XML的2个不同区域更容易。我还认为可以删除CortanaCommands.xml(使用c#代码),然后通过简单地插入字符串再次创建该XML,因为字符串包含XML所需的所有文本?或者,有关如何在XML中修改这两个字段的任何其他建议吗?它是命令前缀和命令示例。感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:0)

所以我们在一段时间后解决了这个问题。

首先,我们将XML文件加载到Isolated Storage中,然后使用

从隔离的存储中加载VCD文件
await VoiceCommandService.InstallCommandSetsFromFileAsync(new Uri("ms-appdata:///local/CortanaCommands.xml", UriKind.RelativeOrAbsolute));

而不是

ms-appx:///CortanaCommands.xml

"ms-appdata:///local/CortanaCommands.xml"

是什么从Isolated Storage文件夹加载而不是从XAP文件加载。

然后我们在替换

的代码中完全重写了xml文件

<CommandPrefix><ListenFor>

来自两个文本框的用户输入。我们将其加载到流中并使用

document.Root.RemoveAll();

从CortanaCommands.xml中删除旧的xml信息,并使用我们的新数据将流重写为xml并重新加载

VoiceCommandService.InstallCommandSetsFromFileAsync(new Uri("ms-appdata:///local/CortanaCommands.xml", UriKind.RelativeOrAbsolute));

执行所有操作,允许用户添加自定义命令前缀和短语以启动我们要启动的页面。这可用于更改xml文件中的任何内容,并完全将VCD重写为用户喜欢的内容。

我应该提一下,为了我们的目的,我们不需要短语主题,因为我们只使用一个导航命令。我们删除了那个短语主题,因为它是可选的,并且将listenfor中的[create] {dictation}更改为“它是否会下雨”