声纹检索,顾名思义就是说话人识别,经过声音来验证或者识别说话人的声音。声纹识别的关键步骤就是声音向量化,将说话人的声音将其转化成结构化的向量。阿里云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