微信语音识别接口开发指南(Android 版)
微信语音识别接口可以在线识别语音,返回语音的文字内容。满足用户的语音输入需求,提高移动应用的用户语音输入体验。基于微信扎实的技术积累,保障了语音识别质量和服务稳定性。 使用说明本文档主要介绍微信语音识别接口(Android版)使用方法,利用 SDK 可以直接完成从录音到网络传输、云端语音识别、结果获取、语音合成等一系列动作。 本文属于入门级文档,旨在帮助开发者快速学习 Android SDK 的使用并应用到自身开发工作。具体 API 可到附件下载《微信语音SDK(Android版)开发手册》进行查询。 准备工作第一步 创建移动应用请到“管理中心”中点击“创建移动应用”,填写相关资料,然后将该应用提交审核,只有审核通过的应用才能进行开发。 申请资料中需要提交应用签名值,可前往附件下载签名生成工具。 注册完毕,我们会在 7 个工作日内完成审核工作。 审核通过之后,开放平台将分配给该移动应用全局唯一的AppID 第二步 下载 Android SDK附件下载 Android SDK,压缩包中包括 Demo+SDK+开发文档。其中的 Demo 使用 SDK 的各功能 API;SDK 包括.so 和.jar 文件。 Demo介绍为了更好的理解微信语音 SDK 的使用,下面将通过一个简单的实例来讲解一下 SDK 各个关键 API 接口的使用。 2. 开发工具Android 开发工具有很多,开发者可以根据自身的喜好来选择。在讲解本示例的时候,我们将使用 Eclipse 来一步步分析。 2. 工程配置首先新建一个示例工程,按以下步骤进行配置。 i. 引入.so 文件如下图,在 libs\armeabi 目录下粘贴 libWXVoice.so 文件。 ii. 引入 jar 包:在工程属性->Java Build Path->Libraries 中选择“Add External JARs”,选定 wxvoice.jar,确定后返回,完成后的效果如图 1 所示。 3. AndroidManifest.xml 设置i. 添加必要的权限支持::<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
4. 语音识别 Demo(包括通用识别和语法识别)关于界面的构建此处不进行介绍, 下面着重介绍语音识别 SDK 各 API 的使用: i. 初始化VoiceRecognizer.shareInstance().setSilentTime(1000);
VoiceRecognizer.shareInstance().setListener((VoiceRecognizerListener)this);
if (VoiceRecognizer.shareInstance().init(this, screKey) != 0) {
//初始化失败
}
注:此处的screKey就是在官网上申请的应用授权码;对于语法识别将VoiceRecognizer 类替换成 VoiceRecognizerGrammar。 ii. 开始识别通用识别:
VoiceRecognizer.shareInstance().start();
语法识别:
VoiceRecognizerGrammar.shareInstance().start(text, type)
注:text 是语法的具体内容, type 是语法类型,ABNF 语法类型为 0, 自定义词表识别类型为 1。 开始后的各种阶段状态将由 public void onGetVoiceRecordState(VoiceRecordState state)回调获取。 iii. 结束录音接口结束录音有两种方式, 一种是使用下面的口: 通用识别:
VoiceRecognizer.shareInstance().stop();
语法识别:
VoiceRecognizerGrammar.shareInstance().stop();
另外一点是等待程序的静音检测, 自动结束录音。设置静音检测时长的接口为 setSilentTime(int time), 上面初始化中已经介绍。 默认静音时长为 1.5 秒。 iv. 取消识别通用识别:
VoiceRecognizer.shareInstance().cancel();
语法识别:
VoiceRecognizerGrammar.shareInstance().cancel();
此接口如果返回非 0 值, 则表示 cancel 过程结束, 否则其状态将通过 public void onGetVoiceRecordState(VoiceRecordState state)回调获取。 v. 实现 VoiceRecognizerListener,并重写其函数直接在 Activity 类中实现 VoiceRecognizerListener(或者 VoiceRecognizerGrammar),重写 VoiceRecognizerListener 各函数如下所示: @Override public void onGetError(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void onGetResult(VoiceRecognizerResult result) {
// TODO Auto-generated method stub
String res = "";
if (result != null && result.words != null) {
int wordSize = result.words.size();
StringBuilder results = new StringBuilder();
for (int i = 0; i<wordsize; ++i)="" {=""
Word word = (Word) result.words.get(i);
if (word != null && word.text != null){
results.append("\r\n");
results.append(word.text.replace(" ", ""));
}
}
results.append("\r\n");
res = results.toString();
}
}
@Override
public void onGetVoiceRecordState(VoiceRecordState state) {
// TODO Auto-generated method stub
}
@Override
public void onVolumeChanged(int arg0) {
// TODO Auto-generated method stub
}
此接口如果返回非 0 值, 则表示 cancel 过程结束, 否则其状态将通过 public void onGetVoiceRecordState(VoiceRecordState state)回调获取。 vi. 释放系统资源通用识别:
VoiceRecognizer.shareInstance().destroy();
语法识别:
VoiceRecognizerGrammar.shareInstance().destroy();
注:调用此函数, 需要确保识别过程或者 cancel 过程已经结束, 否则会出现问题。 vii. Demo 截图编译运行,图 2、图 3 和图 4 分别是通用语音识别、自定义词表识别和 ABNF 语法识别显示的界面: 5. 语音识别 Demo(有 UI 版)i. 初始化mVoiceRecognizerDialog = new VoiceRecognizerDialog(this, mType);
mVoiceRecognizerDialog.setSilentTime(1000);
mVoiceRecognizerDialog.setOnRecognizerResultListener(this);
mRecoInitSucc = mVoiceRecognizerDialog.init(MainActivity.screKey);
if (mRecoInitSucc != 0) {
mResText.setText("语音识别引擎初始化失败");
}
注:mType 用于设置识别的类型, -1:通用识别, 0:ABNF 语法识别, 1:自定义词表识别。 ii. 开始识别通用识别: mVoiceRecognizerDialog.show(); 语法识别: mVoiceRecognizerDialog.show(mSynWords, mType); iii. 退出弹窗mVoiceRecognizerDialog.onDismiss(); iv. 释放系统资源mVoiceRecognizerDialog.onDestroy(); v. Demo 截图附录1:无 UI 的使用规范微信语音开放平台免费为你的应用提供语音识别服务,你可以根据自己的风格自由制定 UI,但需在语音采集识别的窗口正确、完整的标注“语音技术由微信开放平台提供”的字样。参考如下弹窗: 附录2:ABNF语法手册语音识别语法用来告知语音识别器(Recognizer)所要识别的语句形式。它包括: 1. 用户将要说的词汇(word) 2. 将要出现的词汇的模式(pattern) 3. 每个词汇的语言
语法文档被编译成识别网络后,将被送往语音识别器。语音识别器提取输入语音的特征信息并在识别网络上进行路径匹配,最终识别出用户说话的内容。因此语法是语音识别系统的输入之一,它是现阶段语音识别得以应用的必要条件。 #ABNF 1.0 UTF-8;
language zh-cn;
mode voice;
root basicCmd =[查询]allnames = (成乐 | 京昆 | 广深)[高速];
例如,开发一个高速路况查询的简单语音识别系统,可以定义如下的语法:目前,语音识别语法可以采用的是ABNF形式,ABNF形式简练,便于用户理解和书写。 ABNF 文档包括两个部分,文档首部(header)和主体(body)文档首部定义了文档的各种属性,而文档的主体则具体定义了用户说话的内容和模式。文档首部包括: 语音识别语法用来告知语音识别器(Recognizer)所要识别的语句形式。它包括: 1. BNF文档自标识头 2. 语言 3. 模式 4. 根规则
注意:文档首部必须出现在文档的开头部分,也就是说一旦出现了第一个规则定义,即宣告文档首部的结束,出现在文档主体中的文档首部声明,作为文档主体(规则扩展)看待,通常会引起编译器报错。用户务必注意这一点。 1. ABNF文档自标识头(Self-Identifying Header,强制)ABNF文档必须在其第一行包含一个形式如下的自标识头: #ABNF VersionNumber CharEncoding ; 文档自标识头定义了文档的版本和编码格式。其中: VersionNumber指定语法文档版本号,目前版本号必须是1.0。 CharEncoding指定语法文档字符编码类型,其默认值是GB2312。 开发语法时,请确保文档自标识头声明的字符编码类型和文件的真实字符编码类型是统一的。 例如,如果声明的文档编码格式是UTF-8的编码格式,文档的内容必须采用这一格式。因为语法编译系统依靠这一声明的字符编码,把文档转换成统一的Unicode格式。因此,如果声明的字符编码和文件真实的字符编码不一致,那么转换会出错。 讯飞语音识别系统的语法编译子系统可以支持ISO-8859-1、GB2312、GBK、UTF-8、UTF-16LE、UTF-16BE等多种格式的文本编码方式。 推荐中国大陆用户使用GB2312编码类型,并在语法中预先声明它。 #ABNF 1.0 GB2312;
2. 语言声明(Language,可选)在进行中文识别时,推荐使用的语言声明为zh-cn。ABNF语言声明具有以下形式: language zh-cn;
3. 模式(Mode,强制)目前,语法引擎仅支持voice模式。 mode voice;
整个语法主体的规则扩展展开是一棵或多棵语法树,在应用中推荐为语法指定一个根规则,根规则可以看作是整个语法树的根,同时根规则也定义了外部引用该语法的默认引用规则。外部引用的根规则必须定义成public的。注意一个语法文档能且只能定义一个根规则。 ABNF根规则声明具有如下形式: root $basicCmd; 注释(可选)
语法文档中可以使用注释。ABNF形式的注释如下: // C++/Java-style single-line comment
/* C/C++/Java-style comment */
/** Java-style documentation comment */
语音识别语法是通过规则定义(Rule Definition)和规则引用(Rule Reference)来组成语法主体(Body)的。规则引用的各种组合通称为规则扩展(Rule Expansion)。规则扩展是一个正则表达式。一个规则定义用“=”把规则名称和规则内容联系起来,规则名称具有“$+字符串的形式”,而规则内容就是所谓的规则扩展。规则扩展的最基本的结构是顺序、选择和循环。 [scope] $ruleName = ruleExpansion;
在高速公路路况查询的语法中: public allnames 路况;
$allnames =
(成乐 | 京昆| 广深 )[高速];
第一行根规则 = 的本地规则引用。在规则引用时必须注意:规则名称和后面的中文之间必须有空格或换行等,否则编译器会将“( | 京昆路况”(无空格)识别成一个规则,而不是将“ | 广深 )[高速]; ”识别成一个规则,从而造成编译错误。一个规则定义可以连续引用多个规则名,记号名以及它们的各种组合:包括顺序结构、选择结构、重复结构、可选结构。 4. 顺序结构一个规则定义可以连续引用多个规则名,记号名以及它们的各种组合。序列相当于程序设计中的顺序结构。例如ABNF形式: 这是一个测试用例 // token的序列 object //规则引用的序列 (查询 $allnames 路况) //用括号来封装 5. 选择结构在规则扩展中选择结构表示说话时只可能覆盖其中的一条路径,它相当于程序设计语言中的选择结构。选择结构的在ABNF中用“|”来分隔多个选择分支: $allnames = 重复结构 成乐 | 京昆 | 广深 ;
重复结构用来在语法中表示需要重复说出的内容,它特别适合表示诸如数字串识别等有一些简单词语反复出现构成的语法结构。 ABNF 形式的重复结构可以由在被引用语法结构(规则、记号或它们的任意组合)后加上重复标签<min – max>来设定。min表示最小重复次数,max表示最大重复次数。 ABNF形式的重复结构表示的一个例子如下: digit<2-8>;
$digit = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0;
6. 可选结构在高速公路路况查询的语法中,查询一词可出现,也可不出现,用[]表示其可选性: public allnames 路况;
在语法开发的过程中,用户还必须注意下面这些问题:
|