
背景介紹
聲紋檢索,顧名思義就是說話人識别,通過聲音來驗證或者識别說話人的聲音。聲紋識别的關鍵步驟就是聲音向量化,将說話人的聲音将其轉化成結構化的向量。阿裡雲AnalyticDB向量版,提供了一套聲紋驗證檢索的解決方案。使用者隻需要使用簡單的幾條SQL指令,三步之内就可以搭建一套高精度的聲紋檢索驗證服務。
聲紋識别技術
1)聲紋檢索示範
圖1展示了AnalyticDB向量資料庫的聲紋檢索系統的示範界面。為了友善使用者體驗,我們将380個人的聲音資訊,轉化成向量存儲在系統中。目前示範系統分成兩部分,第一部分是檢索部分,使用者輸入錄制好的聲音檔案或者使用者現場進行錄音上傳聲音檔案,送出到聲紋庫進行聲音的比對檢索。第二部分是注冊部分,使用者可以注冊上傳自己的聲音到目前的聲紋庫裡面,友善後期的查詢驗證。在接下來的章節中,我們分别介紹各個功能。
圖1. 聲紋示範系統
圖2上傳一段S0004的測試音頻“BAC009S0004W0486.wav”到聲紋庫裡面進行檢索,可以看到top1的結果S0004就會在最上面進行展示。
圖2. 查詢聲音
圖3展示了聲紋注冊系統,使用者可以注冊自己的聲音到背景聲紋庫裡面,友善檢索。比方說,使用者Hanchao注冊自己的聲音(隻有7s長度),到目前的系統裡面來。目前系統支援無文本注冊,使用者可以說任何話來進行注冊。
圖3. 注冊聲音
圖4示範使用者現場錄制聲音,上傳到系統中,進行檢索。比方說,“Hanchao”錄制了一段5秒的語音到聲紋系統中進行檢索。之前注冊過“Hanchao”的聲音,目前系統可以看到排名第一的聲音就是“Hanchao”的聲音。
圖4. 錄制并檢索聲音
目前對于聲紋示範,我們采用的是1:N的示範結果,可以用在會議室中的識别,通過聲音可以找到相關的會議說話人。目前,對于身份驗證,這種1:1的示範,我們隻用限制距離小于550,就可以友善的進行身份驗證。
2)應用結構總體設計
阿裡雲聲紋庫檢索的系統架構的總體架構如圖5所示,AnalyticDB(聲紋庫)負責整個聲紋檢索應用的全部結構化資訊(使用者注冊辨別,使用者姓名,以及其他的使用者資訊)和非結構化資訊(聲音産生的向量)的存儲和查詢。在查詢的過程中,使用者通過聲紋抽取模型,将聲音轉成向量,在AnalyticDB中進行查詢。系統返還回來相關的使用者資訊,以及l2向量距離[5]。其中聲音抽取模型的訓練和測試,我們在下一章進行講解。
圖5. 聲紋檢索庫
3)系統精度
目前示範聲紋系統,采用的是GMM-UMB模型抽取的i-vector作為檢索向量[3]。另外,我們還訓練了精度更高的深度學習聲紋識别模型(x-vector[4])。并且,可以針對特定的場景,比方說電話通話場景,手機APP場景,嘈雜噪聲場景等相關的場景進行聲紋模型訓練,詳細資訊可以加我們的群進行了解。
聲紋識别在學術界常用的資料集(Aishall.v1 [1]資料集和TIMIT [2]資料集)上面的(1:N)的準确率(>99.5%,見表1)。
表1. Top 1 精度測試結果
三步搭建一個聲紋系統
第一步,初始化。
目前系統實作了聲音轉向量的函數,使用者将前端得到的聲音通過POST請求,發給阿裡雲服務系統,選擇對應的聲紋模型,就可以将聲音轉成對應的向量。
import requests
import json
import numpy as np
# sound: 聲音二進制檔案。
# model_id:模型id。
def get_vector(sound, model_id='i-vector'):
url = 'http://47.111.21.183:18089/demo/vdb/v1/retrieve'
d = {'resource': sound,
'model_id': model_id}
r = requests.post(url, data=d)
js = json.loads(r.text)
return np.array(js['emb'])
# 讀取使用者檔案。
file = 'xxx.wav'
data = f.read()
print(get_vector(data))
f.close()
在初始化的過程中,使用者建立相關的使用者聲紋表。同時,給表的向量列加入向量索引,來加速查詢過程。目前聲紋模型輸出的都是400維的向量,是以索引參數dim設定為400。
--建立使用者聲紋表
CREATE TABLE person_voiceprint_detection_table(
id serial primary key,
name varchar,
voiceprint_feature float4[]
);
--建立向量索引
CREATE INDEX person_voiceprint_detection_table_idx
ON person_voiceprint_detection_table
USING ann(voiceprint_feature)
WITH(distancemeasure=L2,dim=400,pq_segments=40);
第二步,注冊使用者聲音。
在注冊的過程中,注冊一個使用者,插入一條記錄到目前系統中。
--注冊使用者'張三'到目前的系統中。
--通過HTTP服務,将聲紋轉化成相關的向量。
INSERT INTO person_voiceprint_detection_table(name, voiceprint_feature)
SELECT '張三', array[-0.017,-0.032,...]::float4[])
第三步,檢索或驗證使用者聲音。
聲紋門鎖驗證(1:1 驗證):在驗證系統中,系統會得到使用者的辨別資訊(user_id),在聲紋庫中計算輸入的聲音向量和庫裡該使用者的聲音向量的距離。一般系統會設定一個距離門檻值(threshold=550),如果向量之間的距離大于這個門檻值,說明驗證失敗。如果小于門檻值,說明聲紋驗證成功。
-- 聲紋門鎖檢測(1:1)驗證
SELECT id, -- 使用者id資訊
name, -- 使用者姓名
l2_distance(voiceprint_feature, ARRAY[-0.017,-0.032,...]::float4[]) AS distance -- 向量距離
FROM person_voiceprint_detection_table -- 使用者聲音表
WHERE distance < threshold -- 通常情況下,threshold為550
AND id = 'user_id' -- 使用者要驗證的id;
會議聲紋檢索(1:N 檢測):系統通過識别目前講話人的聲音,會傳回最相關的注冊使用者資訊。如果沒有傳回結果,說明目前會議說話人不在聲紋庫裡面。
-- 聲紋會議人員識别(1:N)驗證
SELECT id, -- 使用者id資訊
name, -- 使用者姓名
l2_distance(voiceprint_feature, ARRAY[-0.017,-0.032,...]::float4[]) AS distance -- 向量距離
FROM person_voiceprint_detection_table -- 使用者聲音表
WHERE distance < threshold -- 通常情況下,threshold為550
ORDER BY voiceprint_feature <-> ARRAY[-0.017,-0.032,...]::float4[] -- 利用向量進行排序
LIMIT 1; -- 傳回最相似的結果
結尾
詳細的聲紋模型以及相關的AnalyticDB系統請加我們的釘釘群,歡迎大家讨論和使用。2
參考文獻:
[1] Aishell Data set.
https://www.openslr.org/33/[2] TIMIT Data set.
http://academictorrents.com/details/34e2b78745138186976cbc27939b1b34d18bd5b3/[3] Najim Dehak, Patrick Kenny, Réda Dehak, Pierre Dumouchel, and Pierre Ouellet, “Front-end factor analysis for speaker verification,” IEEE Transactions on Audio, Speech, and Language Processing, vol. 19, no. 4, pp. 788–798, 2011.
[4] David Snyder, Daniel Garcia-Romero, Daniel Povey and Sanjeev Khudanpur, “Deep Neural Network Embeddings for Text-Independent Speaker Verification”, Interspeech , 2017 :999-1003.
[5] Anton, Howard (1994), Elementary Linear Algebra (7th ed.), John Wiley & Sons, pp. 170–171, ISBN 978-0-471-58742-2
往期文獻:
[1] 戴口罩也能刷門禁?疫情下AnalyticDB亮出社群管理的寶藏神器!
https://developer.aliyun.com/article/745160[2] 阿裡雲提供高效基因序列檢索功能,助力冠狀病毒序列快速分析
https://developer.aliyun.com/article/753097[3] 阿裡雲提供高效病原體檢測工具助力精準醫療
https://yq.aliyun.com/articles/761891