背景介绍

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

原文链接
本文为云栖社区原创内容,未经允许不得转载。

如何三步搭建一套声纹系统相关推荐

  1. 简单三步搭建一对一直播源码系统

    随着一对一直播源码的火热,手机直播开发便获得越来越多的人讨论,甚至有人说一对一直播开发只需要三个步骤!这对很多人来讲是很不可思议的.接下来小编具体分析一下. 首先,一对一直播源码开发分三步确实可以搭建 ...

  2. 拿来就能用!几步搭建一套简单直播系统 | 原力计划

    作者 | mind_programmonkey 责编 | 伍杏玲 出品 | CSDN博客 本次用Ngix+RTMP+FFmpeg搭建一个流媒体服务器,实现简单的直播效果. Nginx是一款轻量级的We ...

  3. 批训练、注意力模型及其声纹分割应用,谷歌三篇论文揭示其声纹识别技术原理

    声纹识别技术在谷歌的诸多产品中有着重要应用.除了安卓手机目前所独有的声纹解锁功能外,谷歌的家庭语音助手 Google Home 也能通过声纹识别支持多用户模式,从而针对不同用户提供个性化服务.当你向 ...

  4. 简单三步搭建公司内部论坛:安装部署Discuz 1-2

    系列文章 简单三步搭建公司内部论坛:安装部署Discuz 1-2 简单三步搭建公司内部论坛:将论坛发布公网 2-2 随着公司快速发展,人员也越来越多,但员工人数多也会带来问题,就是小群组也越来越多.虽 ...

  5. 简单三步搭建公司内部论坛:将论坛发布公网 2-2

     系列文章 简单散步搭建公司内部论坛:安装部署Discuz 1-2 简单三步搭建公司内部论坛:将论坛发布公网 2-2 上一篇: 简单三步搭建公司内部论坛:将论坛发布公网 2-2 在上篇介绍中,我们向大 ...

  6. 如何搭建一套在线网校系统?需要哪些功能?

    现在做在线教育的人真的是越来越多了,不过相信很多刚刚入门的小伙伴,会在搭建在线网校系统的地方卡住. 一是可能没有相关的开发经验: 二是可能没有找到好的方案和工具. 如何搭建一套在线网校系统?需要哪些功 ...

  7. 新手上路,如何迅速搭建一套源码系统

    新手上路,如何迅速搭建一套源码系统 首先明确源码使用条件 账号要求: 公众号:服务号(已认证且开通支付功能) 小程序(已认证且开通支付功能) 微信支付功能 微信开放平台(已认证) 注:如果单独使用公众 ...

  8. 公司为何要搭建一套呼叫中心系统

    对于一个成熟的企业来说,管理以及工作效率的提高是非常重要的,随着企业的发展工作流程会越来越复杂,随之成本也会增加,就要面临很多问题与挑战,为了战胜这些挑战,就需要借助一些工具来提高效率,这种情况下就需 ...

  9. 简单三步, 搭建全平台私有同步网盘

    作者:zhaoolee 原文链接:https://www.jianshu.com/p/54f157a211af 前言: 前段时间我写了一篇mega同步盘的文章, 有小伙伴表示如果mega某天被封掉就尴 ...

最新文章

  1. [20180627]测试bbed是否支持管道命令.txt
  2. python资料书-史上最全Python从入门到资深书籍资料分享!
  3. JQuery获取元素的N种方法
  4. 从上百幅架构图中学大型网站建设经验(上)
  5. 表达式x=x(x-1)
  6. 别说我懂社交网络: 关于社交网络分析的一头雾水
  7. truncate,delete,drop之间的区别
  8. DataGuard ORA-01111,ORA-01275文件创建失败问题解决
  9. 还在用 if else?试试策略模式吧!
  10. RPC远程过程调用概念及实现
  11. 工业相机选型:相机接口
  12. 信息论 基础知识(一)
  13. 一笔画: 表现绘画过程的美
  14. 工业物联网技术体系包括哪些
  15. 两台主机如何共享一套键鼠一台显示器?
  16. 论文查重软件怎么选择
  17. 有什么蓝牙耳机不贵又实用?学生党适合使用的蓝牙耳机
  18. 使用CSS3设置条纹背景
  19. JS 中的 False 与空值
  20. 深度学习_目标检测_SPP(Spatial Pyramid Pooling)详解

热门文章

  1. 添加列属性_css多列属性
  2. python修复不了_如何修复Python代码?
  3. 阿里云mysql 分布式_MySQL大型分布式集群
  4. 平移刚体上各点的加速度和速度_大物学习笔记(一)——刚体力学
  5. Java 并发编程必须知道的七种锁类型以及应用
  6. Java 哪些事最困扰你?
  7. 【LeetCode笔记】22.括号生成(Java、DFS回溯、剪枝、括号)
  8. github打开前端样式丢失_工具资源系列之 github 上各式各样的小徽章从何而来?...
  9. matlab多元约束最小值,无约束多变量最小值求解问题
  10. python语言编程基础视频_网络编程-5_ Python系列视频(一)——Python语言基础_Python视频-51CTO学院...