声纹识别 iOS SDK 文档

1、简介

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

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

MSC SDK的主要功能接口如下图所示:

语音评测的使用主要有三个步骤:

2、SDK集成指南

第一步:获取appid

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++。

注意

  1. 添加iflyMSC.framework时,请检查工程BuildSetting中的framwork path的设置,如果出现找不到framework的情况,可以将path清空,在Xcode中删除framework,然后重新添加。
  2. iflyMSC.framework最低支持iOS 8.0。

设置Bitcode

在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-nanchang.cn/doc/mscapi/iOS/iosverifier.html

3、声纹识别

声纹注册

//设置声纹工作参数
//设置密码类型,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应用平台。

声纹识别支持什么语言?

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

声纹识别是否支持离线?

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

iOS声纹sdk如何下载试用?

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

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

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