与 Cortana 进行免提通话!






4.95/5 (8投票s)
在 Windows 应用中集成 Cortana(
简介(如果您已经了解 Cortana,请跳过)
现在,不启动所需的应用程序来完成工作的情况越来越普遍。 由于每个平台都有自己的个人助理,可以尽可能快地完成您的工作,为什么不加以利用呢? 如果您还不确定我在谈论哪种个人助理。 它们是 Cortana、Siri 和 Google Now。 它们分别在 Windows、iOS 和 Android 设备上可用。 今天让我谈谈 Cortana,并向您展示如何将她集成到您自己的应用程序中。 Cortana 最初是在 Windows Phone 8.1 中引入的,现在她也适用于 Windows 10 设备(运行在 Windows 10 操作系统上的设备)。 在 Windows 10 设备中,您可以要求 Cortana 为您做事。 她将执行特定任务并在 Cortana 画布中返回结果。 顺便说一句,如果您想保持隐私,当然也不想每次都在公共场合对 Cortana 大喊大叫,您也可以在画布中输入内容来完成您的工作。 您只需说“Hey Cortana”即可在 Windows 中与 Cortana 互动。 然后您将看到 Cortana 画布。
如何将 Cortana 集成到我的应用程序中?
您可以使用 Cortana 在前台运行应用程序。 然后您可以使用该应用程序执行您的操作。 如果您使用 Cortana 运行前台应用程序,您就无法用 Cortana 做太多事情。 同样,如果您的应用程序已启动并在您面前运行,您还需要 Cortana 做什么? 当您使用 Cortana 在后台运行您的应用程序并从 Cortana 画布与您的应用程序交互时,真正的乐趣就开始了。 所以请做好准备,让我们开始吧。 我创建了这个最简单的 Todo 应用程序。 您可以从我在此帖子底部提供的链接获取该应用程序的源代码。 这是该应用程序的预览:
您可以添加待办事项、如果它们已完成则选中它们,还可以从应用程序中永久删除它们。 我们何不使用 Cortana 在不运行应用程序的情况下,只需说“Hey Cortana, My Simple Todo, show pending tasks.” 即可获取待处理的任务?
太棒了!您可以调整源代码,并且可以直接从 Cortana 画布添加、选中和删除待办事项等功能。 目前,让我向您展示如何实现这个简单的场景。 为了能够在后台运行我们的应用程序,我们需要一个 Windows 运行时组件。
添加您自己的类并实现其中的 IBackgroundTask
。 它有一个 Run
方法,该方法最终将在您的应用程序在后台激活时运行。 这是我的 VoiceCommandService
类,它实现了 IBackgroundTask
接口。
public sealed class VoiceCommandService : IBackgroundTask
{
private BackgroundTaskDeferral _deferral;
VoiceCommandServiceConnection _voiceServiceConnection;
public async void Run(IBackgroundTaskInstance taskInstance)
{
var triggerDetails = taskInstance.TriggerDetails as AppServiceTriggerDetails;
if (triggerDetails?.Name == "SimpleTodoVoiceCommandService")
{
_deferral = taskInstance.GetDeferral();
var cancelledTokenSource = new CancellationTokenSource();
_voiceServiceConnection =
VoiceCommandServiceConnection.FromAppServiceTriggerDetails(triggerDetails);
var voiceCommand = await _voiceServiceConnection.GetVoiceCommandAsync();
switch (voiceCommand.CommandName)
{
case "todoBackgroundCommandList":
var command =
voiceCommand.SpeechRecognitionResult.SemanticInterpretation.Properties["command"][0];
if (command == "pending")
await ShowPendingTasks();
break;
default:
LaunchAppInForeground();
break;
}
taskInstance.Canceled += (s, e) =>
{
cancelledTokenSource.Cancel();
_deferral.Complete();
};
_voiceServiceConnection.VoiceCommandCompleted += (sender, args) =>
{
cancelledTokenSource.Cancel();
_deferral.Complete();
};
_voiceServiceConnection.VoiceCommandCompleted += (sender, args) =>
{
cancelledTokenSource.Cancel();
};
}
}
}
源代码包含其余代码(从上面的链接下载它)。 我在这里所做的只是获取激活后台任务的语音命令。 然后,我们将其与语音命令定义文件中定义的 PhraseList
进行匹配。 由于我的应用程序只能显示待处理的任务,因此该命令应与我的 PhraseList
中的第一个命令匹配。 这是我的 VCD 文件
<?xml version="1.0" encoding="utf-8"?>
<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.2">
<CommandSet xml:lang="en-us" Name="MySimpleTodoCommandSet_en-us">
<CommandPrefix> My Simple To do </CommandPrefix>
<Example> My Simple To do, show pending tasks </Example>
<Command Name="todoBackgroundCommandList">
<Example> show pending tasks </Example>
<ListenFor> {command} task[s] </ListenFor>
<Feedback> Executing specific command </Feedback>
<VoiceCommandService Target="SimpleTodoVoiceCommandService"/>
</Command>
<PhraseList Label="command">
<Item>pending</Item>
</PhraseList>
</CommandSet>
</VoiceCommands>
在这里,在 command prefix 节点中,我们定义应用程序标识符,Cortana 将通过该标识符识别我们的应用程序。 例如,“Hey Cortana, open my simple to do” 将在前台打开我们的应用程序。 同样,您可以在 VCD 文件中拥有多个 Command 节点,每个节点都将有一个 ListenFor
节点。 在此节点中,您可以为所需的命令放置一个占位符。 这些占位符将被 PhraseList
中的匹配值替换。 您还可以定义类似的 CommandSet
并设置 CommandSet
的语言,用户可以使用该语言与 Cortana 互动。 请记住,Cortana 尚未支持所有语言。 因此,如果您设置为不支持的语言,您的应用程序可能无法为您提供您正在寻找的精确结果。
现在,将组件库项目的引用添加到主 Windows 应用程序项目。
接下来,您需要在 App.xaml.cs 类中使用这段简单的代码注册您的语音命令定义。 如果您需要在您的应用程序中进行深度链接,您将需要重写 OnActivated
方法。 它都可以在源代码中找到。
private async Task RegisterVoiceCommands()
{
var storageFile =
await StorageFile.GetFileFromApplicationUriAsync(
new Uri("ms-appx:///MySimpleTodoCommands.xml"));
await
VoiceCommandDefinitionManager
.InstallCommandDefinitionsFromStorageFileAsync(storageFile);
}
尚未完成。 打开 Package.appxmanifest 文件,转到 Declarations 节点,并从可用声明下拉列表中添加 App Service。 添加应用程序服务标识符和后台任务的入口点。 现在运行该应用程序并添加一些待办事项。 接下来,您只需说“Hey Cortana, my simple to do, show pending tasks.”即可直接从 Cortana 画布查询待处理的任务。 这是为您准备的正在运行的应用程序的视频。 非常感谢您的阅读。