Cortana回复而不是应用程序启动



好的,我有一个支持Cortana的应用程序。我有一些导航到特定页面的命令。但在某些情况下,我只想提供一个回复(文本或Cortana发音),而不是启动整个应用程序。有办法做到这一点吗?

例如,当你问Cortana"美国首都是什么?"时,她只是回答你"华盛顿"。我想做这样的事。

看看本教程的底部,它详细介绍了如何设置她说的话和显示的内容。

基本上,您需要有一个后台任务,该任务通过语音命令执行,然后在执行过程中,您需要创建一个VoiceCommandUserMessage

使用taskInstance.TriggerDetails 抓取VoiceServiceConnection

    voiceServiceConnection = 
      VoiceCommandServiceConnection.FromAppServiceTriggerDetails(
        triggerDetails); 

等待语音命令完成

    VoiceCommand voiceCommand = await voiceServiceConnection.GetVoiceCommandAsync();

然后添加

VoiceCommandUserMessage userMessage = new VoiceCommandUserMessage();
userMessage.DisplayMessage = "Here’s your trip.";
userMessage.SpokenMessage = "Your trip to Vegas is on August 3rd.";

将其封装在响应中

var response = 
  VoiceCommandResponse.CreateResponse(
    userMessage);

最后,让Cortana显示它:

await voiceServiceConnection.ReportSuccessAsync(response);

另请参阅cortana 的设计指南

据我所知,这只有在Windows 10应用程序中才可能实现。

https://channel9.msdn.com/Events/Build/2015/2-691

Windows应用程序允许您在前台和后台使用Cortana进行迭代。我相信背景就是你想要的:

首先,您需要创建一个XML文件来表示VCD(语音命令定义)。这是您声明要使用的命令的位置:

<?xml version="1.0" encoding="utf-8" ?>
<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.2">
  <CommandSet xml:lang="en-us" Name="HomeControlCommandSet_en-us">
    <CommandPrefix>HomeControl</CommandPrefix>
    <Example>Control alarm, temperature, light and others</Example>
    <Command Name="CheckTemperature">
      <Example>Check temperature</Example>
      <ListenFor>check [current] temperature</ListenFor>
      <Feedback>Checking temperature</Feedback>
      <VoiceCommandService Target="VoiceCommandService" />
    </Command>
  </CommandSet>
</VoiceCommands>

在您需要在App.OnLaunched内部App.xaml.cs:注册VCD之后

protected async override void OnLaunched(LaunchActivatedEventArgs e)
{
    ...
    // Install the VCD
    try
    {
        StorageFile vcdStorageFile = await Package.Current.InstalledLocation.GetFileAsync(@"HomeControlCommands.xml");
        await VoiceCommandDefinitionManager.InstallCommandDefinitionsFromStorageFileAsync(vcdStorageFile);
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine("There was an error registering the Voice Command Definitions", ex);
    }
}

之后,您需要创建一个新的Windows运行时组件项目,并创建一个实现IBackgroundTask:的类

public sealed class HomeControlVoiceCommandService : IBackgroundTask
{
    private VoiceCommandServiceConnection voiceServiceConnection;
    private BackgroundTaskDeferral serviceDeferral;
    public async void Run(IBackgroundTaskInstance taskInstance)
    {
        // Create the deferral by requesting it from the task instance
        serviceDeferral = taskInstance.GetDeferral();
        AppServiceTriggerDetails triggerDetails = taskInstance.TriggerDetails as AppServiceTriggerDetails;
        if (triggerDetails != null && triggerDetails.Name.Equals("VoiceCommandService"))
        {
            voiceServiceConnection = VoiceCommandServiceConnection.FromAppServiceTriggerDetails(triggerDetails);
            VoiceCommand voiceCommand = await voiceServiceConnection.GetVoiceCommandAsync();
            // Perform the appropriate command depending on the operation defined in VCD
            switch (voiceCommand.CommandName)
            {
                case "CheckTemperature":
                    VoiceCommandUserMessage userMessage = new VoiceCommandUserMessage();
                    userMessage.DisplayMessage = "The current temperature is 23 degrees";
                    userMessage.SpokenMessage = "The current temperature is 23 degrees";
                    VoiceCommandResponse response = VoiceCommandResponse.CreateResponse(userMessage, null);
                    await voiceServiceConnection.ReportSuccessAsync(response);
                    break;
                default:
                    break;
            }
        }
        // Once the asynchronous method(s) are done, close the deferral
        serviceDeferral.Complete();
    }
}

别忘了添加这个新项目作为主项目的参考。此外,您需要在Package.appxmanifest:中注册服务

<Extensions>
<uap:Extension Category="windows.appService" EntryPoint="CortanaComponent.HomeControlVoiceCommandService">
  <uap:AppService Name="VoiceCommandService" />
</uap:Extension>
</Extensions>

这应该有效!

要获得完整的指南,您可以查看这篇文章

最新更新