声纹识别 Android SDK 文档
重要提示!!!声纹识别 Android SDK 服务已下线,请新老用户点击此处接入升级后的 WebAPI 声纹服务
1、简介
声纹识别(Voiceprint Recognition),是一项提取说话人声音特征和说话内容信息,自动核验说话人身份的技术。MSC SDK 声纹识别(IdentityVerfier)的使用包括注册(训练)、验证和模型操作。类似于一个网站的用户登录一样,用户必须先注册,才能登录(验证),在用户忘记密码时,可以提供重设密码的操作(模型操作)。
语音合成详细的接口介绍及说明请参考: MSC Android API 文档, 在集成过程中如有疑问,可登录讯飞开放平台论坛,查找答案或与其他开发者交流。
2、SDK集成指南
1、导入SDK
将在官网下载的Android SDK 压缩包中libs目录下所有子文件拷贝至Android工程的libs目录下。如下图所示:
注:
- arm版本已经逐步淘汰了,arm架构的推荐使用armeabi-v7a。
- 如果您需要将应用push到设备使用,请将设备cpu对应指令集的libmsc.so push到/system/lib中。
2、添加用户权限
在工程 AndroidManifest.xml 文件中添加如下权限
<!--连接网络权限,用于执行云端语音能力 -->
<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-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--外存储读权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!--配置权限,用来记录应用配置信息 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<!--手机定位信息,用来为语义等功能提供定位,提供更精准的服务-->
<!--定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
<uses-permission android:name="android.permission.CAMERA" />
注意:如需在打包或者生成APK的时候进行混淆,请在proguard.cfg中添加如下代码:
-keep class com.iflytek.**{*;}
-keepattributes Signature
3、初始化
初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下:
// 将“12345678”替换成您申请的APPID,申请地址:http://www.xfyun.cn
// 请勿在“=”与appid之间添加任何空字符或者转义符
SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678");
3.获取注册密码
目前 MSC SDK 支持两种类型的声纹密码:数字密码和文本密码。文本密码的效果在优化中,建议使用数字密码。密码类型的取值说明如下表所示:
- 文本密码。用户通过读出指定的文本内容来进行声纹注册和验证,现阶段不支持。
- 自由说。用户通过录入一段任意20s以上音频进行注册,验证时录入任意5s以上音频即可完成验证,现阶段不支持。
- 数字密码。从云端拉取若干组特定的数字串(默认有5组,每组8位数字),用户依次读出这5组数字进行注册,在验证过程中会生成一串特定的数字,用户通过读出这串数字进行验证。
// 设置会话场景
mIdVerifier.setParameter(SpeechConstant.MFV_SCENES, "ivp");
// 子业务执行参数,若无可以传空字符传
StringBuffer params = new StringBuffer();
// 设置模型操作的密码类型
params.append("pwdt=" + mPwdType + ",");
// 执行密码下载操作
mIdVerifier.execute("ivp", "download", params.toString(), mDownloadPwdListener);
4.声纹注册
根据返回的注册密码,来进行声纹注册。应用通过 mEnrollListener的 onResult 方法来处理注册结果。在结果result中携带了一个返回码(0表示成功,-1为失败)和错误码(具体错误码信息,请查看这里)
参数说明
- 用户ID(AUTH_ID):标识每个使用声纹功能的终端用户的唯一ID 注:长度为6-18个字符(由英文字母、数字、下划线组成,不能以数字开头),不支持中文字符。
- 业务类型(MFV_SST):用来标识本次会话是注册还是验证
- 密码类型(MFV_PWDT)
- 密码(MFV_PWD):进行声纹注册(训练)时传入的密码
- 模型操作命令(CMD):进行声纹模型查询和删除
- 注册次数(MFV_RGN):声纹训练次数 不同 APPID 的用户 ID 相互独立,即不同的 APPID 可以用相同的用户 ID——他们注册的模型也相互独立。如果您的项目使用了多个appid(例如分Android和iOS两个app版本),需要多个appid的用户id数据打通,可以通过文章末尾的技术支持联系方式与我们联系。
// 设置会话场景
mIdVerifier.setParameter(SpeechConstant.MFV_SCENES, "ivp");
// 设置会话类型
mIdVerifier.setParameter(SpeechConstant.MFV_SST, "enroll");
// 设置训练次数(可以不做设置,sdk中默认设置为5次)
mIdVerifier.setParameter(SpeechConstant.MFV_RGN, "5");
// 用户id
mIdVerifier.setParameter(SpeechConstant.AUTH_ID, authid);
// 设置监听器,开始会话
mIdVerifier.startWorking(mEnrollListener);
5.声纹验证
根据mVerifyListener的onResult方法,得到识别结果
// 清空参数
mIdVerifier.setParameter(SpeechConstant.PARAMS, null);
// 设置会话场景
mIdVerifier.setParameter(SpeechConstant.MFV_SCENES, "ivp");
// 设置会话类型
mIdVerifier.setParameter(SpeechConstant.MFV_SST, "verify");
// 验证模式,单一验证模式:sin
mIdVerifier.setParameter(SpeechConstant.MFV_VCM, "sin");
// 用户的唯一标识,在声纹业务获取注册、验证、查询和删除模型时都要填写,不能为空
mIdVerifier.setParameter(SpeechConstant.AUTH_ID, authid);
// 设置监听器,开始会话
mIdVerifier.startWorking(mVerifyListener);
6.模型操作
声纹注册成功后,在语音云端上会生成一个对应的模型来存储声纹信息,声纹模型的操作即对模型进行查询和删除。
// 设置会话场景
mIdVerifier.setParameter(SpeechConstant.MFV_SCENES, "ivp");
// 用户id
mIdVerifier.setParameter(SpeechConstant.AUTH_ID, authid);
// 子业务执行参数,若无可以传空字符传
StringBuffer params3 = new StringBuffer();
// 设置模型操作的密码类型
params3.append("pwdt=" + mPwdType + ",");
// 执行模型操作,cmd 取值为"query","delete",分别表示查询和删除
mIdVerifier.execute("ivp", cmd, params3.toString(), mModelListener);
7.1:N检索
鉴别与验证的过程相似,不过鉴别需要设置组 ID,以指定要鉴别的组。 其参数设置如下:
// 设置业务场景
mIdVerifier.setParameter( SpeechConstant.MFV_SCENES, "ivp" );
// 设置业务类型:鉴别(identify)
mIdVerifier.setParameter( SpeechConstant.MFV_SST, "identify" );
// 设置监听器,开始会话
mIdVerifier.startWorking( listener );
// 指定组id,最相似结果数
String params = "group_id="+groudID
while( !isDataFinished ){
// 写入数据
mIdVerifier.writeData( scence, params, data, offset, length );
}
mIdVerifier.stopWrite( scence );
8.声纹结果
数字密码JSON示例
{"num_pwd":["03285469","09734658","53894276","57392804","68294073"]}
声纹业务结果(VerifierResult)成员说明
成员 | 说明 |
---|---|
sst | 业务类型,取值为train或verify |
ret | 返回值,0为成功,-1为失败 |
vid | 注册成功的声纹模型id |
voice_score | 当前声纹相似度 |
suc | 本次注册已成功的训练次数 |
rgn | 本次注册需要的训练次数 |
ssub | 业务类型为ivp |
err | 注册/验证返回的错误码 |
decision | 描述信息,accepted:验证成功,rejected:验证失败 |
声纹1:N检索
JSON字段 | 类型 | 说明 |
---|---|---|
sst | String | 业务类型,鉴别业务为identify |
ssub | String | 子业务类型,取值:ivp:声纹;ifr:人脸。 |
ret | int | 返回值,0为请求成功,其他为请求失败 |
group_id | String | 本次鉴别的成员组id |
group_name | String | 本次鉴别的成员组id对应的组名称 |
topc | int | 本次鉴别返回的结果数 |
model_id | String | 模型id |
decision | String | accepted:匹配成功,rejected:匹配失败 |
score | double | 匹配相似度 |
user_name | String | 该模型对应用户名 |
{
"ret": 0,
"group_id": "xxxxxx",
"group_name": "xxxxxx",
"ifv_result": {
"candidates": [
{
"model_id": "xxxxxxxx",
"decision": "accepted",
"score": 88.888888,
"user": "user_name"
}
]
},
"sst": "identify",
"ssub": "ivp",
"topc": 1
}
3、视频教程
4、常见问题
声纹识别的主要功能是什么,可以过滤不需要的噪音吗?
答:声纹识别,是一项提取说话人声音特征和说话内容信息,自动核验说话人身份的技术。不具有过滤声音的功能。
声纹识别支持什么应用平台?
答:目前声纹识别支持Android/iOS应用平台。
声纹识别支持什么语言?
答:目前声纹识别支持的语言是:中文数字。
声纹识别是否支持离线?
答:目前还没有离线声纹识别功能。
安卓声纹sdk如何下载试用?
答:文档中心---快速指引有介绍步骤根据步骤下载声纹sdk
声纹识别如何试用免费次数?免费次数是多少?
答:登录讯飞开放平台---控制台---我的应用(没有应用先创建一个应用)---其他---声纹识别---服务管理(可免费调用SDK接口500次服务量/日)