我正在尝试为Cortana编写一个小应用程序.
我的想法是,我说:(我启用了“嘿Cortana”功能)
Hey Cortana,Convert 45 degrees to farenheit
然后我在输出窗口(Visual Studio)中获得(此刻)日志.我试着准确地说出这句话,而Cortana完全理解我,但Cortana打开浏览器并将其输入Bing.
为什么?我做错了什么?我没有得到任何语法错误.
这是我的代码:
// commands.xml <?xml version="1.0" encoding="utf-8"?> <VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.1"> <CommandSet xml:lang="en-us" Name="MyCommands_en-us"> <CommandPrefix> Convert,</CommandPrefix> <Example> Convert 45 degrees to farenheit </Example> <Command Name ="farenheitToDegrees"> <Example> 73 farenheit to degrees</Example> <ListenFor> {farenheit} farenheit to degrees </ListenFor> <Feedback> {farenheit} are ... in degrees </Feedback> <Navigate/> </Command> <Command Name="degreesToFarenheit"> <Example> 45 degrees to farenheit </Example> <ListenFor> {degrees} degrees to farenheit </ListenFor> <Feedback> {degrees} degrees are ... in fareneheit </Feedback> <Navigate/> </Command> <PhraseTopic Label="degrees" Scenario="Dictation"> <Subject>Temperature</Subject> </PhraseTopic> <PhraseTopic Label="farenheit" Scenario="Dictation"> <Subject>Temperature</Subject> </PhraseTopic> </CommandSet> </VoiceCommands> // App.xaml.cs using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; using Windows.ApplicationModel; using Windows.ApplicationModel.Activation; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; using Windows.ApplicationModel.VoiceCommands; using Windows.Storage; using Windows.Media.SpeechRecognition; namespace HelloWorld { /// <summary> /// Provides application-specific behavior to supplement the default Application class. /// </summary> sealed partial class App : Application { /// <summary> /// Initializes the singleton application object. This is the first line of authored code /// executed,and as such is the logical equivalent of main() or WinMain(). /// </summary> public App() { Microsoft.ApplicationInsights.WindowsAppInitializer.InitializeAsync( Microsoft.ApplicationInsights.WindowsCollectors.Metadata | Microsoft.ApplicationInsights.WindowsCollectors.Session); this.InitializeComponent(); this.Suspending += OnSuspending; } /// <summary> /// Invoked when the application is launched normally by the end user. Other entry points /// will be used such as when the application is launched to open a specific file. /// </summary> /// <param name="e">Details about the launch request and process.</param> protected async override void OnLaunched(LaunchActivatedEventArgs e) { #if DEBUG if (System.Diagnostics.Debugger.IsAttached) { this.DebugSettings.EnableFrameRateCounter = true; } #endif Frame rootFrame = Window.Current.Content as Frame; // Do not repeat app initialization when the Window already has content,// just ensure that the window is active if (rootFrame == null) { // Create a Frame to act as the navigation context and navigate to the first page rootFrame = new Frame(); rootFrame.NavigationFailed += OnNavigationFailed; if (e.PrevIoUsExecutionState == ApplicationExecutionState.Terminated) { //TODO: Load state from prevIoUsly suspended application } // Place the frame in the current Window Window.Current.Content = rootFrame; } if (rootFrame.Content == null) { // When the navigation stack isn't restored navigate to the first page,// configuring the new page by passing required information as a navigation // parameter rootFrame.Navigate(typeof(MainPage),e.Arguments); } // Ensure the current window is active Window.Current.Activate(); var storageFile = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///commands.xml")); await Windows.ApplicationModel.VoiceCommands.VoiceCommandDefinitionManager.InstallCommandDefinitionsFromStorageFileAsync(storageFile); } protected override void OnActivated(IActivatedEventArgs e) { // Was the app activated by a voice command? if (e.Kind != Windows.ApplicationModel.Activation.ActivationKind.VoiceCommand) { return; } var commandArgs = e as Windows.ApplicationModel.Activation.VoiceCommandActivatedEventArgs; SpeechRecognitionResult speechRecognitionResult = commandArgs.Result; // Get the name of the voice command and the text spoken string voiceCommandName = speechRecognitionResult.RulePath[0]; string textSpoken = speechRecognitionResult.Text; switch (voiceCommandName) { case "farenheitToDegrees": string farenheit = speechRecognitionResult.SemanticInterpretation.Properties["farenheit"][0]; System.Diagnostics.Debug.WriteLine((Convert.ToInt32(farenheit) - 32) / 1.8); break; case "degreesToFarenheit": string degrees = speechRecognitionResult.SemanticInterpretation.Properties["degrees"][0]; System.Diagnostics.Debug.WriteLine(Convert.ToInt32(degrees) * 1.8 + 32); break; default: System.Diagnostics.Debug.WriteLine("None of my bussiness"); break; } } /// <summary> /// Invoked when Navigation to a certain page fails /// </summary> /// <param name="sender">The Frame which Failed navigation</param> /// <param name="e">Details about the navigation failure</param> void OnNavigationFailed(object sender,NavigationFailedEventArgs e) { throw new Exception("Failed to load Page " + e.SourcePageType.FullName); } /// <summary> /// Invoked when application execution is being suspended. Application state is saved /// without knowing whether the application will be terminated or resumed with the contents /// of memory still intact. /// </summary> /// <param name="sender">The source of the suspend request.</param> /// <param name="e">Details about the suspend request.</param> private void OnSuspending(object sender,SuspendingEventArgs e) { var deferral = e.SuspendingOperation.GetDeferral(); //TODO: Save application state and stop any background activity deferral.Complete(); } }
}
有人能帮助我吗?
您上面列出的VCD定义文件没有PhraseTopic或PhraseList来定义花括号中的部分:
原文链接:https://www.f2er.com/windows/364360.html<ListenFor> {farenheit} farenheit to degrees </ListenFor>
我猜你可能想要一个PhraseTopic,因为它允许一个适应各种数字的无约束的听写,如下所示:
<PhraseTopic Label="farenheit" Scenario="Dictation"> <Subject>Temperature</Subject> </PhraseTopic>
请参阅VCD的here on msdn规范,您可能想要调整Scenario值.当然,这确实意味着你需要自己处理你所获得的文本作为farenheit术语,但通常用数字表示的文本以文本’1234’形式出现(但不是在100%的情况下).