# 身份驗證
[TOC]
身份驗證(**IdentityVerifier**),又稱為多生物特征融合驗證(Multi-biometrics Fusion Verification,簡稱MFV),支持人臉和聲紋的 1:1 單一驗證,1:1 融合驗證,1:N 鑒別。需下載使用對應的身份驗證SDK。
MFV目前提供的功能組合:
| |1:1單一驗證|1:1融合驗證|1:N檢索
| --- | --- | --- | --- |
|人臉|人臉驗證|人臉聲紋融合驗證|人臉鑒別|
|聲紋|聲紋驗證|人臉聲紋融合驗證|聲紋鑒別|
MFV相關概念說明:
| 概念| 英文標識| 說明|
|:---:|:---:|---|
| 用戶id| auth_id| 用戶身份的唯一標識。|
|組id| group_id| 組的唯一標識。<br>組被用來限定1:N鑒別的用戶范圍。|
|特征注冊| enroll| 上傳用戶特征數據,在云端生成特征模型。<br>其中,人臉圖像數據的大小應控制在200K以下。|
|特征驗證| verify| 上傳用戶特征數據,云端將其與已注冊的特征模型<br>進行比對,返回結果(相似度、是否通過驗證等)。|
|融合驗證| mixed verify| 上傳用戶多項特征數據,云端將其與已注冊的多項<br>特征模型進行比對,返回結果(綜合相似度、是否通過驗證等)。|
|特征鑒別| identify| 上傳用戶特征數據,并指定鑒別組id,云端將上傳<br>數據與組內用戶對應的已注冊的特征模型進行比對,<br>返回結果(相似度排行、用戶名稱)。|
|業務場景| scenes| 會話的場景。<br>包括:人臉(ifr),聲紋(ivp),<br>人臉聲紋融合(ifr \| ivp),組管理(ipt)。|
|業務類型| sst| 會話的業務類型。<br>在不同的會話場景(scenes)下有不同的業務類型。|
|子業務類型| ssub| 子業務類型。<br>包括:人臉(ifr),聲紋(ivp),組管理(ipt)。|
業務場景與業務類型組合:
| 場景類型 | 人臉(ifr) | 聲紋(ivp) | 人臉聲紋融合<br>(ifr \| ivp) | 組管理(ipt) |
|:---:|:---:|:---:|:---:|:---:|
|注冊|√|√|-|-|
|驗證|√|√|√|-|
|鑒別|√|√|-|-|
子業務操作組合:
| |人臉(ifr)|聲紋(ivp)|組管理(ipt)|
|:---:|:---:|:---:|:---:|
|創建|-|-|√|
|加入|-|-|√|
|查詢|-|√|√|
|刪除|√|√|√|
|密碼下載|-|√|-|
在 1:1 的首次驗證前,需要先指定用戶 ID 進行注冊。
組鑒別前,需要先創建組,然后把用戶 ID 加入到組中;在組鑒別時,指定組 ID,上傳數據(音頻或圖片)后,將返回組內最匹配的幾個用戶 ID 及相似度。目前僅提供10個鑒別組進行開發調試。
注冊或驗證聲紋或人臉時,須指定以下參數:
* 業務類型(MFV_SST)
* 業務場景(MFV_SCENES)
* 用戶 ID(AUTH_ID)
* 驗證模式(MFV_VCM)
## 注冊
在聲紋注冊時,需要先獲取密碼:
~~~
// 設置業務場景:聲紋(ivp)
mIdVerifier.setParameter(SpeechConstant.MFV_SCENES, "ivp" );
// 設置聲紋密碼組數
mIdVerifier.setParameter( "rgn", rgn );
// 執行密碼下載操作,密碼類型:數字密碼(pwdt=3)
mIdVerifier.execute("ivp", "download", "pwdt=3", listener );
~~~
密碼結果通過 listener 中的回調獲取。
進行注冊:
~~~
// 設置業務場景:人臉(ifr)或聲紋(ivp)
mIdVerifier.setParameter( SpeechConstant.MFV_SCENES, scence );
// 設置業務類型:注冊(enroll)
mIdVerifier.setParameter( SpeechConstant.MFV_SST, "enroll" );
// 設置用戶id
mIdVerifier.setParameter( SpeechConstant.AUTH_ID, authID );
// 設置監聽器,開始會話
mIdVerifier.startWorking( listener );
// 在注冊聲紋時,需要多次寫入音頻數據
while( !isDataFinished ){
if( scence.equals("ivp") ){
// 在注冊聲紋時,需要在 params 中,指定聲紋注冊的參數,包括注冊次數(rgn),密碼類型(pwdt),以及密碼(ptxt)
params = "pwdt=3,ptxt="+pwdTxt+",rgn="+rgn;
}
mIdVerifier.writeData( scence, params, data, offset, length );
}
// 寫入完成后,需要調用stopWrite停止寫入,在停止的時候同樣需要指定子業務類型。只有
// stopWrite之后,才會觸發 listener 中的回調接口,返回結果或者錯誤信息。
mIdVerifier.stopWrite( scence );
~~~
注冊人臉時,只要上傳一張圖片即可;而聲紋注冊時,則可能需要多次寫入音頻數據。注冊結果狀態通過 listener 的回調獲取。
## 驗證
驗證時,可通過 MFV_VCM 指定驗證模式為單一(人臉或聲紋),還是混合(人臉+聲紋)。在混合模式下,需要分別寫入圖片和音頻數據。
~~~
// 設置業務場景
mIdVerifier.setParameter( SpeechConstant.MFV_SCENES, scene );
// 設置業務類型
mIdVerifier.setParameter( SpeechConstant.MFV_SST, "verify" );
// 設置驗證模式
mIdVerifier.setParameter( SpeechConstant.MFV_VCM, vcm );
// 設置用戶id
mIdVerifier.setParameter( SpeechConstant.AUTH_ID, authID );
// 設置監聽器,開始會話
mIdVerifier.startWorking( listener );
while( !isDataFinished ){
// 寫入數據
mIdVerifier.writeData( scence, params, data, offset, length );
}
mIdVerifier.stopWrite( scence );
~~~
## 1:N檢索
鑒別與驗證的過程相似,不過鑒別需要設置組 ID,以指定要鑒別的組。
清參考身份識別中1:N檢索部分。
## 模型和組管理
聲紋模型目前支持的操作有查詢(query)、刪除(delete)、密碼下載(download)3種。人臉模型目前支持刪除(delete)操作。組管理包括創建,查詢,加入和刪除。
~~~
// 設置業務場景,ifd, ivp, ipt
mIdVerifier.setParameter( SpeechConstant.MFV_SCENES, scene );
// 設置用戶id
mIdVerifier.setParameter( SpeechConstant.AUTH_ID, authID );
// params 根據不同的操作而不同
if( isCreateGroup ){
//創建組
params="scope=group,group_name=" + groupName;
cmd = "add";
}else if( isDeleteGroup ){
//刪除組
params = "scope=group,group_id=" + groupID );
cmd = "delete";
}else if( isAddGroupMember ){
//加入組員
params = "scope=person,group_id=" + groupID+",auth_id=" + authID;
cmd = "add";
}else if( isDeleteGroupMember ){
//刪除組員
params = "scope=person,group_id=" + groupID+",auth_id=" + authID;
cmd = "delete";
}else if( isQueryGroupMember ){
//查詢組員
params = "scope=group,group_id=" + groupID );
cmd = "query";
}else{
// 人臉或聲紋的模型管理 query, delete, download
cmd = ...;
}
// cmd 為 操作,模型管理包括 query, delete, download,組管理包括 add,query,delete
mIdVerifier.execute( scene, cmd , params, listener );
~~~
操作結果通過 listener 回調獲取。
## 參數設置
多生物特征融合驗證平臺的參數分為兩種,分別為MFV主參數和子業務參數。
MFV主參數通過 IdentityVerifier.setParameter(String key, String value) 方法進行設置,參數下表所示。
|名稱|說明|取值范圍|默認值|
| --- |--- |--- |--- |--- |
|auth_id|用戶id,用戶身份的唯一標識|自擬,長度6-18位,僅包括英文、數字|無|
|group_id|通過組管理功能創建的鑒別組的唯一標識|長度20以內的字符串,由組管理功能創建得到,或由他人告知|無,在鑒別場景下必須指定|
|scenes|會話場景|ifr(人臉),ivp(聲紋),ifr\|ivp(人臉+聲紋),組管理(ipt)|無,必須指定|
|sst|會話的業務類型|enroll(注冊),verify(驗證),identify(鑒別)|無,必須指定|
|vcm|驗證模式,僅在驗證場景下使用|sin(單一特征),mix(融合),agi(靈活)|無,在驗證場景下必須指定|
|afc|靈活驗證保留結果時間|0-43200s|無,只在vcm設置成agi時生效|
|prot_type|聯網協議|ssl|非ssl協議|
|sslcert|證書內容|證書內容|賽門鐵克安全證書(僅在prot_type=ssl時生效)|
注意:
1. scenes 和 vcm 必須組合使用:例如指定 vcm 為 sin 則 scenes 只可以選擇 ifr 或者 ivp 單獨業務,vcm 選擇 mix 則 scenes 只可以選擇 ifr|ivp。另:agi(靈活)模式可以設置 sences=ifr|ivp,在當次會話只發送一種業務數據,服務端保留驗證結果,如在設置的時間間隔內再傳入另外的業務數據即可做到混合驗證。
2. prot_type、sslcert 參數也可在 SpeechUtility. createUtility 時傳入,之后每次會話都會生效。
3. 支持服務端回調通知業務。當用戶進行了注冊、驗證操作后,訊飛服務端發送結果消息給開發者的業務服務器,如需此服務請聯系:msp_support@iflytek.com
子業務參數以String格式的鍵-值對在調用 IdentityVerifier.writeData(String ssub, String params, byte[] data, int offset, int length) 寫入,子業務特征數據調用 IdentityVerifier.execute(String ssub, String cmd, String params, IdentityListener listener) 執行模型操作時傳入,對應于params參數。詳見 Demo。
|子業務|名稱|說明|取值|默認值|
| --- | --- | --- | --- | --- |
|ivp(聲紋)|rgn|注冊次數。|2-9。|5(建議使用默認值,效果最好) |
|ivp(聲紋)|ptxt|密碼文本,指定聲紋密碼注冊時使用的聲紋密碼內容。|由服務端下發,比如數字密碼所需的數字串。|無,必須指定|
|ivp(聲紋)|pwdt|密碼類型,指定聲紋密碼注冊時使用的聲紋密碼類型。|3(數字密碼)注:其他類型暫不支持。|無,必須指定|
|ifr(人臉)|暫無||||
|ipt(組管理)|auth_id|用戶id||設備id,必須指定|
|ipt(組管理)|scope|操作對象|group(組)person(成員)|無,必須指定|
|person(成員)|group_name|創建的組名稱||無,必須指定|
|person(成員)|group_id|加入的組id||無,必須指定|
結果格式說明詳見附錄。
## 安全性問題
從前面模型和組管理的章節可以看到,在身份驗證時,除在注意在聲紋密碼和人臉識別章節提到的安全性問題外(參考對應的章節內容),還需要**注意對組 ID 的保密**。在組管理中,通過指定組 ID,即可查詢到所有組員的 AUTH_ID,當他人同時也獲取到 libmsc.so (通過 APK 解壓等)以及 APPID 時,通過 group_id 查到所有組員 auth_id,便可直接修改對應 auth_id 的模型。應用可以對展示給用戶的組 ID 進行映射,例如可以讓展示界面顯示的,只是一個組的昵稱等。
從組 ID 需要保密可以知道,為了安全性,組管理并未提供通過 APPID 查詢其所有組 ID 的功能——因為這樣獲取到 libmsc.so 和 APPID 的人就會獲取到所有組 ID,從而獲取到所有組員的 AUTH_ID,繼而修改其模型。所以,應用在創建組后,需要保存組 ID,以在組管理和鑒別時使用。
此外,模型更新,APPID 和 用戶 ID 要注意的問題,可參考聲紋密碼章節中的安全性問題說明,此處不再重復。