Speaker Verification,声纹验证详解——语音信号处理学习(九)

参考文献:

Speaker Verification哔哩哔哩bilibili

2020 年 3月 新番 李宏毅 人类语言处理 独家笔记 声纹识别 - 16 - 知乎 (zhihu.com)

(2) Meta Learning – Metric-based (1/3) - YouTube

如何理解等错误率(EER, Equal Error Rate)?请不要只给定义 - 知乎 (zhihu.com)

本次省略所有引用论文

目录

一、Introduction

模型的简单介绍

评价指标 Equal Error Rate(EER)

二、Speaker Embedding 讲解

模型框架

数据集

Speaker Embedding 制作方法

三、End-to-End 端到端学习

训练数据准备

模型设计

四、一些补充的问题与回答


一、Introduction

模型的简单介绍
  • 声音模型有这么一大类,其模型主要需要完成的任务是,输入一段语音,输出某一类别。

  • 相关的模型或任务有:

    • Emotion Recognition:情绪识别,输入语音,判断语者情绪如何。

    • Sound Event Detection:声音事件侦测,输入语音,判断发生了什么事,可以用于安保等行业。

    • Autism Recognition:自闭症识别,输入语音,判断是否患有自闭症。

    • Keyword Spotting:关键词识别,输入语音,判断指定的关键词是否在语音中出现过。

  • 那么采用这类模型,和语者有关的任务有哪些呢?

    • Speaker Recognition / Identification:语者识别,判断一段语音是谁说的。其本质就是使用多语者的语料库进行训练,然后再输入一段语音,通过模型输出所有语者的 Confidence(可信度),谁的可信度高就判断为这段信号是谁说的。这里我们不再过多介绍。

    • Speaker Verification:语者验证,输入两段语音,判断这两段语音是否是同一个人说的。给定之前一段记录好的声音和一段新输入的声音,模型会判断二者的相似度,并输出一个表示相似度的概率(图中scalar为标量的意思),通过阈值来判断二者是否是同一个人说的。典型的应用如银行客服判断取钱的人是否是存钱者。

    • Speaker Diarization:语者分段标记,输入一段语音,识别这段语音中,谁在何时说了话。SD 系统先要把声音信号进行分割(Segmentation)。通常每一段是一句话,或是一个段落。接下来我们再做 聚类(Clustering)来标记哪一段是同一个人声。如果不同说话人的数量是已知的,那么只需要知道这段话是谁讲的就好,比如电话场景通常是两个人。如果不知道是多少人在说话,比如会议场景,我们就需要把属于同一个人的声音聚成一类,并给它一个编号。这里就需要用到一些前两种技术,也就是语者识别和声纹识别的技术。

评价指标 Equal Error Rate(EER)
  • Equal Error Rate(EER),中文名叫 等错误率 。在 Speaker Verification 模型中,我们通常需要人为设置一个阈值,来决定二者是否为同一个人说的。很自然的我们能知道,设置不同的阈值,模型的表现自然也不同。阈值选择通常会留给用户。那么我们怎么去评判两个模型孰优孰劣呢?

  • 我们会把所有的阈值都穷举出来,画成一个图像,计算 EER。我们先给一些简单的样例。

    • 如果我直接把阈值设为1.0,那么对于这个模型来说,无论是哪两段语音输入进来,模型都会判断为不是同一个人所说。

    • 如果我把阈值设的挺高,比如0.8,那么这个模型来说,可能使用同一个语者的两段音频,被误判为不同人说的,这个误判率【False Negative Rate】会比较高,因为你的标准比较苛刻;不过使用不同语者的两段音频,被误判为同一人说的,这个误判率【False Positive Rate】就比较低了。

    • 如果之后我直接把阈值设为0,那么对于这个模型来说,无论是哪两段语音输入进来,模型都会判断为就是同一个人所说,利用刚刚的概念我们可以说,FNR = 0,FPR = 1。

  • 最后,以 FPR 数值为 x 轴,以 FNR 数值为 y 轴,我们将图像画出,而 EER 就是当 FPR = FNR 时,二者的大小。

二、Speaker Embedding 讲解

模型框架
  • 那么 SV 模型具体长什么样子呢?传统的 SV 模型通常是采用了某些方法,输入一段声音讯号,就能输出一个向量来表示语者特征。这个语者特征也就是我们所说的 Speaker Embedding。有了这个方法,我们就能将两段声音讯号都转为 Speaker Embedding,然后去比较二者的相似度即可。

  • 模型使用具体步骤:

    • Stage 1:Development,即模型训练,使用语料库对模型进行训练,从而让模型学习到 Speaker Embedding 的编码方式。

    • Stage 2:Enrollment,即声纹录入,需要说话者将自己的声音录入系统。系统会把这些声音一个个输入模型,得到语者嵌入,再取平均,储存到数据库。

    • Stage 3:Evaluation,即声纹评估,也就是验证阶段,系统会把检测到的人声输入模型得到另一个语者嵌入,与之前储存到的嵌入做比较,得出是否是同一个人的结论。

    值得一提的是,刚刚所说的步骤中,训练模型使用的语料库的语者并不会在后续模型使用中出现。

  • 而 SV 模型的这一套思想,其实和 Metric-based meta learning 思想近乎相同。详情可以参考(2) Meta Learning – Metric-based (1/3) - YouTube。

数据集
  • 训练 SV 抽取 Speaker Embedding 的模型需要一个多大的数据集呢?谷歌用了 18000 个语者,总共 36M 个句子去训练模。实验跑不动这种数据。一般我们会用相对小一些的 Benchmark Corpus(基准语料库),比如 VoxCeleb 数据集来训练。

Speaker Embedding 制作方法
  • 早期采用的方法是 i-vector,不管输入的语音有多长,最终都会生成一个400维的 i-vector,来表示声纹信息。i 意思是 identity。i-Vector 是一个非常强的方法。在 16 年之前都没有被 DL 打败。

  • 而最早采用 deep learning 来抽取 Speaker Embedding 的模型就是 d-vector。它是截取一小段声音讯号(因为后面使用的 DNN 输入长度是固定的),送到 DNN中去,经过多层网络后最终输出。在训练过程中,我们一直将这个模型当成 Speaker Recognition 模型来进行训练,即最后输出是哪个语者讲的话。而模型训练完后,其最后一个隐藏层的输出我们将它拿出来,这就是我们要的 d-vector

    我们不用最后一层 output layer 的输出,就是因为此时它将要决定是声音来源于哪个语者,所以它的维度是和训练时语者数目有关的,而我们并不想要这样的 vector,所以使用的是最后一个隐藏层(hidden layer)的输出。

  • 当然,刚刚的方法只是看了一小段语音而已。想要看完一整段语音也很简单,每一个小段都进行上述的操作,最终取平均,就得到最终的 d-vector了。在 2014 年,d-vector 可以做到与 i-vector 相当的效果。不过这也只是让大家知道,原来深度学习可以做这玩意。

  • 到了2018 年,出了 x-vector。它会把每个语音片段通过模型后的输出用一种方式聚合起来,而不是像 d-vector 那样简单的取平均。这种方式是取每个维度的均值和方差向量,拼接起来后,再输入给一个模型做 Speaker Recognition 任务。到时取这个模型输出的隐层,作为表征声纹信息的 x-vector。它与 d-vector 不同在,它考虑的是一整段的语音信息。这里也可以考虑用 LSTM 来做聚合。

  • 当然也可以用 Attention 来做啦,算出每一个语音片段的注意力权重,然后再做加权求和。还有从图像那边借来的方法 NetVLAD,其主要思想是一段语音中并非所有的片段都是人声,其中有的是环境噪音。我们可以想办法从中只取出人声的部分。具体细节这里不再赘述。

  • 综合这些方法,我们都是先按照 Speaker Recognition 任务来进行模型的训练,然后再抽取输出,拿到 Speaker Verification 任务中去用。

三、End-to-End 端到端学习

此前,我们都是想办法得到 Speaker Embedding,然后计算二者的相似度来完成任务的。这是分离的方法,那我们有没有什么办法将“计算 Speaker Embedding”和“计算相似度”二者联合起来做 joint learning,一起去学习训练呢?

训练数据准备
  • 首先我们需要准备我们训练的数据。在以前的任务中,我们手上有的资料是一堆的语者,每个语者说了一堆的话。假设我们的 Enrollment 环节要求语者要说 k 句话,那么我们就这么准备资料:

    • Positive Examples:从某个语者说的话中挑出 k 句话当作注册的句子输入进模型中,取同一个语者的另一句话当作测试的句子再输入进模型中,最终输出的数值要越大越好。

    • Negative Examples:从某个语者说的话中挑出 k 句话当作注册的句子输入进模型中,取另一个语者的一句话当作测试的句子再输入进模型中,最终输出的数值要越小越好。

  • 当然,除了这种准备数据集的方法,我们还有其他各种各样的方法,比如 Generalized E2E(GE2E,[Wan, et al., ICASSP’18])等等,这里不再赘述。

模型设计
  • 端到端模型它内部的构造是完全仿造传统的 SV 的模型。有 K 个注册的句子,每一个句子都会进入一个网络中并产生一个 vector 来充当 Speaker Embedding,用来测试的句子也是一样,经过一个网络生成一个 vector。

  • 接下来,我们取注册句子生成的 vector 做个平均,得到一个 vector,然后再将其与刚刚测试句子生成的 vector 计算相似度,这里也可以使用一个网络来计算相似度,最终得到一个分数。怎样端对端训练?不同人讲的语音我们就希望分数能小点,同一个人讲的声音我们就希望分数大点。

  • 常用的相似度计算是先计算二者的余弦相似度,然后再做一些小变换,如乘上一个权重,然后再加一个偏置。

  • 这种端对端的模型可以分成 Text-dependent 和 Text-independent。若注册和评估说的都是相同文字内容,就是 Text-dependent,比如必须要说同样的暗语“芝麻开门”。若可以是不同的文字内容,就是Text-independent。

  • 如果想做 Text-independent,那么我们在抽取 Speaker Embedding 类似物的时候就需要尽可能只抽取语者信息,而不去抽取内容信息。在这里,我们可以引入 GAN 的思想,来对抗训练。我们可以在 生成的 Speaker Embedding 后面接上一个 Discriminator(判别器),来识别文字内容(有点像 ASR)。而我们训练的目标又多了一个,输出 Speaker Embedding 的网络要想办法去骗过这个判别器,尽可能让它无法从声纹嵌入中识别出文字内容。

四、一些补充的问题与回答

  1. EER 的意义是什么:

    因为此模型的错误有两种,一种是明明是同一个人说的,你说是不同人;还有一种是话是不同人说的,你却判断是同一个人说的。那么这就要涉及到两种错误率的 trade-off(权衡折衷),那么 EER 就是看当这两种错误的错误率相同时大小为多少,以此来评判模型优劣。

    这里还可以参考知乎上的回答:如何理解等错误率(EER, Equal Error Rate)?请不要只给定义 - 知乎 (zhihu.com),其实大差不差啦。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker部署微服务

目录 docker操作命令 镜像操作命令 拉取镜像 导出镜像 删除镜像 加载镜像 推送镜像 部署 pom文件加上 在每个模块根目录加上DockerFile文件 项目根目录加上docker-compose.yml文件 打包,clean,package 服务器上新建文件夹 测试docker-compo…

C#中的迭代器和分部类

目录 一、迭代器 1.示例源码 2.生成效果: 二、分部类 1.示例源码 2.生成效果 迭代器在集合类中经常使用,而分部类则提供了一种将一个类分成多个类的方法,这对于有大量代码的类非常实用。 一、迭代器 迭代器是可以返回相同类型的值的有…

unreal 指定windows SDK

路径 &#xff1a; “C:\Users\Administrator\AppData\Roaming\Unreal Engine\UnrealBuildTool\BuildConfiguration.xml” 在Configuration中添加 <WindowsPlatform><WindowsSdkVersion>10.0.20348.0</WindowsSdkVersion></WindowsPlatform>示例&…

Android二维码扫描开源库 - BGAQRCode-Android

目录 ● 功能介绍 ● 常见问题 ● 效果图与示例 apk ● Gradle 依赖 ● 布局文件 ● 自定义属性说明 ● 接口说明 ● 下载源码 功能介绍 根据之前公司的产品需求&#xff0c;参考 barcodescanner 改的&#xff0c;希望能帮助到有生成二维码、扫描二维码、识别图片二维码等需求…

【Vue】插值表达式

作用&#xff1a;利用表达式进行插值渲染 语法&#xff1a;{ { 表达式 } } 目录 案例一&#xff1a; 案例二&#xff1a; 案例三&#xff1a; ​编辑 注意&#xff1a; 案例一&#xff1a; <!DOCTYPE html> <html lang"en"> <head><me…

mapTR环境配置和代码复现

MAPTR: STRUCTURED MODELING AND LEARNING FOR ONLINE VECTORIZED HD MAP CONSTRUCTION 论文 :https://arxiv.org/pdf/2208.14437.pdf 代码:https://github.com/hustvl/MapTR MapTR,是一个结构化的端到端框架,用于高效的在线矢量化高精地图构建。我们提出了一种基于统一…

Python实现交易策略评价指标-收益率

1.收益率的定义 收益率几乎是所有投资者都会关注的一个指标&#xff0c;收益率的高低决定了投资策略的赚钱能力&#xff0c;常见关于收益率的指标如下&#xff1a; 持有期收益率 持有期收益率 期末投资权益 − 期初投资权益 期初投资权益 持有期收益率 \frac {期末投资权益…

ELK企业级日志分析平台——ES集群监控

启用xpack认证 官网&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/7.6/configuring-tls.html#node-certificates 在elk1上生成证书 [rootelk1 ~]# cd /usr/share/elasticsearch/[rootelk1 elasticsearch]# bin/elasticsearch-certutil ca[rootelk1 ela…

OpenAI 曾收到 AI 重大突破警告;半独立的 OpenAI 比与微软合并更好丨 RTE 开发者日报 Vol.91

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

图解分库分表

中大型项目中&#xff0c;一旦遇到数据量比较大&#xff0c;小伙伴应该都知道就应该对数据进行拆分了。有垂直和水平两种。 垂直拆分比较简单&#xff0c;也就是本来一个数据库&#xff0c;数据量大之后&#xff0c;从业务角度进行拆分多个库。如下图&#xff0c;独立的拆分出…

自养号测评补单对亚马逊,美客多,国际站卖家有什么影响

做测评&#xff0c;补单。其本质也是增加真实用户浏览下单&#xff0c;得到平台规则的承认&#xff0c;让它给你更多曝光和排名&#xff0c;从而增加转化率。相信很多卖家都没做过测评&#xff0c;补单。只靠着产品优化&#xff0c;广告和催评等手段来提升店铺&#xff0c;但是…

暗物质探测器认知教学VR元宇宙平台打破传统束缚

“飞船正在上升&#xff0c;马上就冲出大气层了!”这是一位在1&#xff1a;1还原的神舟飞船返回舱内借助VR设备置身元宇宙世界&#xff0c;沉浸式体验升空全过程的游客兴奋地说道。不仅如此&#xff0c;在载人飞船训练期&#xff0c;元宇宙技术为航天员虚拟一个逼真的太空世界&…

Modbus RTU、Modbus 库函数

Modbus RTU 与 Modbus TCP 的区别 一般在工业场景中&#xff0c;使用 Modbus RTU 的场景更多一些&#xff0c;Modbus RTU 基于串行协议进行收发数据&#xff0c;包括 RS232/485 等工业总线协议。采用主从问答式&#xff08;master / slave&#xff09;通信。 与 Modbus TCP 不…

uni-app打包后,打开软件时使其横屏显示

找到page.json文件&#xff0c;在global加入以下代码&#xff1a; 这样就可以横屏显示了。

Django框架之中间件

目录 一、引入 二、Django中间件介绍 【1】什么是Django中间件 【2】Django中间件的作用 【3】示例 三、Django请求生命周期流程图 四、Django中间件是Django的门户 五、Django中间件详解 六、中间件必须要掌握的两个方法 (1) process_request (2) process_respon…

Vivado Modelsim联合进行UVM仿真指南

打开Vivado&#xff0c;打开对应工程&#xff0c;点击左侧Flow Navigator-->PROJECT MANAGER-->Settings&#xff0c;打开设置面板。点击Project Settings-->Simulation选项卡&#xff0c;如下图所示。 将Target simulator设为Modelsim Simulator。 在下方的Compil…

Android修行手册-超出父布局进行显示以及超出父布局实现点击

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

postgresql数据库中update使用的坑

简介 在数据库中进行增删改查比较常见&#xff0c;经常会用到update的使用。但是在近期发现update在oracle和postgresql使用却有一些隐形区别&#xff0c;oracle 在执行update语句的时候set 后面必须跟着1对1的数据关联而postgresql数据库却可以一对多&#xff0c;这就导致数据…

GaussDB技术解读系列:数据实例的连接

GaussDB是华为公司倾力打造的自研企业级分布式关系型数据库&#xff0c;该产品具备企业级复杂事务混合负载能力&#xff0c;同时支持优异的分布式事务&#xff0c;同城跨AZ部署&#xff0c;数据0丢失&#xff0c;支持1000扩展能力&#xff0c;PB级海量存储等企业级数据库特性。…

【实战精选】掌握图像风格迁移:构建基于生成对抗网络的系统

1.研究背景与意义 随着计算机技术的不断发展&#xff0c;图像处理和计算机视觉领域取得了长足的进步。图像风格迁移是其中一个备受关注的研究方向&#xff0c;它可以将一幅图像的风格特征应用到另一幅图像上&#xff0c;从而创造出新的图像。这项技术具有广泛的应用前景&#…