聲紋檢索,是指通過聲音來驗證或者識別說話人的聲音。聲紋識別的關鍵步是聲音向量化,將說話人的聲音將其轉化成結構化向量。阿里云云原生數據倉庫AnalyticDB MySQL版(簡稱ADB,原分析型數據庫MySQL版)向量分析功能,提供了一套聲紋驗證檢索解決方案,即通過SQL命令快速搭建一套高精度聲紋檢索系統。
系統架構
ADB(聲紋庫)負責存儲和查詢聲紋檢索系統的所有結構化信息(用戶注冊標識、用戶姓名以及其他用戶信息)和非結構化信息(聲音產生的向量)。查詢數據時,系統通過聲紋抽取模型,將聲音轉換成向量,然后進行查詢。系統返回相關用戶信息,以及l2向量距離[5]。系統架構圖如下圖所示。
系統采用GMM-UMB模型抽取的i-vector作為檢索向量[3]。為方便用戶使用,ADB訓練了精度更高的深度學習聲紋識別模型(x-vector[4]),可以針對特定場景,例如電話通話、手機APP、嘈雜噪聲等相關場景進行聲紋模型訓練。下表列出了ADB在學術界常用的聲紋識別數據集(Aishall.v1 [1]數據集和TIMIT [2]數據集)中的(1:N)的準確率(準確率均大于99.5%)。
Aishall 數據集 | TIMIT 數據集 |
99.73% | 99.54% |
系統演示
下圖是ADB聲紋檢索系統的演示界面。為方便演示,ADB將380個人的聲音信息轉化成向量存儲在系統中。當前演示系統包含聲紋檢索和注冊兩個模塊:
聲紋檢索,將聲音文件上傳到聲紋庫進行聲音匹配檢索。
注冊,將聲音注冊到聲紋庫,方便后期查詢檢索。
例如下圖所示,上傳一段名為S0004的測試音頻BAC009S0004W0486.wav,然后到聲紋數據庫中進行檢索,返回結果中top1即為正確結果。
下圖為聲紋注冊系統,支持無文本注冊,您可以注冊自己的聲音到聲紋數據庫。例如某用戶Hanchao注冊自己的聲音(聲音時長7秒)到聲紋數據庫。
支持現場錄制聲音上傳到聲紋檢索系統,例如下圖所示,某用戶Hanchao錄制了一段5秒的語音上傳到聲紋系統。由于該用戶之前注冊過Hanchao的聲音,返回結果中排名第一的聲音就是Hanchao的聲音。
ADB采用1:N演示結果,可應用于會議室中,通過聲音識別會議發言者。當前,對于身份驗證,采用1:1演示,要求距離小于550。
三步搭建聲紋系統
初始化
ADB聲紋檢索系統支持聲音轉向量函數,您可以將從前端獲取的聲音通過POST請求,發送給ADB聲紋特征提取服務,系統自動選擇對應的聲紋模型,將聲音轉成對應的向量。
import requests import json import numpy as np # sound:聲音二進制文件。 # model_id:模型id。 def get_vector(sound, model_id='i-vector'): url = 'http://47.XXX.XXX.XXX:18XXX/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);
注冊聲音
聲音注冊過程中,先注冊用戶,系統將聲音文件上傳到特征提取服務,由特征提取服務將聲音轉換成向量,然后在ADB中進行查詢。
--注冊用戶'張三'到當前的系統中。 --通過HTTP服務,將聲紋轉化成相關的向量。 INSERT INTO person_voiceprint_detection_table(name, voiceprint_feature) SELECT '張三', array[-0.017,-0.032,...]::float4[])
檢索或驗證聲紋
聲紋門鎖1:1檢索
聲紋檢索時,系統通過用戶標識信息(user_id),在聲紋庫中計算輸入的聲音向量和聲紋庫中該用戶的聲音向量之間的距離。系統將設置一個距離閾值(threshold=550),如果向量之間的距離大于該閾值,表示驗證失敗;如果小于該閾值,表示聲紋驗證成功。
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檢索
系統通過識別當前會議發言人的聲音,返回最相關的注冊用戶信息。如果沒有返回結果,表示當前會議發言人不在聲紋庫中。
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; -- 返回最相似的結果
參考文檔
Aishell Data set.OpenSLR .
TIMIT Data set.The DARPA TIMIT Acoustic-Phonetic Continuous Speech Corpus.
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.
David Snyder, Daniel Garcia-Romero, Daniel Povey and Sanjeev Khudanpur, “Deep Neural Network Embeddings for Text-Independent Speaker Verification”, Interspeech , 2017 :999-1003.
Anton, Howard (1994), Elementary Linear Algebra (7th ed.), John Wiley & Sons, pp. 170–171, ISBN 978-0-471-58742-2.