# 声纹识别 Android SDK 文档

# 1、简介

声纹识别(Voiceprint Recognize),是一项提取说话人声音特征和说话内容信息,自动核验说话人身份的技术。MSC SDK 声纹识别(IdentityVerfier)的使用包括注册(训练)、验证和模型操作。类似于一个网站的用户登录一样,用户必须先注册,才能登录(验证),在用户忘记密码时,可以提供重设密码的操作(模型操作)。

语音合成详细的接口介绍及说明请参考: MSC Android API 文档, 在集成过程中如有疑问,可登录语音云开发者论坛,查找答案或与其他开发者交流。

# 2、SDK集成指南

# 1、导入SDK

将在官网下载的Android SDK 压缩包中libs目录下所有子文件拷贝至Android工程的libs目录下。如下图所示:

注:

  1. arm版本已经逐步淘汰了,arm架构的推荐使用armeabi-v7a。
  2. 如果您需要将应用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");

createUtility方法的第二个参数为传入的初始化参数列表,可配置的参数如下:

参数 说明 必填
appid 8位16进制数字字符串,应用的唯一标识,与下载的SDK一一对应。
usr 开发者在云平台上注册的账号。
pwd 账号对应的密码,与账号同时存在。
engine_mode 引擎模式,可选值为:msc:只使用MSC的能力;plus:只使用语记能力;auto:云端使用MSC,本地使用语记;默认取值为auto。注:使用MSC本地功能的请设置为msc。
force_login 在createUtility时会对进程名称进行检查,如果名称与应用包名不一致则不进行login操作,返回null,用以规避在子进程反复进行调用的问题。此参数设置是否强制login。默认值:false (进行检查,不强制login)。
lib_name 在createUtility时会加载动态库,此时可以传入动态库名称。例如:libmsc_xxx_1072.so(xxx为您的公司名,1072为科大讯飞sdk版本号), 默认值:msc。注:如您是预装软件,为了避免动态库冲突建议修改名称。

注意:参数需要以键值对的形式存储在字符串中传入createUtility方法,以逗号隔开,如“appid=12345678,usr=iflytekcloud,pwd=123456”。

# 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
}

# 9、常见问题

# 声纹识别的主要功能是什么?

答:声纹识别,是一项提取说话人声音特征和说话内容信息,自动核验说话人身份的技术。

# 声纹识别支持什么应用平台?

答:目前声纹识别支持Android/IOS应用平台。

# 声纹识别支持什么语言?

答:目前声纹识别支持的语言是:中文数字。

# 声纹识别是否支持离线?

答:目前还没有离线声纹识别功能。

# 安卓声纹sdk如何下载试用?

答:文档中心---快速指引有介绍步骤根据步骤下载声纹sdk

# 声纹识别如何试用免费次数?免费次数是多少?

答:登录讯飞开放平台---控制台---我的应用(没有应用先创建一个应用)---其他---声纹识别---服务管理(可免费调用SDK接口500次服务量/日)