如何三步搭建一套声纹系统

5-6-3.gif

背景介绍

声纹检索,顾名思义就是说话人识别,通过声音来验证或者识别说话人的声音。声纹识别的关键步骤就是声音向量化,将说话人的声音将其转化成结构化的向量。阿里云AnalyticDB向量版,提供了一套声纹验证检索的解决方案。用户只需要使用简单的几条SQL命令,三步之内就可以搭建一套高精度的声纹检索验证服务。

声纹识别技术

1)声纹检索演示

图1展示了AnalyticDB向量数据库的声纹检索系统的演示界面。为了方便用户体验,我们将380个人的声音信息,转化成向量存储在系统中。当前演示系统分成两部分,第一部分是检索部分,用户输入录制好的声音文件或者用户现场进行录音上传声音文件,提交到声纹库进行声音的匹配检索。第二部分是注册部分,用户可以注册上传自己的声音到当前的声纹库里面,方便后期的查询验证。在接下来的章节中,我们分别介绍各个功能。

image.png

 

图1. 声纹演示系统

图2上传一段S0004的测试音频“BAC009S0004W0486.wav”到声纹库里面进行检索,可以看到top1的结果S0004就会在最上面进行展示。

image.png

 

图2. 查询声音

图3展示了声纹注册系统,用户可以注册自己的声音到后台声纹库里面,方便检索。比方说,用户Hanchao注册自己的声音(只有7s长度),到当前的系统里面来。当前系统支持无文本注册,用户可以说任何话来进行注册。

image.png

 

图3. 注册声音

图4演示用户现场录制声音,上传到系统中,进行检索。比方说,“Hanchao”录制了一段5秒的语音到声纹系统中进行检索。之前注册过“Hanchao”的声音,当前系统可以看到排名第一的声音就是“Hanchao”的声音。

image.png

 

图4. 录制并检索声音

当前对于声纹演示,我们采用的是1:N的演示结果,可以用在会议室中的识别,通过声音可以找到相关的会议说话人。当前,对于身份验证,这种1:1的演示,我们只用限制距离小于550,就可以方便的进行身份验证。

2)应用结构总体设计

阿里云声纹库检索的系统框架的总体架构如图5所示,AnalyticDB(声纹库)负责整个声纹检索应用的全部结构化信息(用户注册标识,用户姓名,以及其他的用户信息)和非结构化信息(声音产生的向量)的存储和查询。在查询的过程中,用户通过声纹抽取模型,将声音转成向量,在AnalyticDB中进行查询。系统返还回来相关的用户信息,以及l2向量距离[5]。其中声音抽取模型的训练和测试,我们在下一章进行讲解。

image.png

 

图5. 声纹检索库

3)系统精度

当前演示声纹系统,采用的是GMM-UMB模型抽取的i-vector作为检索向量[3]。另外,我们还训练了精度更高的深度学习声纹识别模型(x-vector[4])。并且,可以针对特定的场景,比方说电话通话场景,手机APP场景,嘈杂噪声场景等相关的场景进行声纹模型训练,详细信息可以加我们的群进行了解。

声纹识别在学术界常用的数据集(Aishall.v1 [1]数据集和TIMIT [2]数据集)上面的(1:N)的准确率(>99.5%,见表1)。

表1. Top 1 精度测试结果

321.png

三步搭建一个声纹系统

第一步,初始化。

当前系统实现了声音转向量的函数,用户将前端得到的声音通过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

image.png

参考文献:

[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
图片.gif

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云原生人物志|Pulsar翟佳:社区的信任最重要

云原生已无处不在&#xff0c;《云原生人物志》是CSDN重磅推出的系列原创采访&#xff0c;我们关注云原生中每一个技术人、公司的身影。知微见著&#xff0c;窥见云原生价值与趋势。 编辑 | 宋 慧 出品 | CSDN云计算 头图 | 付费下载于视觉中国 本期我们采访了 Apache 顶级项目…

如何为Kubernetes实现原地升级

作者 | 王思宇&#xff08;酒祝&#xff09; 阿里云技术专家 参与阿里巴巴云原生文末留言互动&#xff0c;即有机会获得赠书福利及作者答疑&#xff01; 概念介绍 原地升级一词中&#xff0c;“升级”不难理解&#xff0c;是将应用实例的版本由旧版替换为新版。那么如何结合…

uniapp实现表单提交带图片上传 在做表单提交的时候,我们可能面临有图片上传,放在原生的html就好解决,form标签加上

enctype“multipart/form-data” uniapp微信小程序 1.原图 页面部分 <form :model"data" submit"submit" reset""><view class"top bgbai u-m-t-30" :class"{disabled: !isaction && data.renz.id}">…

灵魂拷问:a = 1 + 2 究竟是怎么被 CPU 执行的

来源 | 小林coding作者 | 小林coding头图 | 下载于视觉中国代码写了那么多&#xff0c;你知道 a 1 2 这条代码是怎么被 CPU 执行的吗&#xff1f;软件用了那么多&#xff0c;你知道软件的 32 位和 64 位之间的区别吗&#xff1f;再来 32 位的操作系统可以运行在 64 位的电脑上…

如何利用全站加速,提升网站性能和用户体验?

随着网络技术的发展&#xff0c;越来越多的应用基于互联网发布&#xff0c;再好的应用&#xff0c;如果打开速度慢&#xff0c;10个用户会有9个用户选择离开&#xff0c;相关统计数据显示&#xff0c;每增加0.1秒的加载延迟&#xff0c;将会导致客户活跃度下降1%。在目前获客成…

最近,老王又Get了CDN的新技能

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

线程池 总结

文章目录线程池优点线程池创建参数队列种类同步移交队列有界队列无界队列拒绝策略DiscardPolicyAbortPolicyDiscardOldestPolicyCallerRunsPolicy线程池执行流程线程池类型定长 FixedThreadPool轮询 ScheduledThreadPool缓存 CachedThreadPool单线程 SingleThreadPool线程池优点…

阿里的 RocketMQ 如何让双十一峰值之下0故障

作者 | 愈安来源 | 阿里巴巴中间件头图 | 下载于视觉中国2020 年的双十一交易峰值达到 58.3 W笔/秒&#xff0c;消息中间件 RocketMQ 继续数年 0 故障丝般顺滑地完美支持了整个集团大促的各类业务平稳。相比往年&#xff0c;消息中间件 RocketMQ 发生了以下几个方面的变化&…

OAM深入解读:使用OAM定义与管理Kubernetes内置Workload

作者 | 周正喜 阿里云技术专家 爱好云原生&#xff0c;深度参与 OAM 社区 大家都知道&#xff0c;应用开放模型 Open Application Model&#xff08;OAM&#xff09; 将应用的工作负载&#xff08;Workload&#xff09;分为三种 —— 核心型、标准型和扩展型&#xff0c;这三…

oracle 指定类型和指定位数创建序列号

文章目录一、脚本部分1. 表结构2. 函数二、代码部分2.1. xml2.2. 接口2.3. api接口2.4. api实例2.5. 控制层三、测试3.1. 效果图一、脚本部分 1. 表结构 有注释 -- Create table create table LDMAXNO (NOTYPE VARCHAR2(17) not null,NOLIMIT VARCHAR2(12) not null,MAXNO …

深入解读Flink资源管理机制

作者&#xff1a;宋辛童&#xff08;五藏&#xff09;整理&#xff1a;王文杰&#xff08;Flink 社区志愿者&#xff09; 摘要&#xff1a;本文根据 Apache Flink 系列直播整理而成&#xff0c;由阿里巴巴高级开发工程师宋辛童分享。文章主要从基本概念、当前机制与策略、未来发…

EasyExcel 实现模板导出、模板导入分析功能

文章目录0.POM依赖1.导出模板实现2.导入模板并分析实现3.git源码0.POM依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency>…

金蝶云拿下客户满意度第一,中国SaaS企业觅得“后发先至”良机

本月&#xff0c;全球SaaS行业迎来了开年第一份重磅奖项的揭晓&#xff1a;由国际知名研究机构IDC颁发的SaaS行业全球客户满意度奖&#xff08;CSAT大奖&#xff09;。 该奖项基于IDC SaaSPath针对全球约2000家组织机构中高层的调研&#xff0c;综合30多项客户满意度指标&…

一名创业者浴火涅磐的自白——对话阿里云MVP孙琦

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 简介&#xff1a; 孙琦喜欢调侃自己为“一个失败的创业者”。跟他聊过之后&#xff0c;我却发现他跟以往的创业者不同&#x…

mysql 指定类型和指定位数创建序列号

文章目录一、脚本部分1. 表结构2. 函数二、代码部分2.1. xml2.2. 接口2.3. api接口2.4. api实例2.5. 控制层三、测试3.1. 效果图一、脚本部分 1. 表结构 有注释 CREATE TABLE ldmaxno (notype varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 号码…

系统架构设计师 - ESB 企业服务总线

文章目录定义功能定义 传统中间件技术和WEB、XML相结合的产物&#xff0c;主要用以异构系统的集成。具备复杂数据的传输能力&#xff0c;支持基于内容的消息路由、过滤&#xff0c;并提供一系列标准的接口。 功能 服务位置透明、 消息路由、 消息增强、 消息格式转换、 传输…

阿里云助力完美日记半年内系统吞吐量提升50倍

阿里云 Redis 直播地址 近年来&#xff0c;完美日记的“小黑钻口红”“动物眼影盘”等爆款彩妆出现在了越来越多女孩子的化妆台上&#xff0c;完美日记&#xff08;Perfect Diary&#xff09;是由逸仙电商在2017年推出的彩妆品牌&#xff0c;凭借着高颜值和性价比&#xff0c;完…

唏嘘!程序员,你的年底KPI完不成的原因找到了!

加班是每个互联网人不愿面对而却又绕不过去的话题&#xff0c;就连面试时“你怎么看待加班”的问题都成了必答题。现在临近年底&#xff0c;大家都在努力冲业绩&#xff0c;期待拿更多的年终奖&#xff0c;回家过个“富足年”。年底冲业绩&#xff0c;势必会增加我们的工作量&a…

阿里云SAG2.0发布,助力企业全球互联

2016年以来&#xff0c;阿里云洛神云网络陆续发布了高速通道、VPN网关、云企业网CEN&#xff08;cloud enterprise network&#xff09;、SAG&#xff08;smart access gateway&#xff09;等混合云网络产品&#xff0c;基于阿里云全球核心网络不断扩展云网络的应用场景&#x…

云原生存储详解:容器存储与K8s存储卷

作者 | 阚俊宝 阿里云技术专家 导读&#xff1a;云原生存储详解系列文章将从云原生存储服务的概念、特点、需求、原理、使用及案例等方面&#xff0c;和大家一起探讨云原生存储技术新的机遇与挑战。本文为该系列文章的第二篇&#xff0c;会对容器存储的相关概念进行讲述&#x…