WP 8.1目前许多内容仍处于未确定状态,因此,本文所提及的语音识别,是基于WP8的,在8.1中也差不多,也是使用运行时API来实现,如果大家不知道什么是运行时API,也没关系,不影响学习和开发,因为在VS创建项目后,默认会帮我们引用所有的库。

在本篇中,我们先从简单的实现入手,下一篇会给大家介绍如何自己设计语音命令。

先给大家说说库的位置,与语音识别有关的API在Windows.Phone.Speech.Recognition命名空间下,看名字就能猜到99.999998%了。在该命名空间下,有两个类可用于完成语音识别:

a、SpeechRecognizer

b、SpeechRecognizerUI

两个类的功能其实是等效的,带UI结尾的类在识别时会显示一个识别界面,待会看示例时大家就会看到的。对于SpeechRecognizer类,调用RecognizeAsync方法,异步等待后会返回一个SpeechRecognitionResult实例,其中Text属性表示已经识别出来的文本;对于SpeechRecognizerUI类,可以调用RecognizeWithUIAsync方法进行识别,同样,异步等待后,会返回SpeechRecognitionUIResult实例,从该实例的RecognitionResult属性中得到对SpeechRecognitionResult的引用,就能得到被识别的文本。

下面,我们可以看示例了。

1、启动VS,新建一个项目,命名为“我的高大上应用”。

2、在默认的MainPage.xaml页面中加入以下XAML。

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<StackPanel>
<Button Content="开始识别" FontSize="40"/>
<TextBox x:Name="txtInput" Height="250" Margin="0,11,0,0"/>
</StackPanel>
</Grid>

3、为Button控件加上Click事件处理方法。

<Button Content="开始识别" FontSize="40" Click="OnClick"/>

4、转到代码视图,先using一下我们要用到的命名空间。

using Windows.Phone.Speech.Recognition;

5、在OnClick方法中加入以下代码。

        private async void OnClick(object sender, RoutedEventArgs e)
{
// 实例化
SpeechRecognizer sr = new SpeechRecognizer();
// 开始识别
Button btn = (Button)sender;
btn.IsEnabled = false;
SpeechRecognitionResult result = await sr.RecognizeAsync();
// 显示被识别的文本
txtInput.Text = result.Text;
btn.IsEnabled = true;
}

6、原则上,我们的高大上示例已经完成了,不过,还有一个小步骤,打开清单文件——WMAppManifest.xml,加上以下功能需求项:
ID_CAP_NETWORKING:允许使用网络,启用语音识别是必须项。

ID_CAP_MICROPHONE:都说语音识别了,话筒怎么能少呢?

ID_CAP_SPEECH_RECOGNITION:使应用支持语音识别。

即:

    <Capabilities>
<Capability Name="ID_CAP_NETWORKING" />
<Capability Name="ID_CAP_MEDIALIB_AUDIO" />
<Capability Name="ID_CAP_MEDIALIB_PLAYBACK" />
<Capability Name="ID_CAP_SENSORS" />
<Capability Name="ID_CAP_WEBBROWSERCOMPONENT" />
<Capability Name="ID_CAP_MICROPHONE" />
<Capability Name="ID_CAP_SPEECH_RECOGNITION" />
</Capabilities>

现在,请确保你的手机已经连上网络,建议连Wi-Fi,因为老虎网络会计流量的,成本较高。
好,不要犹豫,果断运行吧。当你看到程序运行后,请点击“开始识别”按钮,然后对着手机拼命表白,稍等一会,识别结果会显示在页面的文本框中,如下图所示。

唉,这时候,估计大伙要说我是骗子,是的,意外地报错了,我虽不敢说都报错,至少经过我测试,大多数时候,都会发生异常,这可能是系统的听写模式仍未对中文友好支持的原因。没事,既然听写模式不行,那咱们就来搜索模式。
在上面的OnClick上把代码改为如下:

        private async void OnClick(object sender, RoutedEventArgs e)
{
// 实例化
SpeechRecognizer sr = new SpeechRecognizer();
sr.Grammars.AddGrammarFromPredefinedType("cns", SpeechPredefinedGrammar.WebSearch);
// 开始识别

也就是说加了这一行:

sr.Grammars.AddGrammarFromPredefinedType("cns", SpeechPredefinedGrammar.WebSearch);

cns是一个key名,可以随便取,这行代码就是告诉识别系统:“我要用搜索模式”,搜索模式是可以识别中文的。经过这样一改后,再次运行,然后你对着手机表白一下,好家伙,总算等到结果了。

啊,总算可以了。

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

【补】

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

WP中的语音识别(上):基本识别的更多相关文章

  1. WP中的语音识别(下):语音指令

    除了系统集成的可以用于搜索.启动应用程序等语音命令外,在我们的应用程序内部还能自己定义语音指令,使得我们的APP能与语音操控结合得更加完全. 语音指令是通过一个XML文件来定义的.比如,咱小舅子开了家 ...

  2. 百度DMLC分布式深度机器学习开源项目(简称“深盟”)上线了如xgboost(速度快效果好的Boosting模型)、CXXNET(极致的C++深度学习库)、Minerva(高效灵活的并行深度学习引擎)以及Parameter Server(一小时训练600T数据)等产品,在语音识别、OCR识别、人脸识别以及计算效率提升上发布了多个成熟产品。

    百度为何开源深度机器学习平台?   有一系列领先优势的百度却选择开源其深度机器学习平台,为何交底自己的核心技术?深思之下,却是在面对业界无奈时的远见之举.   5月20日,百度在github上开源了其 ...

  3. 防止在iOS设备中的Safari将数字识别为电话号码

    在测试中发现iPad上的Safari总会把长串数字识别为电话号码,文字变成蓝色,点击还会弹出菜单添加到通讯录. 别的地方倒也罢了,如果在用户名中出现数字(手机注册新浪微博的话用户名就是“手机用户xxx ...

  4. python中使用Opencv进行人脸识别

    上一节讲到人脸检测,现在讲一下人脸识别.具体是通过程序采集图像并进行训练,并且基于这些训练的图像对人脸进行动态识别. 人脸识别前所需要的人脸库可以通过两种方式获得:1.自己从视频获取图像   2.从人 ...

  5. Vue+Typescript中在Vue上挂载axios使用时报错

    Vue+Typescript中在Vue上挂载axios使用时报错 在vue项目开发过程中,为了方便在各个组件中调用axios,我们通常会在入口文件将axios挂载到vue原型身上,如下: main.t ...

  6. OpenCV_contrib里的Text(自然场景图像中的文本检测与识别)

    平台:win10 x64 +VS 2015专业版 +opencv-3.x.+CMake 待解决!!!Issue说明:最近做一些字符识别的事情,想试一下opencv_contrib里的Text(自然场景 ...

  7. JAVA中使用FTPClient上传下载

    Java中使用FTPClient上传下载 在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在c ...

  8. IIS 7 中设置文件上传大小的方法

    在IIS 6.0中设置文件上传大小的方法,就是配置如下节点: <system.web> <httpRuntime maxRequestLength="1918200&quo ...

  9. 4.struts2中的文件上传,下载

    Struts2中文件的上传下载,是借用commons里面的包实现文件的上传,需要导入两个jar commons-fileupload-1.2.2.jar commons-io-2.0.1.jar 实现 ...

随机推荐

  1. jsp入门笔记

    jsp语法 1. declaration 由于访问serlvet只有一个,<%! int i = 0; %>   是servlet的变量,刷新时会不断增加 <% int i = 0; ...

  2. [Java基础]java中this和super

    一.this关键字 1.this概念 (参考:http://www.cnblogs.com/xdp-gacl/p/3636071.html)   this是一个引用,它指向自身的这个对象,它的内存分析 ...

  3. Android中将布局文件转成bitmap

    在实践中发现,有些需要打印的小票高度小于屏幕的高度,而有些小票内容过多高度高于屏幕高度. 小于屏幕高度的布局文件转成bitmap较为容易,高于屏幕高度的布局文件转成长图bitmap较为复杂. 一.小于 ...

  4. HDU1575Tr A(矩阵相乘与快速幂)

    Tr A hdu1575 就是一个快速幂的应用: 只要知道怎么求矩阵相乘!!(比赛就知道会超时,就是没想到快速幂!!!) #include<iostream> #include<st ...

  5. FileInputStream和BufferedInputStream的区别

    FileInputStream 属于数据源 BufferedInputStream 属于FileInputStream的一个装饰 BufferedInputStream 有个内部缓冲区当read时会先 ...

  6. vc编译 curl 7.36.0

    CURL邮件列表中提到官方最新版本的windows devel包中缺少文件,而我又用不到https,所以我就自己下载源码包来编译了 下载源码包:http://curl.haxx.se/download ...

  7. [Asp.net 开发系列之SignalR篇]专题五:SignalR支持的平台

    SignalR支持多种服务器和客户端配置.此外,每种传输方式都有自身的要求限制:如果某种传输方式不被系统支持,SignalR能够优雅地将故障转移到其他类型的传输方式.关于SignalR所支持的传输方式 ...

  8. 共享你的控件 -- 用NuGet包装自己的控件

    简介 在当前的开发中,NuGet的使用已经有了不小的地位,特别是应用.NET Core的UWP开发里,模块化的平台本身更是直接依赖于NuGet这一包管理器. 有时自己开发了一个不错的控组件,想通过Nu ...

  9. Flash 与 php 使用 amfphp

    创建 Flash 项目 使用 Flash Builder 创建一个项目. 创建 Flash 项目时,选择服务器技术为 PHP,并配置好服务器的 Web 根文件夹及根 URL 地址(这里设置根文件夹时, ...

  10. Unity3D热更新全书-脚本(三) C#LightEvil语法与调试

    调试,这是一个无法规避的问题 C#Light 由于有 词法解释.语法解释.运行时三种情况 所以和C#也是有类似的问题 出错大致可以分为编译错误和运行时错误 拼写出莫名的东西或者语法不正确,会在编译阶段 ...