声纹识别(Voiceprint Recognition),是一项提取说话人声音特征和说话内容信息,自动核验说话人身份的技术。MSC SDK 声纹识别(IdentityVerfier)的使用包括注册(训练)、验证和模型操作。类似于一个网站的用户登录一样,用户必须先注册,才能登录(验证),在用户忘记密码时,可以提供重设密码的操作(模型操作)。
语音合成详细的接口介绍及说明请参考: MSC Android API 文档, 在集成过程中如有疑问,可登录讯飞开放平台论坛,查找答案或与其他开发者交流。
MSC SDK的主要功能接口如下图所示:
语音评测的使用主要有三个步骤:
appid是第三方应用集成讯飞开放平台SDK的身份标识,SDK静态库和appid是绑定的,每款应用必须保持唯一,否则会出现10407错误码。appid在开放平台申请应用时可以获得,下载SDK后可从SDK中sample文件夹的Demo工程里找到(例如: /sample/MSCDemo/MSCDemo/Definition.h 的APPID_VALUE)。
将开发工具包中lib目录下的iflyMSC.framework添加到工程中。同时请将Demo中依赖的其他库也添加到工程中。 按下图示例添加 SDK 所需要的 iOS系统库:
库名称 | 添加范围 | 功能 |
---|---|---|
iflyMSC.framework | 必要 | 讯飞开放平台静态库。 |
libz.tbd | 必要 | 用于压缩、加密算法。 |
AVFoundation.framework | 必要 | 用于系统录音和播放 。 |
SystemConfiguration.framework | 系统库 | 用于系统设置。 |
Foundation.framework | 必要 | 基本库。 |
CoreTelephony.framework | 必要 | 用于电话相关操作。 |
AudioToolbox.framework | 必要 | 用于系统录音和播放。 |
UIKit.framework | 必要 | 用于界面显示。 |
CoreLocation.framework | 必要 | 用于定位。 |
Contacts.framework | 必要 | 用于联系人。 |
AddressBook.framework | 必要 | 用于联系人。 |
QuartzCore.framework | 必要 | 用于界面显示。 |
CoreGraphics.framework | 必要 | 用于界面显示。 |
libc++.tbd | 必要 | 用于支持C++。 |
注意:
在Xcode 7,8默认开启了Bitcode,而Bitcode 需要工程依赖的所有类库同时支持。MSC SDK暂时还不支持Bitcode,可以先临时关闭。后续MSC SDK支持Bitcode 时,会在讯飞开放平台上进行SDK版本更新,请关注。关闭此设置,只需在Targets - Build Settings 中搜索Bitcode 即可,找到相应选项,设置为NO。
iOS 10发布以来,苹果为了用户信息安全,加入隐私权限设置机制,让用户来选择是否允许。 隐私权限配置可在info.plist 新增相关privacy字段,MSC SDK中需要用到的权限主要包括麦克风权限、联系人权限和地理位置权限:
<key>NSMicrophoneUsageDescription</key>
<string></string>
<key>NSLocationUsageDescription</key>
<string></string>
<key>NSLocationAlwaysUsageDescription</key>
<string></string>
<key>NSContactsUsageDescription</key>
<string></string>
即在Info.plist 中增加下图设置:
初始化示例:
//Appid是应用的身份信息,具有唯一性,初始化时必须要传入Appid。
NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@", @"YourAppid"];
[IFlySpeechUtility createUtility:initString];
参数 | 说明 | 必填 |
---|---|---|
appid | 8位16进制数字字符串,应用的唯一标识,与下载的SDK一一对应。 | 是 |
usr | 保留字段,无需关注。 | 否 |
pwd | 保留字段,无需关注。 | 否 |
注意: 初始化是一个异步过程,可放在App启动时执行初始化,具体代码可以参照Demo的MSCAppDelegate.m。
所有的服务皆遵循如下的流程,如下图:
所有服务的API详细说明可参见:https://www.ai-sip.com/doc/mscapi/iOS/iosverifier.html
//设置声纹工作参数
//设置密码类型,pwdt的取值为1、3,分别表示文本密码和数字密码
[self.identityVerifier setParameter:[NSString stringWithFormat:@"%d",pwdt] forKey:@"pwdt"];
pwdt的取值说明如下表所示:
值 | 说明 |
---|---|
1 | 文本密码。用户通过读出指定的文本内容来进行声纹注册和验证,现阶段支持的文本只有“芝麻开门”一种。 |
3 | 数字密码。从云端拉取一组特定的数字串(共分5组,每组8位数字),用户依次读出这5组数字进行注册,在验证过程中会生成一串特定的数字,用户通过朗读这串数字进行验证。 |
密码内容需调用接口从云端获取:
//通过调用getPasswordList方法来获取密码。
//获取密码的时候需指定声纹密码类型,pwdt为1表示固定文本密码,pwdt为3表示数字密码。 //getPasswordList可以参照demo所示。NSString *paramTemp = [NSString stringWithFormat:@"sub=ivp,rse=utf-8,pwdt=%d,",pwdt];
获取到密码后,接下来进行声纹注册。
// 设置业务类型为训练
[self.identityVerifier setParameter:@"enroll" forKey:@"MFV_SST"];
// 设置密码类型
[self.identityVerifier setParameter:[NSString stringWithFormat:@"%d",pwdt] forKey:@"pwdt"];
// 对于文本密码和数字密码,必须设置密码的文本内容.
// ptxt的取值为“我的地盘我做主”、“移动改变生活”、“芝麻开门”或者是从云端拉取的数字密码(每8位用“-”隔开)。
[self.identityVerifier setParameter:ptxt forKey:@"ptxt"];
// 设置声纹对应的auth_id,它用于标识声纹对应的用户
[self.identityVerifier setParameter:auth_id forKey:@"auth_id"];
// 设置有效录音时间
[self.identityVerifier setParameter:@"3000" forKey:@"vad_timeout"];
// 末端静音检测时间,用于检测到静音自动停止录音
[self.identityVerifier setParameter:@"700" forKey:@"vad_speech_tail"];
// 启动训练服务
// 开始注册,当得到注册结果时,SDK会将其封装成NSDictionary对象,回调onResult方法进行处理,处理方法详见Demo示例
[self.identityVerifier startListening];
// 声纹协议IFlyISVDelegate实现
//会话结果返回回调
-(void) onResult:(NSDictionary *)dic;
//会话结束回调
-(void) onCompleted:(IFlySpeechError *) errorCode;
//结果处理中回调
-(void) onRecognition;
//录音音量改变回调
-(void) onVolumeChanged: (int)volume;
推荐在注册声纹模型时每个用户都指定一个唯一的auth_id。auth_id的格式为:6-18个字符,为字母、数字和下划线的组合且必须以字母开头,不支持中文字符,不能包含空格。 开发者通过重写onResult方法来处理注册和验证结果。在结果result中携带错误码,用来判别注册是否成功以及出错原因,部分错误码的含义如下表所示:
错误码 | 说明 |
---|---|
10106 | 缺少某个必要参数 |
10107 | 某个必要参数存在但无效 |
10110 | 引擎授权不足或者说授权客户端用户数达到上限 |
10114 | 操作超时 |
10116 | 数据库中模型不存在 |
10212 | 数据库中模型已经存在 |
10400 | 数据库中一般性错误,此时此ssb已经登录超过3次且均失败 |
10407 | APPID非法 |
10606 | 音频太短 |
声纹验证过程与声纹注册类似,不同之处仅在于“sst”参数需要设置为“verify”,其他参数的设置、验证结果的处理过程可参考上一节。 另外,为了达到较好的效果,请在声纹注册与验证过程中尽量与麦克风保持同样的距离(建议的最佳距离是15厘米左右)。若距离较远,可能会对验证通过率产生较大影响。
声纹注册成功后,在云端会生成一个对应的模型来存储声纹信息,声纹模型的操作即对模型进行查询和删除。
//开发者调用sendRequest方法查询或者删除模型,该函数的定义如下:
//cmd: @”query”表示查询,@”del”表示删除
//auth_id表示用户名;
//pwdt表示声纹类型;
//ptxt表示查询或者删除的密码文本;
//vid是用户注册成功后服务器返回的32位标识,查询和删除时,vid可以设置为nil;
//err是查询的错误码。 通常查询或者删除成功,该函数会返回YES,否则返回NO;
-(BOOL) sendRequest:(NSString*)cmd authid:(NSString *)auth_id pwdt:(int)pwdt ptxt:(NSString *)ptxt vid:(NSString *)vid err:(int *)err;
文本密码JSON示例:
{
"txt_pwd": [
"我的地盘我做主",
"移动改变生活",
"芝麻开门"
]
}
数字密码JSON示例:
{
"num_pwd": [
"03285469",
"09734658",
"53894276",
"57392804",
"68294073"
]
}
声纹业务结果(VerifierResult)成员说明:
成员 | 说明 |
---|---|
sst | 业务类型,取值为train或verify |
ret | 返回值,0为成功,-1为失败 |
vid | 注册成功的声纹模型id |
score | 当前声纹相似度 |
suc | 本次注册已成功的训练次数 |
rgn | 本次注册需要的训练次数 |
trs | 注册完成描述信息 |
err | 注册/验证返回的错误码 |
dcs | 描述信息 |
JSON字段 | 类型 | 说明 |
---|---|---|
ssub | String | 业务类型,声纹业务为ivp |
sst | String | 子业务类型,注册业务为enroll |
ret | int | 返回值,0为请求成功,其他为请求失败 |
rgn | int | 本次注册需要的训练次数 |
suc | int | 本次注册已成功的训练次数 |
vid | string | 声纹模型id(当前无需关注) |
声纹注册结果示例:
{
"vid":"418bf8071f6a56be862f9b1681395a7f",
"suc": 5,
"rgn": 5,
"sst": "enroll",
"ssub": "ivp",
"ret": 0
}
JSON字段 | 类型 | 说明 |
---|---|---|
ssub | String | 业务类型,取值: ivp:声纹业务; ifr:人脸业务(暂无查询业务); |
ret | int | 返回值,0为请求成功,其他为请求失败 |
sst | String | 子业务类型,取值: query:查询模型; delete:删除模型; |
查询结果示例 :
{
"ssub": "ivp",
"sst": "query",
"ret": 0
}
删除结果示例:
{
"ssub": "ivp",
"sst": "delete",
"ret": 0
}
答:声纹识别,是一项提取说话人声音特征和说话内容信息,自动核验说话人身份的技术。
答:目前声纹识别支持Android/IOS应用平台。
答:目前声纹识别支持的语言是:中文数字。
答:目前还没有离线声纹识别功能。
答:文档中心---快速指引有介绍步骤根据步骤下载声纹sdk
答:登录讯飞开放平台---控制台---我的应用(没有应用先创建一个应用)---其他---声纹识别---服务管理(可免费调用SDK接口500次服务量/日)