聲紋檢索,顧名思義就是說話人識別,經過聲音來驗證或者識別說話人的聲音。聲紋識別的關鍵步驟就是聲音向量化,將說話人的聲音將其轉化成結構化的向量。阿里雲AnalyticDB向量版,提供了一套聲紋驗證檢索的解決方案。用戶只須要使用簡單的幾條SQL命令,三步以內就能夠搭建一套高精度的聲紋檢索驗證服務。前端
圖1展現了AnalyticDB向量數據庫的聲紋檢索系統的演示界面。爲了方便用戶體驗,咱們將380我的的聲音信息,轉化成向量存儲在系統中。當前演示系統分紅兩部分,第一部分是檢索部分,用戶輸入錄製好的聲音文件或者用戶現場進行錄音上傳聲音文件,提交到聲紋庫進行聲音的匹配檢索。第二部分是註冊部分,用戶能夠註冊上傳本身的聲音到當前的聲紋庫裏面,方便後期的查詢驗證。在接下來的章節中,咱們分別介紹各個功能。 shell
圖1. 聲紋演示系統數據庫
圖2上傳一段S0004的測試音頻「BAC009S0004W0486.wav」到聲紋庫裏面進行檢索,能夠看到top1的結果S0004就會在最上面進行展現。 json
圖2. 查詢聲音架構
圖3展現了聲紋註冊系統,用戶能夠註冊本身的聲音到後臺聲紋庫裏面,方便檢索。比方說,用戶Hanchao註冊本身的聲音(只有7s長度),到當前的系統裏面來。當前系統支持無文本註冊,用戶能夠說任何話來進行註冊。 框架
圖3. 註冊聲音函數
圖4演示用戶現場錄製聲音,上傳到系統中,進行檢索。比方說,「Hanchao」錄製了一段5秒的語音到聲紋系統中進行檢索。以前註冊過「Hanchao」的聲音,當前系統能夠看到排名第一的聲音就是「Hanchao」的聲音。 工具
圖4. 錄製並檢索聲音post
當前對於聲紋演示,咱們採用的是1:N的演示結果,能夠用在會議室中的識別,經過聲音能夠找到相關的會議說話人。當前,對於身份驗證,這種1:1的演示,咱們只用限制距離小於550,就能夠方便的進行身份驗證。學習
阿里雲聲紋庫檢索的系統框架的整體架構如圖5所示,AnalyticDB(聲紋庫)負責整個聲紋檢索應用的所有結構化信息(用戶註冊標識,用戶姓名,以及其餘的用戶信息)和非結構化信息(聲音產生的向量)的存儲和查詢。在查詢的過程當中,用戶經過聲紋抽取模型,將聲音轉成向量,在AnalyticDB中進行查詢。系統返還回來相關的用戶信息,以及l2向量距離[5]。其中聲音抽取模型的訓練和測試,咱們在下一章進行講解。
圖5. 聲紋檢索庫
當前演示聲紋系統,採用的是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