二. 具体操作步骤
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"/> <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 杨明雪)