以下描述了如何使用灵云VPR能力。
1. VPR简介
VPR 声纹识别能力,对特定的声音进行模型注册和模型训练后,支持对未知音频的校验。
2. 选择模块和能力
灵云可以提供云端和本地端的声纹识别能力. 无论使用云端或本地端的声纹识别能力,基础模块 hci_vpr都是需要的。 使用云端能力时,需要加上hci_vpr_cloud_recog模块; 使用本地端能力时,需要加上hci_vpr_local_recog模块
3. 声纹特征注册和训练
当调用hci_vpr_enroll接口进行注册时,用户唯一标识可以由服务端产生,也可以由用户自己指定,但必须要保证该标识的唯一性。 注册成功后,可以对该声纹模型进行多次训练。
示例代码如下:
string enrollConfig += "audioformat=" + audioformat;
enrollConfig += ",encode=none";
{
printf("hci_vpr_enroll return %d\n",errCode);
return;
}
4. 声纹特征确认
声纹模型注册和训练成功后,可以对音频数据进行校验,以判断用户唯一标识和音频数据是否相符。
示例代码如下:
string verifyConfig = "userid=" + userID;
verifyConfig = "audioformat=" + audioformat;
verifyConfig += ",encode=none";
errCode =
hci_vpr_verify(nSessionId, voiceData.m_pBuf, voiceData.m_nLen, verifyConfig.c_str(), &pVerifyResult);
{
printf( "hci_vpr_verify return %d\n", errCode );
return;
}
printf( "hci_vpr_verify success\n" );
{
printf( "voice data matches with user id:%s !\n",userID.c_str());
}
else
{
printf("voice data doesn't match with user id:%s !\n",userID.c_str());
}
{
printf( "hci_vpr_free_verify_result return %d\n", errCode );
return;
}
printf( "hci_vpr_free_verify_result success\n" );
5. 声纹特征辨识
对音频数据校验后,需要对音频数据识别,识别结果以分数形式给出。
示例代码如下:
string identify_config = "encode=speex,audioformat= pcm16k16bit,";
identify_config += "groupid=" + groupId;
err_code =
hci_vpr_identify(session_id, voiceData.buff_, voiceData.buff_len_, identify_config.c_str(), &identifyResult);
{
return;
}
PrintIdentifyResult(identifyResult);
{
printf( "hci_vpr_session_stop return %d\n", err_code );
return ;
}
printf( "hci_vpr_session_stop success\n" );
在云端实时识别模式下(本地暂不支持),调用 注册、确认和辨识接口,函数不会将传入的pvVoiceData当成所有的识别数据进行一次完整的识别,用户可以将音频数据分多次来调用 这几个函数。 SDK内部会同时进行状态识别,当检测到音频传输结束,会返回结束状态,用户传入空包即可停止检测。
辨识模块的实时识别的示例如下:
int nPerLen = 3200*20;
int nLen = 0;
char indextmp[10];
while (nLen + nPerLen < voiceData.buff_len_)
{
int nThisLen = 0;
if( voiceData.buff_len_ - nLen >= nPerLen )
{
nThisLen = nPerLen;
}
else
{
nThisLen = voiceData.buff_len_ - nLen;
}
err_code =
hci_vpr_identify(session_id, voiceData.buff_+nLen, nThisLen, identify_config.c_str(), &identifyResult);
if( err_code == HCI_ERR_VPR_REALTING_END )
{
break;
}
nLen += nThisLen;
}
{
err_code =
hci_vpr_identify(session_id, NULL, 0, identify_config.c_str(), &identifyResult);
}
if( err_code == HCI_ERR_VPR_REALTING_END )
{
PrintIdentifyResult(identifyResult);
if( err_code != HCI_ERR_VPR_REALTING_END )
{
printf( "hci_vpr_free_recog_result return %d\n", err_code );
return ;
}
printf( "hci_vpr_free_recog_result success\n" );
}
else
{
printf( "hci_vpr_recog failed with %d\n", err_code );
}