public class SpeakerVerifier
extends com.iflytek.cloud.msc.module.SpeechInterface
声纹识别(Voiceprint Recognize),是一项根据语音波形反映说话人生理和行 为特征的语音参数,自动识别说话人身份的技术。声纹识别所提供的安全性可与其他 生物识别技术(指纹、掌形和虹膜)相媲美,且只需要电话和麦克风即可,数据采集 极为方便,造价低廉,是最为经济、可靠、简便和安全的身份识别方式。
声纹密码接口,包含下载密码文本、注册、验证。当前声纹密码,只支持在线方式,
需要网络可用,方可正常使用此功能。当前声纹密码只支持汉语的随机数字串,见
SpeechConstant.ISV_PWDT
参数。 (文本密码及自由说方式正在研发中。)
随机数字串方式,注册时,应用层调用getPasswordList(com.iflytek.cloud.SpeechListener)
获取声纹密码,
将由服务器随机产生2~9组各8位的随机阿拉伯数字串,如
“57280964-96382704-59387624”,通过SpeechListener.onBufferReceived(byte[])
回调给应用层。在获取密码后,应用层调用startListening(com.iflytek.cloud.VerifierListener)
开始注册,通过SDK
内置录音模块(当SpeechConstant.AUDIO_SOURCE
>-1时),或
writeAudio(byte[], int, int)
(当SpeechConstant.AUDIO_SOURCE
=-1时)把用户读
密码的音频依次传给SDK,当一组说完时,SDK将回调VerifierListener.onResult(com.iflytek.cloud.VerifierResult)
通知应用层,当组密码识别的状态,应用层可根据此状态,决定继续进行下一组读密码,
或者重新开始,或者结束注册。在验证时,通过generatePassword(int)
生成随机数
字串密码后,调用startListening(com.iflytek.cloud.VerifierListener)
开始读取用户的音频,并通过
VerifierListener
获取当前验证状态。
固定文本方式,注册时,应用层调用getPasswordList(com.iflytek.cloud.SpeechListener)
获取声纹密码,将由
服务器返回支持的文本密码,当前仅支持文本“芝麻开门”,通过
SpeechListener.onBufferReceived(byte[])
回调给应用层。获取密码后,应用层调用
startListening(com.iflytek.cloud.VerifierListener)
开始注册,通过SDK内置录音模块(当
SpeechConstant.AUDIO_SOURCE
>-1时),或writeAudio(byte[], int, int)
(当
SpeechConstant.AUDIO_SOURCE
=-1时)把用户的密码音频传给SDK。注册
时需要读取获取到的2~9组密码文本,把音频传给SDK,以获取声纹特征。当每次说完时,
SDK将回调VerifierListener.onResult(com.iflytek.cloud.VerifierResult)
通知应用层,当次密码识别的状态,应用
层可根据此状态,决定继续进行下一次读密码,或者重新开始,或者结束注册。在验证时,
同样通过getPasswordList(com.iflytek.cloud.SpeechListener)
获取声纹密码,在获取密码后,应用层调用
startListening(com.iflytek.cloud.VerifierListener)
开始验证,并通过VerifierListener
获取当前验证状态。
自由说方式,注册时,应用层调用startListening(com.iflytek.cloud.VerifierListener)
开始注册,通过SDK内置录
音模块(当SpeechConstant.AUDIO_SOURCE
>-1时),或
writeAudio(byte[], int, int)
(当SpeechConstant.AUDIO_SOURCE
=-1时)把用户的
密码音频传给SDK。注册时只需要一次即可。说完时,SDK将回调
VerifierListener.onResult(com.iflytek.cloud.VerifierResult)
通知应用层,当次密码识别的状态,应用层可根据此
状态,决定已完成注册,或者重新开始,或者结束注册。在验证时,与注册的过程相当。
为了提高安全性,建议应用对用来进行声纹注册的用户ID,与实际用户可见的ID进行映 射,让外部无法通过用户可见ID获取到用户声纹ID。
本类使用单例,调用者使用本类的对象,只需要通过createVerifier(Context, com.iflytek.cloud.InitListener)
创建一次对
象后,便可一直使用该对象,直到通过调用destroy()
进行单例对象销毁。调用者可
通过getVerifier()
获取当前已经创建的单例。在销毁本类的单例对象后,需要先通过
createVerifier(Context, com.iflytek.cloud.InitListener)
再次创建单例对象,方可再使用。
在当前应用生命周期第一次使用本类的任何函数前,须先调用
SpeechUtility.createUtility(Context, java.lang.String)
进行SDK初始化。
VerifierListener
,
VerifierResult
,
SpeechUtility.createUtility(Context, java.lang.String)
限定符和类型 | 方法和说明 |
---|---|
void |
cancel()
取消会话
通过此函数取消当前的会话。
|
static SpeakerVerifier |
createVerifier(Context context,
InitListener listener)
创建单例对象
使用此函数创建一个本类单例对象。
|
boolean |
destroy()
销毁单例对象
通过本函数,销毁由
createVerifier(Context, com.iflytek.cloud.InitListener) 创建的单例对象。 |
java.lang.String |
generatePassword(int length)
生成随机密码
当使用随机密码方式验证时,需要先通过本函数,生成一个指定长度的随机密码,
用于验证时由用户读这个随机密码,服务器通过音频里面随机码及声纹特征是否一致,
验证是否是同一个用户。
|
java.lang.String |
getParameter(java.lang.String key)
获取参数
获取指定的参数的当前值。
|
void |
getPasswordList(SpeechListener listener)
获取声纹密码
在随机密码或固定文本注册或验证时,需要先通过此接口获取声纹密码,再进行注
册或验证。
|
static SpeakerVerifier |
getVerifier()
获取单例对象
通过函数获取已创建的单例对象。
|
boolean |
isListening()
是否在会话中
通过此函数,获取当前SDK是否正在进行声纹会话。
|
void |
sendRequest(java.lang.String cmd,
java.lang.String auth_id,
SpeechListener listener)
模型操作
通过本函数,对已存在的用户声纹模型进行查询和删除。
|
boolean |
setParameter(java.lang.String key,
java.lang.String value)
参数设置
在开始会话前,通过本函数,设置会话的参数。
|
void |
startListening(VerifierListener listener)
开始录音
调用此函数,开始声纹注册和验证。
|
void |
stopListening()
停止录音
调用本函数告知SDK,当前会话音频已全部录入。
|
int |
writeAudio(byte[] buffer,
int offset,
int length)
写入录音数据
通过调用此函数,把音频数据传给SDK。
|
public static SpeakerVerifier createVerifier(Context context, InitListener listener)
使用此函数创建一个本类单例对象。当成功创建一次单例对象后,可一直使用此对象,
直到调用destroy()
销毁已创建的单例对象为止。若在当前应用生命周期内调用
destroy()
前再次调用本函数,则直接返回已创建的单例对象。可通过
getVerifier()
获取已创建的单例对象。
destroy()
,
getVerifier()
public static SpeakerVerifier getVerifier()
通过函数获取已创建的单例对象。当单例对象未创建时,将返回null,此时应先通过
createVerifier(Context, com.iflytek.cloud.InitListener)
创建单例对象。
createVerifier(Context, com.iflytek.cloud.InitListener)
,
destroy()
public void getPasswordList(SpeechListener listener)
在随机密码或固定文本注册或验证时,需要先通过此接口获取声纹密码,再进行注 册或验证。
在调用本函数前,通过setParameter(String, String)
指定参数1为
SpeechConstant.ISV_PWDT
,设置当前要获取的密码类型。获取固定文本密
码时,参数2值为"1";获取随机数字密码时,参数2值为"3"。
文本密码JSON结果示例:{"txt_pwd":["芝麻开门"]}
数字密码JSON结果示例: {"num_pwd":["03285469","09734658","53894276","57392804","68294073"]}
listener
- 获取数据回调,通过此监听获取当前获取密码的状态和结果。密码
结果说明请参考新手指南文档。startListening(com.iflytek.cloud.VerifierListener)
,
setParameter(String, String)
,
SpeechConstant.ISV_PWDT
public java.lang.String generatePassword(int length)
当使用随机密码方式验证时,需要先通过本函数,生成一个指定长度的随机密码, 用于验证时由用户读这个随机密码,服务器通过音频里面随机码及声纹特征是否一致, 验证是否是同一个用户。
length
- 随机字符串长度,当前只支持8位。startListening(VerifierListener)
,
SpeechConstant.ISV_PWDT
public void startListening(VerifierListener listener)
调用此函数,开始声纹注册和验证。
目前声纹功能不支持多线程,所以在一次会话开始(调用本函数或
sendRequest(String, String, SpeechListener)
)后,直到结束前(结果返回完
毕,或出现错误),不能再调用本函数开始新的会话。一次会话,即从会话开始,到结
束为止。
声纹功能使用,包括注册和验证、鉴别(见参数SpeechConstant.ISV_SST
)。
在验证某个音频是否与用户的ID一致前,要先建立这个用户的声纹特征,
此过程称为注册。如前文所说,声纹的验证方式分为固定文本密码、随机数字密码以及
自由说三种方式。相应的,在注册时,也需要使用与验证一致的方式。同一个用户ID可
以注册多种方式的模型,但同一种方式只能有一个模型。可通过模型操作函数
sendRequest(String, String, SpeechListener)
删除不要的模型。
在调用本函数开始注册或验证前,通过setParameter(String, String)
设置相
应的参数。
调用本函数开始声纹后,通过SDK的录音机录取用户通过麦克风读入的音频(当
SpeechConstant.AUDIO_SOURCE
值>=0时),或由应用层调用
writeAudio(byte[], int, int)
写入音频流,获取用于注册或验证的音频。在完成音频
录入(包括麦克风或写音频流方式)后,通过调用stopListening()
告知SDK已完
成音频录入,或由SDK自带的VAD(Voice Activity Detection,静音抑制)自动结束音频录
入,见VerifierListener.onEndOfSpeech()
。(关于写入音流方式的SDK自动结束
录入应注意的地方,请参考writeAudio(byte[], int, int)
;VAD端点长度设置,请
参考setParameter(String, String)
)
可通过cancel()
取消当前的会话。
声纹模型操作请参考sendRequest(String, String, SpeechListener)
。注册过程和
验证结果说明请参考VerifierListener
及VerifierResult
。
listener
- 声纹监听器,获取当前声纹注册或验证、鉴别的状态和结果。createVerifier(Context, com.iflytek.cloud.InitListener)
,
setParameter(String, String)
,
writeAudio(byte[], int, int)
,
stopListening()
,
VerifierListener
,
cancel()
public void stopListening()
调用本函数告知SDK,当前会话音频已全部录入。
在调用本函数后,已录入的音频还在继续上传到服务器,结果不会马上就返回,当前会 话还在继续,直到结果返回完毕,或出现错误。
要取消会话,请参考cancel()
函数。
当应用调用本函数结束停止录音时,SDK不会再回调
VerifierListener.onEndOfSpeech()
。相反的,当SDK回调
VerifierListener.onEndOfSpeech()
时,应用层可不必再调用本函数通知SDK停止
录音。
public int writeAudio(byte[] buffer, int offset, int length)
通过调用此函数,把音频数据传给SDK。
仅在SpeechConstant.AUDIO_SOURCE
值为-1时,需要通过调用本函数,把
音频数据传给SDK。在写入音频数据前,应先通过startListening(VerifierListener)
开启会话。在结束录音数据写入后,调用stopListening()
告知应用层,当前会话
音频数据已全部写入。
当SDK回调VerifierListener.onEndOfSpeech()
时,说明SDK已经通过VAD检测
到了静音末端点,应该立即停止写入音频数据。当SDK回调
VerifierListener.onResult(VerifierResult)
返回完结果,或回调
VerifierListener.onError(SpeechError)
返回错误时,也应该停止当次会话的音频写
入。
声纹支持的音频格式,请参考setParameter(String, String)
的参数说明。
buffer
- 要写入的录音数据缓存offset
- 实际音频在传入缓存的起始点length
- 音频数据长度ErrorCode.SUCCESS
表示成功,其他值表示有错误,
具体错误码,请参考ErrorCode
。startListening(VerifierListener)
,
stopListening()
,
VerifierListener
public boolean isListening()
通过此函数,获取当前SDK是否正在进行声纹会话。应用层可通过此函数,查询能否 开始一路新的会话等。
调用了stopListening()
停止录音后,如果会话未出现错误或返回最后的结果,
当前状态依然处于会话中,即本函数会返回true。如果调用cancel()
取消了会话,
则当前状态处于不在会话中。
startListening(VerifierListener)
,
stopListening()
,
cancel()
public void cancel()
通过此函数取消当前的会话。
在会话被取消后,当前会话结束,未返回的结果将不再返回。
public boolean setParameter(java.lang.String key, java.lang.String value)
在开始会话前,通过本函数,设置会话的参数。
每次设置的参数将在当前单例的生命周期内的后续所有会话生效。某些有默认值的参
数,如SpeechConstant.SAMPLE_RATE
,没有特别需求时,可以不设置。除特
别说明外,所有参数都为可选设置。所有参数的详细说明,请参考
SpeechConstant
。
声纹可设置参数有:
SpeechConstant.WAP_PROXY
:网络类型
SpeechConstant.NET_TIMEOUT
:网络连接超时时间
SpeechConstant.KEY_SPEECH_TIMEOUT
:语音输入超时时间
SpeechConstant.AUDIO_SOURCE
:音频源
SpeechConstant.VAD_BOS
:前端点超时
SpeechConstant.VAD_EOS
:后端点超时
SpeechConstant.SAMPLE_RATE
:识别采样率
SpeechConstant.ISV_SST
:声纹业务类型,必须
SpeechConstant.ISV_VID
:声纹模型id
SpeechConstant.ISV_PWDT
:声纹密码类型,必须
SpeechConstant.ISV_RGN
:训练次数
SpeechConstant.ISV_PWD
:注册、验证使用的声纹密码,必须
SpeechConstant.ISV_AUDIO_PATH
:声纹录音保存路径
SpeechConstant.ISV_CMD
:操作声纹模型的命令,仅在模型操作时使用,必须
SpeechConstant.AUTH_ID
:用户唯一标识(即用户ID), 必须
SpeechConstant.ENGINE_TYPE
:引擎类型(目前声纹认证仅支持在线模式);
当前声纹在随机密码和固定文本密码方式下,支持未压缩的16位,单声道,采样率为 16000,字节顺序为Little-Endian的Windows PCM音频;在自由说方式下,支持未压 缩的16位,单声道,采样率为8000,字节顺序为Little-Endian的Windows PCM音频。
setParameter
在类中 com.iflytek.cloud.msc.module.SpeechInterface
key
- 参数名称value
- 参数值getParameter(String)
,
startListening(VerifierListener)
public java.lang.String getParameter(java.lang.String key)
获取指定的参数的当前值。
某些有默认的值的参数,如SpeechConstant.SAMPLE_RATE
,在应用层未
调用setParameter(String, String)
来设置参数值前,可能获取到的是null值,
但在实际会话会始时,SDK会使用默认值传给服务器。
getParameter
在类中 com.iflytek.cloud.msc.module.SpeechInterface
key
- 参数名称,所有支持参数,参考setParameter(String, String)
SpeechConstant
对各参数的说明。setParameter(String, String)
public boolean destroy()
通过本函数,销毁由createVerifier(Context, com.iflytek.cloud.InitListener)
创建的单例对象。
在调用本函数进行销毁前,应先保证当前不在会话中,否则,本函数将尝试取消当前
会话,并返回false,此时销毁失败。关于当前是否在会话中,请参考函数
isListening()
。若销毁失败,请在取消当前会话后,再次调用本函数重试。
当本函数返回true时,销毁成功。此时,之前创建的单例对象已不能再使用,否则,
将会报错。此时需要再使用声纹,应先通过createVerifier(Context, com.iflytek.cloud.InitListener)
创建一个新的单例
对象。
createVerifier(Context, com.iflytek.cloud.InitListener)
,
cancel()
public void sendRequest(java.lang.String cmd, java.lang.String auth_id, SpeechListener listener)
通过本函数,对已存在的用户声纹模型进行查询和删除。
调用本函数开始查询或删除操作前,需要通过setParameter(String, String)
设置要操作的模型参数。模型参数包括密码类型(SpeechConstant.ISV_PWDT
),
以及所选类型下的相关参数:在固定文本密码方式下的,密码文本值
(SpeechConstant.ISV_PWD
);自由说方式下的采样率
(SpeechConstant.SAMPLE_RATE
);随机密码方式下则不用设置额外的参数。
操作结果将通过SpeechListener.onBufferReceived(byte[])
,结果为ASCII编
码的JSON格式的文本。包含两个参数:"cmd"、"ret"。"cmd"取值与请求时对应,"ret"的
值为ErrorCode.SUCCESS
时,表示操作成功;其他值则是操作失败,如
ErrorCode.MSP_ERROR_FAIL
表示模型不存在等,具体错误码,参考
ErrorCode
。
若出现其他如网络或参数错误,则通过SpeechListener.onCompleted(SpeechError)
返回对应的错误码,具体错误码,参考ErrorCode
。
cmd
- 操作命令,查询:que;删除:del。auth_id
- 授权ID(即用户ID),参考SpeechConstant.AUTH_ID
参数
的说明。listener
- 操作状态监听器,通过监听器获取操作的状态和结果。setParameter(String, String)
,
startListening(VerifierListener)
,
SpeechListener