随着智能家居概念的火热,语音交互这一新时代的人机交互方式再度掀起了热潮。移动互联网应用在设计开发时也纷纷考虑加入语音识别功能,带给用户除传统键盘或触控交互方式外的更便捷交互体验。中国移动近日推出的“灵犀云”,作为新一代的智能语音云平台,正致力于为应用提供全方位的智能语音能力服务,带给用户高效、准确、智能的交互体验。
基于中移动与语音行业领军者科大讯飞的深度战略合作背景,灵犀云的核心技术源自科大讯飞。凭借电信级网络及4G服务的优势,灵犀云在语音服务质量上具备领先优势。这也是继双方此前面向广大用户推出灵犀语音助手APP后,中移动向广大应用开发者们呈献的一大利器,助力应用进入智能交互时代。
这篇文章主要介绍利用灵犀云SDK(android)实现声纹识别的方法:
与指纹一样,声纹也是一种独一无二的生理特征,可以用来鉴别用户的身份。声纹密码的使用
包括以下过程:
1. 初始化
创建用户语音配置对象后才可以使用声纹服务,建议在程序入口处调用。
//将“12345678”替换成您申请的APPID,申请地址:http://dev.10086.cn/
SpeechUtility.createUtility(context,SpeechConstant.APPID+"=12345678");
// 首先创建SpeakerVerifier对象
mVerify = SpeakerVerifier.createVerifier(this, null);
// 通过setParameter设置密码类型,pwdType的取值为1、2、3,分别表示文本密码、自由说和数字密码
mVerify.setParameter(SpeechConstant.ISV_PWDT, "" + pwdType);
pwdType取值 | 说明 |
1 | 文本密码。用户通过读出指定的文本内容来进行声纹注册和验证,现阶段支持的文本有“芝麻开门”。 |
2 | 自由说密码。用户通过读一段文字来进行声纹注册和验证,注册时要求声音长度为20秒左右,验证时要求15秒左右,内容不限。 |
3 | 数字密码。从云端拉取若干组特定的数字串(默认有5组,每组8位数字),用户依次读出这5组数字进行注册,在验证过程中会生成一串特定的数字,用户通过读出这串数字进行验证。 |
除自由说外,其他两种密码需调用接口从云端获取:
// 通过调用getPasswordList方法来获取密码。mPwdListener是一个回调接口,当获取到密码后,SDK会调用其中的onBufferReceived方法对云端返回的JSON格式(具体格式见附录(4))的密码进行处理,处理方法详见声纹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.ISV_AUTHID, auth_id);
// 开始注册,当得到注册结果时,SDK会将其封装成VerifierResult对象,回调VerifierListener对象listener的onResult方法进行处理,处理方法详见Demo示例
mVerify.startListening(mRegisterListener);
VerifierListener mRegisterListener =new VerifierListener() {
public void onVolumeChanged(int volume) {}
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() {}
};
错误码 |
说明 |
MSS_ERROR_IVP_GENERAL | 正常,请继续传音频 |
MSS_ERROR_IVP_EXTRA_RGN_SOPPORT | rgn超过最大支持次数9 |
MSS_ERROR_IVP_TRUNCATED | 音频波形幅度太大,超出系统范围,发生截幅 |
MSS_ERROR_IVP_MUCH_NOISE | 太多噪音 |
MSS_ERROR_IVP_TOO_LOW | 声音太小 |
MSS_ERROR_IVP_ZERO_AUDIO | 没检测到音频 |
MSS_ERROR_IVP_UTTER_TOO_SHORT | 音频太短 |
MSS_ERROR_IVP_TEXT_NOT_MATCH | 音频内容与给定文本不一致 |
MSS_ERROR_IVP_NO_ENOUGH_AUDIO | 音频长达不到自由说的要求 |
验证结果VerifierResult类中有一个vid字段,用于标识成功注册的声注模型。结果中包含的所有字段,以及各字段的含义见附录(4)。
3. 声纹验证
声纹验证过程与声纹注册类似,不同之处仅在于ISV_SST需要设置为“verify”,且不用设置ISV_RGN参数,其他参数的设置、验证结果的处理过程完全可参考上一节。
另外,为了达到较好的效果,请在声纹注册与验证过程中尽量与麦克风保持同样的距离(建议的最佳距离是15厘米左右)。如果距离差距较大的话,可能会对验证通过率产生较大影响。
4. 声纹模型操作
声纹注册成功后,在语音云端上会生成一个对应的模型来存储声纹信息,声纹模型的操作即对模型进行查询和删除。
// 首先设置声纹密码类型
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);