欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > 内容正文

WP中的语音识别(下):语音指令,wp语音识别

来源: 开发者 投稿于  被查看 45234 次 评论:59

WP中的语音识别(下):语音指令,wp语音识别


除了系统集成的可以用于搜索、启动应用程序等语音命令外,在我们的应用程序内部还能自己定义语音指令,使得我们的APP能与语音操控结合得更加完全。

语音指令是通过一个XML文件来定义的。比如,咱小舅子开了家饭店,并取了一个非常雅致的名字——牛逼饭店,因店里的牛肉烧得特特好吃,连皇帝吃了也舍不得回金銮殿。

为了实现“牛逼饭店”应用能实现语音点菜,在“解决方案资源管理器”窗口中找到应用项目,右击项目名,从快捷菜单中依次执行【添加】【新建项】,在新建项对话框中选中“语音命令定义”。

然后输入文件的名字,确定完成语音命令文件添加。

设置这个文件的生成行为为“内容”,“如果较新则复制”。

 

下面看一下我为牛逼饭殿定义的语音指令。

<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.0">
  <CommandSet xml:lang="zh-CN">
    <CommandPrefix>牛逼饭店</CommandPrefix>
    <Example> 饭店主页、我要牛肉、我点白菜 </Example>

    <Command Name="点菜">
      <Example> 我要豆腐,或 我点白菜 </Example>
      <ListenFor> 我要{items} </ListenFor>
      <ListenFor> 我点{items} </ListenFor>
      <Feedback> 好,点菜去 </Feedback>
      <Navigate Target="diancai.xaml"/>
    </Command>

    <Command Name="主页">
      <Example> 饭店主页 </Example>
      <ListenFor> 饭店主页 </ListenFor>
      <Feedback> 主页快到了 </Feedback>
      <Navigate Target="MainPage.xaml" />
    </Command>


    <PhraseList Label="items">
      <Item> 牛肉 </Item>
      <Item> 豆腐干 </Item>
      <Item> 白菜 </Item>
      <Item >火腿</Item>
    </PhraseList>

  </CommandSet>
</VoiceCommands>

这个文件并不复杂,弄清楚其结构就好。
1、根节点为VoiceCommands,并且xmlns必须为http://schemas.microsoft.com/voicecommands/1.0;

2、VoiceCommands下可以包含多个CommandSet节点,每个CommandSet节点表示一个命令集,通常一个命令集表示一种语言,如为英文定义一个命令集,为中文也定义一个。通过xml:lang特性来指定语言,xml:lang="zh-CN"表示语音指令集为中文;

3、CommandPrefix节点是可选的,是CommandSet的子级,只能有一个。别小看CommandPrefix节点,它的作用大得很,如果应用的名字为“牛逼饭店v3.0.0.11”,这样我们朗读起来很痛苦,系统也未必能识别,这时候,如果通过CommandPrefix元素定义一个别名,如<CommandPrefix>牛逼饭店</CommandPrefix>,只要我们对着手机话筒大声说出“牛逼饭店”,系统就会找到牛逼饭店v3.0.0.11应用程序了,知道了吧,这就是CommandPrefix的用途。

4、Example在CommandSet和子Command元素中都能包含;在CommandSet中使用,用于说明整个命令集的操作方法,如果用在Command中,就用于单个命令的示例,示例是用来告诉用户,对着手机应该如何表白。

5、CommandSet下面可以放多个Command元素,表示单个命令。记得要通过Name特性为指令命名,而且在当前命令集中,不要出现相同的命令。命令中可以有Example元素,告诉用户如何使用语音操作。可以包含多个ListenFor元素,该元素表示语音识别系统应当注意聆这些话,比如牛逼饭店中,点菜命令的一个ListenFor为“我要{items}”,即语音系统会注意听“我要大白菜”,“我要豆腐渣”等语句,{items}是啥,后面会说到。

6、Feedback元素是指当语音系统听出命令后的回应,比如我说“我要吃西瓜”,系统识别成功后会返馈一句“西瓜多得是,随便啃。”,如牛逼饭店应用中的<Feedback> 好,点菜去 </Feedback>,当识别成功后,系统会发出一句“好,点菜去”。

7、Navigate元素表示当命令识别成功后,应导航到哪个页面并传递参数。

8、CommandSet中可包含多个PhraseList,PhraseList元素用来定义一组短语,比如上面我们提到“我要{items}”,这个items用一对大括号包起来,表示它是一个占位符,一个标签,它是用下面这个短语列表中的词来替换。

    <PhraseList Label="items">
      <Item> 牛肉 </Item>
      <Item> 豆腐干 </Item>
      <Item> 白菜 </Item>
      <Item >火腿</Item>
    </PhraseList>

一定要注意Label一定要与前面{}中的内容匹配,假如我说“我要白菜”,那么听到的命令就是“我要{items}”,而其中的{items}就会被“白菜”所替代。

现在,大家对语音命令的定义应该了解了,牛逼饭店的示例代码我待会上传。

下面给大家演示一个叫“我的情书榜”的应用程序。

1、启动可爱的VS环境,新建一个WP项目(暂用WP8)。

2、在主页MainPage.xaml中输入以下XAML:

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <TextBlock Text="欢迎,欢迎,热烈欢迎。"
           FontSize="55" TextWrapping="Wrap"/>
        </Grid>

3、再向项目添加一个新页面,名为Write.xaml,XAML如下:

    <!--LayoutRoot 是包含所有页面内容的根网格-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel 包含应用程序的名称和页标题-->
        <StackPanel Grid.Row="0" Margin="12,17,0,28">
            <TextBlock Text="我的应用程序" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock Text="新情书" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <!--ContentPanel - 在此处放置其他内容-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <TextBlock Grid.Row="0" FontSize="35" Text="请输入内容:"/>
            <TextBox Grid.Row="1" Margin="0,15,0,5"/>
        </Grid>
    </Grid>

4、现在,向项目中添加一个语音指令定义文件,命名为cmd.xml。注意要把文件的生成操作设置为“内容”,复制到输出目录设置为“如果较新则复制”。并把文件中工具生成的内容删掉,我们自己写一个语音指令定义集。

<?xml version="1.0" encoding="utf-8"?>
<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.0">
  <CommandSet xml:lang="zh-cn">
    <CommandPrefix>情书</CommandPrefix>
    <Example>情书,或者 写情书。</Example>
    <Command Name="write">
      <Example>写情书</Example>
      <ListenFor>写情书</ListenFor>
      <ListenFor>新情书</ListenFor>
      <Feedback>去,勇敢地写。</Feedback>
      <Navigate Target="Write.xaml"/>
    </Command>
    <Command Name="main">
      <Example>进主页,或 去主页</Example>
      <ListenFor>去主页</ListenFor>
      <ListenFor>进主页</ListenFor>
      <Feedback>欢迎,欢迎。</Feedback>
      <Navigate Target="MainPage.xaml"/>
    </Command>
  </CommandSet>
</VoiceCommands>

为了方便用户说出应用的名字,CommandPrefix指定为“情书”,这样,说出“情书”就可以识别出当前应用。命令集包含两个命令,第一个命令会启动Write.xaml页面,第二个则进入主页。

5、命令文件虽然定义好了,但现在它还不能起作用,需要在运行时安装命令,方法是在App的Launching事件中加入以下代码:

        private async void Application_Launching(object sender, LaunchingEventArgs e)
        {
            await Windows.Phone.Speech.VoiceCommands.VoiceCommandService.InstallCommandSetsFromFileAsync(new Uri("ms-appx:///cmd.xml"));
        }


现在,运行应用程序,然后激活系统语音帮助(长按Win键),这时候,语音助手启动,点击右上角的问题,如下图所示。

 

切换到“应用程序”页,然后会看到我们的应用程序,点击它。

 

这时候,会看到一些提示的示例文本,大家细心研究就会看到,这些示例文本就是我们在Example节点中定义的文本。

 

现在你对着手机喊“情书 写情书”,识别后会启动应用程序,然后跳转到Write.xaml页面。

在通过语音操作进入页面时会向页面传递参数,参数包含命令的名字、已识别的内容,可以在页面的OnNavigatedTo方法中处理,具体大家可以参考我上传的牛逼饭店应用。

牛逼饭店示例下载地址:http://files.cnblogs.com/tcjiaan/%E7%89%9B%E9%80%BC%E9%A5%AD%E5%BA%97.rar

怎么样,动手试试吧。

============================================

【后话】

WP 8.1中对应的命名空间在Windows.Media.SpeechRecognition。

安装语音指令文件,使用VoiceCommandManager类的静态方法InstallCommandSetsFromStorageFileAsync,不过要注意该方法的参数是StorageFile对象,而SL for WP中是URI的,同样,可以通过GetFileFromApplicationUriAsync方法来从URI得到文件引用。

   var file =  await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///cmd.xml"));

  await Windows.Media.SpeechRecognition.VoiceCommandManager.InstallCommandSetsFromStorageFileAsync(file);


什是语音指令识别

语音识别技术就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的高技术,也就是让机器听懂人类的语音。

也就是说,如果电脑配置有“语音辨识”的程序组,那么当你的声音通过一个转换装置输入电脑内部、并以数位方式储存后,语音辨识程序便开始以你输入的声音样本与事先储存好的声音样本进行对比工作。声音对比工作完成之后,电脑就会输入一个它认为最“象”的声音样本序号,就可以知道你刚才念的声音是什么意义,进而执行此命令。说起来简单,但要真正建立辨识率高的语音辨识程序组,却是非常困难而专业的,世界各地的学者们也还在努力研究最好的方式。专家学者们研究出许多破解这个问题的方法,如傅立叶转换、倒频谱参数等,使目前的语音辨识系统已达到一个可接受的程度,并且辨识度愈来愈高。
 

win7语音识别中的常见命令

bendd很高兴为您解决问题。 下表显示了语音识别中一些最常用的命令。斜体字表明您可以说出许多不同的事物来代替示例字词或短语并得到有效的结果。 功能 说出的内容 按项目名称单击任何项目 单击文件;开始;查看 单击任何项目 单击回收站;单击计算机;单击文件名 双击任何项目 双击回收站;双击计算机;双击文件名 切换到某个打开的程序 切换到画图;切换到写字板;切换到程序名称;切换应用程序 沿一个方向滚动 向上滚动;向下滚动;向左滚动;向右滚动 在文档中插入新段落或换行 新段落;换行 在文档中选择字词 选择字词 选择某个字词并开始对其更正 更正字词 选择并删除特定字词 删除字词 显示适用命令的列表 我可以说什么? 更新当前可用的语音命令列表 刷新语音命令 让计算机听您说话 开始聆听 让计算机停止聆听 停止聆听 移动语音识别麦克风栏 移动语音识别 最小化windows语音识别 最小化语音识别 查看有关特定任务的 Windows 帮助和支持内容 如何执行操作? 例如,说“如何安装打印机?”,然后会返回帮助主题列表。 祝天天开心~
 

相关文章

    暂无相关文章
相关频道:

用户评论