Milvus 實戰|生物多因子認證系列 (一):聲紋識別

 

| 什麼是聲紋識別

聲紋識別(又稱說話人識別)是從說話人發出的語音信號中提取聲紋信息,並對說話人進行身份驗證的一種生物識別技術。簡單來說,聲紋識別技術可以“確認說話人是誰”。我們說話的時候,每個人的發音器官、發音通道和發音習慣上都有個體差異,聲紋識別技術就是爲了識別出說話人之間的這些差異。需要注意的是,聲紋識別不同於常見的語音識別 [1]:

  • 語音識別:是共性識別,能聽懂人的說話內容,即“你說了什麼?”。

  • 聲紋識別:是個性識別,能判斷說話人是誰,即“說話人是誰?”。

 

| 聲紋識別模型

背景

聲紋識別的本質,就是要找到描述特定對象的聲紋特徵 (feature),聲紋特徵類似於虹膜、指紋等,是一種獨特的生物特徵。至於特徵提取方法,按照發展歷程有模板匹配、高斯混合模型 (GMM) 、聯合因子分析法 (JFA) 、深度神經網絡方法等[2]。在深度神經網絡之前出現的方法基本可以認爲是傳統方法。傳統方法通常用精確的數學模型對聲音信號進行特徵提取,而深度神經網絡通過模型訓練獲得聲紋特徵。研究表明:相較於傳統方法,利用深度學習的方法在識別準確率上獲得了顯著的提高。本文用到的聲紋特徵就是基於深度學習模型得到的。

特徵提取

Deep Speaker[3] 是百度發佈的一個基於神經網絡的說話人嵌入系統,其基本思想是將說話人的語音映射到一個超平面,從而可以通過餘弦相似度取來衡量說話人的相似度。

上圖是 Deep Speaker 的網絡結構圖,其流程爲:

  1. 使用深度神經網絡從說話人語音中提取幀級特徵

  2. 在池化層和歸一化層產生說話人的 embeddings

  3. 使用 Triplets loss 損失函數訓練

  4. 採用 softmax 層和交叉熵進行預訓練

在特徵提取過程中,我們使用 Triplets loss 函數訓練模型,不斷學習說話人的 embeddings ,如上圖所示:

  • Anchor : 根據說話人 Anchor 的語音計算的 embeddings

  • Positive : 與 Anchor 同一個說話人的 embeddings

  • Negative : 與 Anchor 不同說話人的 embeddings

通過模型訓練努力使 Anchor 和 Positive 間的餘弦相似度高於 Anchor 和 Negative 間的餘弦相似度,從而實現模型的優化。

本文將利用基於 Deep Speaker 的模型進行聲紋特徵提取,然後將提取的特徵向量通過 Milvus 向量搜索引擎進行相似度分析,從而實現聲紋識別。

 

| Milvus 向量搜索引擎

Milvus 支持使用多種 AI 模型向量化非結構化數據,併爲向量數據提供搜索分析服務。它可處理的業務包括圖像處理、機器視覺、自然語言處理、語音識別、推薦系統以及新藥發現。具體實現方式是:

  1. 通過深度學習模型將非結構化數據轉化爲特徵向量,並導入 Milvus 庫。

  2. 對特徵向量進行存儲並建立索引。

  3. 接收到用戶的向量搜索請求後,返回與輸入向量相似的結果。

| 部署應用

聲紋識別

聲紋識別需要對麥克風傳感器收集的語音信息進行分析。這一過程主要包括特徵提取和模式識別兩部分,其中特徵提取對識別率有較大的影響。以 Deep Speaker 模型生成的特徵向量爲依據,聲紋識別方法流程如下圖所示:

  1. 聲紋註冊:將麥克風收集的註冊人語音通過 Deep Speaker 模型轉爲特徵向量,並將註冊人的聲紋特徵導入 Milvus 聲紋庫。

  2. 聲紋認證:將麥克風收集的認證人語音通過 Deep Speaker 模型轉爲特徵向量,並在 Milvus 聲紋庫中檢索認證人的聲紋特徵,得出相似結果。

  3. 相似度匹配:根據 Milvus 返回的相似距離,判斷認證人是否通過。比如,我們認爲餘弦距離大於 0.85 即爲認證通過。

 

| 生物多因子認證

前面我們介紹了基於 Deep Speaker 和 Milvus 的聲紋識別流程。接下來,我們將利用該聲紋識別方案實現生物多因子認證系統。所謂生物多因子認證,就是利用認證人所擁有的生物信息(包括指紋、人臉、聲紋等)實現的一種更加安全的身份認證方式。我們搭建的生物多因子認證系統也添加了人臉認證,關於人臉認證的部分會在本系列的第二篇文章中介紹。生物多因子認證系統的具體搭建步驟可以參考:https://github.com/milvus-io/bootcamp/tree/master/solutions/MFA。

那麼,在生物多因子認證系統中,如何利用人臉信息和聲紋信息共同實現身份認證呢? 

1. 首先將人臉圖片和聲紋語音利用 AI 模型轉爲特徵向量。然後將註冊人的人臉特徵和聲紋特徵分別存入 Milvus 中的人臉庫和聲紋庫,並指定該註冊人的 id 用於身份驗證。

# Extract registrant's face feature vector
# The parameter img means the face image
model_face = face_model.FaceModel()
register_face_verctor = model.get_feature(img)


# Extract registrant's voiceprint feature vector
# The parameter voc means the voice
model_voice = DeepSpeakerModel()
register_voice_verctor = model.m.predict(voc)


# Insert vector into Milvus
# The parameter collection_face and collection_voice means the collection names of milvus
# The parameter ids means the corresponding id of the voiceprint or face in milvus
milvus.insert(collection_face, register_face_verctor, ids)
milvus.insert(collection_voice, register_voice_verctor, ids) 

2. 在身份認證的時候,同樣先利用 AI 模型提取認證人的人臉特徵和聲紋特徵,然後分別在 Milvus 的人臉庫和聲紋庫中進行檢索。

# Extract authenticator's face feature vector
model_face = face_model.FaceModel()
authenticate_face_verctor = model.get_feature(img)


# Extract authenticator's voiceprint feature vector
model_voice = DeepSpeakerModel()
authenticate_voice_verctor = model.m.predict(mfcc)


# Search vector with Milvus
results_face = milvus.search(param={collection_face, authenticate_face_verctor, topk=1})
results_voice = milvus.search(param={collection_voice, authenticate_voice_verctor, topk=1})

3. 根據 Milvus 返回的相似度檢索結果,根據以下兩個標準判斷認證是否通過:

  • 聲紋與人臉認證是否通過,即餘弦距離大於 0.85

  • 聲紋和人臉認證的結果是否來自同一個註冊人,即聲紋和人臉認證結果對應的註冊人 id 是否相同。

# Get conclusions based on the results returned by Milvus
if results_face.distance > 0.85 and results_voice.distance > 0.85 and results_face.id==results_voice.id:
    return true    # Authentication succeed 
else:
    return false   # Authentication faild

 

| 總結

聲紋識別這項技術有很多的應用場景。生物多因子認證可用於登錄設備,或者作爲金融交易的額外安全步驟。另外,像智能家庭助手這樣的共享設備也可以使用聲紋識別技術來爲當前用戶提供個性化服務。聲紋識別技術能讓智能語音產品“認識”你的聲音,只聽你的喚醒指令,忽略其他人的命令,從而實現聞聲識人。此外,只有家庭智能助手學會區分不同人的身份後,才能根據身份鑑別權限和提供個性化服務,實現真正的智能語音交互。

在萬物皆可 embedding 的時代,我們能很方便的分析各種非結構化數據,例如圖片、文本、視頻和語音等,通過 embedding 技術可以將這些非結構化數據提取爲特徵向量,然後通過對這些特徵向量的計算和相似度檢索來實現對非結構化數據的分析與檢索。Milvus 是爲了使用戶能夠方便的對特徵向量進行計算和檢索而設計的。本文介紹的是 Milvus 在聲紋識別領域的應用,更多其他應用場景可參考https://milvus.io/cn/scenarios。

 

參考文獻

  1. https://zhuanlan.zhihu.com/p/35729403

  2. Snyder, David, et al. "X-vectors: Robust DNN embeddings for speaker recognition."Submitted to ICASSP(2018).

  3. https://github.com/philipperemy/deep-speaker

 

| 歡迎加入 Milvus 社區

github.com/milvus-io/milvus | 源碼

milvus.io | 官網

milvusio.slack.com | Slack 社區

zhihu.com/org/zilliz-11/columns | 知乎

zilliz.blog.csdn.net | CSDN 博客

space.bilibili.com/478166626 | Bilibili

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章