uwp 语音指令

Xml code

--------------------------------

<Page

    x:Class="MyApp.MainPage"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:local="using:MyApp"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    mc:Ignorable="d"

    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

 

    <StackPanel>

        <TextBlock Text="请说出你最喜欢的体育运动:" FontSize="18"/>

        <Button Content="开始识别" Width="200" Click="OnClick"/>

        <ListBox Name="lb">

            <x:String>足球</x:String>

            <x:String>排球</x:String>

            <x:String>跑步</x:String>

            <x:String>羽毛球</x:String>

            <x:String>篮球</x:String>

        </ListBox>

    </StackPanel>

</Page>

 

 

C# code

------------------------

 public sealed partial class MainPage : Page

    {

        SpeechRecognizer _recognizer = null;

        public MainPage()

        {

            this.InitializeComponent();

 

            this.NavigationCacheMode = NavigationCacheMode.Required;

 

            this.Loaded += Page_Loaded;

            this.Unloaded += Page_Unloaded;

        }

 

        private void Page_Unloaded(object sender, RoutedEventArgs e)

        {

            // 释放资源

            _recognizer.Dispose();

        }

 

        private async void Page_Loaded(object sender, RoutedEventArgs e)

        {

            _recognizer = new SpeechRecognizer();

            // 创建自定义短语约束

            string[] array = { "足球", "排球", "跑步", "羽毛球", "篮球" };

            SpeechRecognitionListConstraint listConstraint = new SpeechRecognitionListConstraint(array);

            // 添加约束实例到集合中

            _recognizer.Constraints.Add(listConstraint);

            // 编译约束

            await _recognizer.CompileConstraintsAsync();

        }

 

        private async void OnClick(object sender, RoutedEventArgs e)

        {

            Button btn = sender as Button;

            btn.IsEnabled = false;

 

            try

            {

                SpeechRecognitionResult res = await _recognizer.RecognizeAsync();

                if (res.Status == SpeechRecognitionResultStatus.Success)

                {

                    // 处理识别结果

                    this.lb.SelectedItem = res.Text;

                }

            }

            catch { /* 忽略异常 */ }

 

            btn.IsEnabled = true;

        }

 

    }

 

 

xml 文件

 

 

 

 

 

 

 

 

 

 

 

 

语音识别

  public 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()

        {

            this.InitializeComponent();

            this.Suspending += this.OnSuspending;

        }

 

        /// <summary>

        /// Invoked when the application is launched normally by the end user.  Other entry points

        /// will be used when the application is launched to open a specific file, to display

        /// search results, and so forth.

        /// </summary>

        /// <param name="e">Details about the launch request and process.</param>

        protected async override void OnLaunched(LaunchActivatedEventArgs e)

        {

 

 

            StorageFile vcdFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///vcd.xml"));

            // 安装VCD文件

            await VoiceCommandDefinitionManager.InstallCommandDefinitionsFromStorageFileAsync(vcdFile);

 

            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();

 

                // TODO: change this value to a cache size that is appropriate for your application

                rootFrame.CacheSize = 1;

 

                // Set the default language

                rootFrame.Language = "zh-CN";

 

                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

                if (!rootFrame.Navigate(typeof(MainPage), e.Arguments))

                {

                    throw new Exception("Failed to create initial page");

                }

            }

 

            // Ensure the current window is active

            Window.Current.Activate();

        }

 

        /// <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();

        }

 

        protected override void OnActivated(IActivatedEventArgs args)

        {

            if (args.Kind == ActivationKind.VoiceCommand)

            {

                VoiceCommandActivatedEventArgs varg = (VoiceCommandActivatedEventArgs)args;

                // 处理识别结果

                SpeechRecognitionResult res = varg.Result;

                // 获取已识别的指令名字

                string cmdName = res.RulePath[0];

                if (cmdName == "open")

                {

                    // 获取PhraseList中被识别出来的项

                    var interpretation = res.SemanticInterpretation;

                    if (interpretation != null)

                    {

                        // 通过PhraseList的Label属性可以查询出被识别的Item

                        string item = interpretation.Properties["pages"].FirstOrDefault();

                        if (!string.IsNullOrEmpty(item))

                        {

                            // 导航到对应页面

                            Frame root = Window.Current.Content as Frame;

                            if (root == null)

                            {

                                root = new Frame();

                                Window.Current.Content = root;

                            }

                            switch (item)

                            {

                                case "我的音乐":

                                    root.Navigate(typeof(MyMusicPage));

                                    break;

                                case "我的视频":

                                    root.Navigate(typeof(MyVedioPage));

                                    break;

                                case "我的照片":

                                    root.Navigate(typeof(MyPhotoPage));

                                    break;

                                case "主页":

                                    root.Navigate(typeof(MainPage));

                                    break;

                                default:

                                    root.Navigate(typeof(MainPage));

                                    break;

                            }

                        }

                    }

                }

            }

            Window.Current.Activate();

        }

    }

 

 

识别的xml 文件

<?xml version="1.0" encoding="utf-8"?>

 

<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.1">

  <CommandSet xml:lang="zh-cn">

    <CommandPrefix>测试应用</CommandPrefix>

    <Example>“打开 主页”或“打开 我的音乐”或“我的音乐”或“打开我的视频”或“我的视频”……</Example>

    <Command Name="open">

      <Example>“打开 我的音乐”或“我的音乐”</Example>

      <ListenFor>[打开]{pages}</ListenFor>

      <Feedback>好的,正在努力打开中……</Feedback>

      <Navigate/>

    </Command>

    <PhraseList Label="pages">

      <Item>主页</Item>

      <Item>我的音乐</Item>

      <Item>我的视频</Item>

      <Item>我的照片</Item>

    </PhraseList>

  </CommandSet>

</VoiceCommands>

 

posted @ 2021-01-02 21:50  MaxBruce  阅读(127)  评论(0编辑  收藏  举报