好的,我有一个支持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>
这应该有效!
要获得完整的指南,您可以查看这篇文章