返回 登录
0

基于讯飞"声纹识别"的本地登录的实现

一. 成果展示(以文本密码为例)
图片描述
图片描述
图片描述
图片描述

二. 具体操作步骤
1. 预备工作
①导入声纹识别 sdk 并新建一个 andriod 工程。
②将 IsvDemo 中 libs 目录下的 Msc.jar 和 armeabi 复制到新建的 Android工程的 libs 目录中,如下图所示:
图片描述

2. 添加用户权限

> <!--连接网络权限,用于执行云端语音能力 --> <uses-permission
> android:name="android.permission.INTERNET"/>
> <!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 --> <uses-permission
> android:name="android.permission.RECORD_AUDIO"/> <!--读取网络信息状态 -->
> <uses-permission
> android:name="android.permission.ACCESS_NETWORK_STATE"/> <!--获取当前 wifi
> 状态 --> <uses-permission
> android:name="android.permission.ACCESS_WIFI_STATE"/> <!--允许程序改变网络连接状态
> --> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <!--读取手机信息权限
> --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
> <!--读取联系人权限,上传联系人需要用到此权限 --> <uses-permission
> android:name="android.permission.READ_CONTACTS"/>
> <!--外存储写入权限,构建语法需要用到此权限 -->
> <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

3 调用声纹识别的接口
3.1 声纹注册
现阶段语音云平台支持三种类型的声纹密码,即文本密码、自由说和数字密码,在注册之前要选择声纹的类型。

// 首先创建 SpeakerVerifier 对象
mVerify = SpeakerVerifier. createVerifier ( this,  null);
// 通过 setParameter 设置密码类型,pwdType 的取值为 1、2、3,分别表示文本密码、自由说和数字密码
mVerify.setParameter(SpeechConstant. ISV_PWDT , "" + pwdType);

pwdType 的取值说明如下表所示:
![图片描述](http://img.blog.csdn.net/20160720152235059)

除自由说外,其他两种密码需调用接口从云端获取:

// 通过调用 getPasswordList 方法来获取密码。mPwdListener 是一个回调接口,当获取到密码后, SDK 会调用其中的 onBufferReceived 方法对云端返回的 JSON 格式)的密码进行处理,处理方法详见声纹 Demo 示例。

mVerify.getPasswordList(SpeechListener mPwdListener);
SpeechListener mPwdListenter = new SpeechListener() {
public void onEvent(int eventType, Bundle params) {}
public void onBufferReceived(byte[] buffer) {}
public void onCompleted(SpeechError error) {}
};

获取到密码后,接下来进行声纹注册,即要求用户朗读若干次指定的内容,这一过程也称为声纹模型的训练。

// 设置业务类型为训练
mVerify.setParameter(SpeechConstant. ISV_SST , "train");
// 设置密码类型
mVerify.setParameter(SpeechConstant. ISV_PWDT , "" + pwdType);
// 对于文本密码和数字密码, 必须设置密码的文本内容, pwdText 的取值为“芝麻开门”或者是从云端拉取的数字密码(每 8 位用“-”隔开,如“62389704-45937680-32758406-29530846-
58206497”)。自由说略过此步
mVerify.setParameter(SpeechConstant. ISV_PWD , pwdText);
// 对于自由说,必须设置采样频率为 8000,并设置 ISV_RGN 为 1。其他密码可略过此步
mVerify.setParameter(SpeechConstant. SAMPLE_RATE ,  "8000");
mVerify.setParameter(SpeechConstant. ISV_RGN , "1");
// 设置声纹模型对应的 AUTH_ID,它是用户的唯一标识,为空时表示这是一个匿名用户
mVerify.setParameter(SpeechConstant. AUTH_ID , auth_id);
// 开始注册,当得到注册结果时,SDK 会将其封装成 VerifierResult 对象,回调 VerifierListener 对象 listener 的 onResult 方法进行处理,处理方法详见 Demo 示例
mVerify.startListening(mRegisterListener);
VerifierListener mRegisterListener = new VerifierListener() {
public  void onVolumeChanged( int volume,  byte [] data) {}
public  void onResult(VerifierResult result) {
public  void onEvent( int eventType,  int arg1,  int arg2, Bundle obj) {}
public  void onError(SpeechError error) {}
public  void onEndOfSpeech() {}
public  void onBeginOfSpeech() {}
};

注意,当 auth_id 为空时(匿名用户) ,将使用设备的设备 ID 来标识注册的声纹模型。 由于设备 ID 不能跨设备,
而且不同的设备所获取到的设备 ID 也有可能相同,推荐的作法是在注册模型的时为app 的每个用户都指定一个唯一的
auth_id。auth_id 的格式为:6-18个字符,为字母、数字和下划线的组合且必须以字母开头,不支持中文字符,不能包含空格。

3.2 声纹验证
声纹验证过程与声纹注册类似,不同之处仅在于 ISV_SST 需要设置为”verify”,且不用设置 ISV_RGN 参数,其他参数的设置、验证结果的处理过程完全可参考上一节。

另外, 为了达到较好的效果, 请在声纹注册与验证过程中尽量与麦克风保持同样的距离(建议的最佳距离是 15 厘米左右) 。如果距离差距较大的话,可能会对验证通过率产生较大影响。

3.3 模型操作
声纹注册成功后,在语音云端上会生成一个对应的模型来存储声纹信息,声纹模型的操作即对模型进行查询和删除。

// 首先设置声纹密码类型
mVerify.setParameter(SpeechConstant. ISV_PWDT , "" + pwdType);
// 对于文本和数字密码,必须设置声纹注册时用的密码文本,pwdText 的取值为“芝麻开门”或者是从云平台拉取的数字密码。自由说略过此步
mVerify.setParameter(SpeechConstant. ISV_PWD , pwdText);
// 特别地,自由说一定要设置采样频率为 8000,其他密码则不需要
mVerify.setParameter(SpeechConstant. SAMPLE_RATE , “8000”);
// 设置待操作的声纹模型的 vid
mVerify.setParameter(SpeechConstant. ISV_VID , vid);
// 调用 sendRequest 方法查询或者删除模型, cmd 的取值为“que”或“del”, 表示查询或者删除, auth_id 是声纹对应的用户标识,操作结果以异步方式回调 SpeechListener 类型对象listener 的 onBufferReceived 方法进行处理,处理方法详见 Demo 示例
mVerify.sendRequest(cmd, auth_id, listener);

讯飞开放平台:http://www.xfyun.cn
(by 杨明雪)

评论