![](https://img-blog.csdnimg.cn/20190927151124774.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
语音技术
文章平均质量分 91
本专栏涵盖说话人识别、PyTorch实战、声学特征提取、傅里叶变换。
DEDSEC_Roger
语音算法,说话人识别,Python,C++。
展开
-
解决:soundfile打开opus文件出错: File contains data in an unimplemented format.
【代码】解决:soundfile打开opus文件出错: File contains data in an unimplemented format.原创 2023-12-18 10:18:08 · 599 阅读 · 0 评论 -
深入理解Transformer,兼谈MHSA(多头自注意力)、Cross-Attention(交叉注意力)、LayerNorm、FFN、位置编码
【代码】深入理解Transformer,兼谈MHSA(多头自注意力)、Cross-Attention(交叉注意力)、LayerNorm、FFN、位置编码。原创 2023-11-27 09:50:38 · 4881 阅读 · 0 评论 -
回声消除-卡尔曼滤波
卡尔曼滤波的设计过程中需要定义两个变量,一个是状态量,另一个是观测量。原创 2023-08-17 17:25:17 · 248 阅读 · 0 评论 -
自适应滤波方法——LMS算法
自适应滤波器处理语音信号时,不需要实现知道输入信号和噪声的统计特性,滤波器自身能够在工作过程中学习或估计信号的统计特性,并以此为依据调整自身参数,以达到某种准则/代价函数下的最优滤波效果。对于一些应用(如系统辨识、预测、去噪等),无法事先知道需要操作的参数,必须使用自适应的系数进行处理,这种情况下通常使用自适应滤波器。每个Y(k)的长度为2N,输出序列y(k)的N点线性卷积等于Y(k)经过傅里叶逆变换的后N个点。非自适应滤波器:具有静态滤波器系统的数字滤波器,静态系数构成了滤波器的传递函数。原创 2023-05-30 15:21:38 · 1359 阅读 · 0 评论 -
数字信号的基本运算——线性卷积(相关)和圆周卷积(相关)
在介绍卷积和相关运算之前,需要先认识一些更加基本的运算。原创 2023-05-28 17:40:23 · 2068 阅读 · 0 评论 -
说话人识别损失函数的PyTorch实现与代码解读
说话人识别中的损失函数分为基于多类别分类的损失函数,和端到端的损失函数(也叫基于度量学习的损失函数),关于这些损失函数的理论部分,可参考说话人识别中的损失函数本文主要关注这些损失函数的实现,此外,文章说话人识别中的损失函数中,没有详细介绍基于多类别分类的损失函数,因此本文会顺便补足这一点本文持续更新。原创 2023-01-18 02:09:31 · 1358 阅读 · 0 评论 -
说话人识别中的Temporal pooling(时序池化)
Temporal pooling(时序池化)是说话人识别神经网络中,声学特征经过frame-level变换之后,紧接着会进入的一个layer。目的是将维度为bsFT(bs,F,T)bsFT的特征图,变换成维度为bsF(bs,F)bsF的特征向量在这个过程中,T这个维度,也就是frame的个数,消失了,因此时序池化本质上可以看作:从一系列frame的特征中,挖掘出最能代表特征图信息的特征,并且要把长度可变的frame序列,变换为固定长度的特征向量。原创 2023-01-15 01:49:12 · 1920 阅读 · 1 评论 -
深入理解ECAPA-TDNN——兼谈Res2Net、ASP统计池化、SENet、Batch Normalization
ECAPA-TDNN是说话人识别中基于TDNN的神经网络,是目前最好的单体模型之一关于TDNN,可以参考深入理解TDNN(Time Delay Neural Network)——兼谈x-vector网络结构。原创 2023-01-10 02:51:04 · 8444 阅读 · 9 评论 -
说话人识别中的分数规范化(Score Normalization)
在说话人辨认任务中,我们会将待验证的话语ttt与已注册的话语集合e1e2ene1e2...en,计算相似度,得到se1tse2tsentse1tse2t...sent,其中的最大值seits(e_i,t)seit,会与阈值ththth比较seit≥tht属于说话人iseittht不属于任何一个说话人。原创 2023-01-08 20:47:15 · 612 阅读 · 0 评论 -
深入理解TDNN(Time Delay Neural Network)——兼谈x-vector网络结构
TDNN(Time Delay Neural Network,时延神经网络)是用于处理序列数据的,比如:一段语音、一段文本将TDNN和统计池化(Statistics Pooling)结合起来,正如x-vector的网络结构,可以处理任意长度的序列TDNN出自x-vector出自。原创 2023-01-01 16:38:38 · 7971 阅读 · 4 评论 -
说话人识别中的数据预处理和数据增强
解决方案是:利用源领域的语音和文本数据,合成目标领域的语音数据。合成的数据并不是真正的目标领域数据,而是一种近似(Proxy)数据。上述的时频域增强和时域增强,提高了录音设备和声学环境的多样性。那么对于说话人和文本的多样性,就需要用到语音合成增强方法。语音合成增强的核心在于,利用多说话人语音合成模型,输入说话人嵌入码和文本内容,就能合成对应的语音。关于多说话人语音合成模型,可参考。原创 2022-12-24 21:13:42 · 1855 阅读 · 0 评论 -
说话人识别中的数据需求
机器学习领域名言“Garbage In, Garbage Out!”不论神经网络多么先进,如果输入是垃圾,那么输出也一定是垃圾在说话人识别领域,所需的最小数据单元,包括:一段只包含单一说话人语音的音频,被称为Utterance(话语)该段音频的说话人标签,能够唯一地在整个数据集中标识该说话人怎么样的数据不是Garbage呢?或者说,如何评价一个数据集的质量呢?有以下这些指标:说话人的数量每个说话人的话语个数文本的多样性口音和语调的多样性录音设备和声学环境的多样性。原创 2022-12-23 21:29:58 · 772 阅读 · 0 评论 -
说话人识别中的损失函数
损失函数多说话人交叉熵输入单个话语两个话语三个话语N+1N+1N+1个话语N×MN \times MN×M个话语中心点使用否否否使用一个说话人的中心点使用一个batch中所有说话人的中心点实现方式SoftmaxBCE对比BCE对比或Softmax。原创 2022-12-23 00:52:37 · 1350 阅读 · 0 评论 -
说话人识别神经网络推理方式
说话人识别是一个序列总结(Sequence Summarization)任务,输入是音频(或者说,声学特征的序列),输出是说话人的嵌入码,有的神经网络可以输入一对音频,直接输出这对音频的相似度分数。与之相对的,语音识别任务是一个序列转导(Sequence Transduction)任务。上述两个任务都有一个共同的挑战:序列的长度是不定的。推理方式各帧独立的逐帧推理固定窗推理全序列推理滑动窗推理基本思想逐帧独立推理将窗中的所有帧堆叠在一起进行推理。原创 2022-12-21 20:18:52 · 911 阅读 · 2 评论 -
因子分析、联合因子分析(JFA)、i-vector
方法GMMGMM-UBMGMM-SVMJFAi-vector动机将每个说话人用一个GMM来表征对所有说话人样本训练一个UBM,利用UBM自适应每个GMM的参数将每个话语样本都用一个GMM来表征,说话人成为SVM的一个类将超向量分解成说话人因子和信道因子将超向量分解成整体因子,再进行信道补偿优点根据中心极限定理,GMM拟合潜力强每个GMM都同源,具有可比性,对于样本较少的说话人,也能自适应出一个GMM利用了SVM这一强大的分类器对超向量进行了降维,去除了部分信道信息。原创 2022-12-18 18:29:34 · 1077 阅读 · 0 评论 -
GMM、GMM-UBM、GMM-SVM
在GMM-UBM框架下,每个说话人都可以被一个超向量表征,因此利用非线性支持向量机来对这些超向量进行分类,下面简述GMM-SVM方法(以后可能会出一期深入理解SVM)E步骤:计算每个样本,到每个高斯分量上的概率,由于高斯分量已经有参数,所以此时的概率是在具有先验知识的前提下得到的,因此是后验概率。一个说话人识别系统通常包括:声学特征提取、说话人编码器、说话人注册数据库、说话人验证/辨认等,如下图所示(图源:语音之家)。本文要介绍的GMM、GMM-UBM、GMM-SVM就属于说话人编码器的范畴。原创 2022-12-17 15:53:06 · 639 阅读 · 0 评论 -
ROC与AUC,DET与EER,minDCF,Identification Accuracy
DET曲线尝试用对数刻度,从而看起来更接近直线。注意:必须要先寻找使。原创 2022-12-13 20:49:50 · 536 阅读 · 1 评论 -
深入理解MFCC(梅尔频率倒谱系数)
取得13个系数后,还会在时序上,对13个系数求一阶差分和二阶差分,二阶差分等价于对一阶差分求一阶差分。表示第n帧的13个系数,将一阶差分和二阶差分与原函数值拼接起来,得到39个系数。通常选取前12个系数,再拼接一个当前frame的能量,共13个。MFCC的输出可以表示为一个二维数组,shape为。越靠前的系数,包含越多的基频和共振峰的信息。,由于是二维数组,所以可以用热力图可视化。原创 2022-12-11 22:07:11 · 17687 阅读 · 4 评论 -
深入理解梅尔刻度、梅尔滤波器组和梅尔时频谱图
读取一段音频,使用短时傅里叶变换,得到普通的时频谱图,然后绘制梅尔滤波器组,值得注意的是,librosa的梅尔滤波器组函数还带有权重归一化功能,即对一个三角形滤波器的每个权重,都除以该三角形的面积,如果不希望进行该归一化,设置参数。从公式可见,对数部分可以以自然对数为底数,也可以以10为底数,不同的底数对应不同的系数,要确定当前的系数,只需要代入(1000Hz, 1000mel)即可。其中,m是当前滤波器的序号,表征了当前的时间段,k是当前频率的序号,表征了当前正在对哪一频率的。原创 2022-12-10 18:23:48 · 5415 阅读 · 0 评论 -
深入理解傅里叶变换(四)
说话人识别常用参数:采样率sr=16kHz,frame-size占据25ms,即400个采样点,可取成sr//40,hop-size占据10ms,即160个采样点,取成sr//100,由于需要用fft,所以分帧之后,frame-size会扩充到512个采样点,扩充采样点不影响帧数,只影响frequency-bins。再次强调,式子中的N = frame-size = window-size,m是当前窗口的序号,第一个窗口序号为0,H = hop-size,w(n)是窗函数。原创 2022-12-09 14:26:56 · 3794 阅读 · 1 评论 -
深入理解傅里叶变换(三)
表示连续的时序信号,在计算机中会被离散化,即:采样->量化->编码。下图中的T为采样周期,即计算机中每个采样点的间隔时间,数字化之后。现在可以告诉大家原因:用计算机做的傅里叶变换本质上是离散傅里叶变换,因此要重建信号,也应该用离散傅里叶逆变换。numpy的fft效果极佳,尽管自己写的rebuild与ift波形重合,但ift绝对误差小于小数点后14位。之前我们遇到的问题是:直接用傅里叶逆变换的公式得到的重建信号,幅值要远远大于原始信号。,只有当采样点数为2的整数次幂时才能运行。fft的算法复杂度是。原创 2022-12-08 17:24:08 · 2013 阅读 · 0 评论 -
深入理解傅里叶变换(二)
寻找一个正弦波分量的公式表述如下:φf=argmaxφ∈[0,1)(∫s(t)⋅sin[2π(ft−φ)]⋅dt)df=(∫s(t)⋅sin[2π(ft−φf)]⋅dt)\begin{aligned}\varphi_f &= argmax_{\varphi \in [0,1)} (\int s(t) \cdot sin[2 \pi (ft - \varphi )] \cdot dt ) \\d_f &= (\int s(t) \cdot sin[2 \pi (ft - \varphi_f )] \c原创 2022-12-08 02:33:57 · 577 阅读 · 0 评论 -
深入理解傅里叶变换(一)
三棱镜能将太阳光分解成七种颜色的可见光。我们知道这七种颜色有不同的波长范围,从而对应不同的频率范围。这给我们一个启示:太阳光这种看起来是白色的光,其实是由不同频率的光组成的,而三棱镜能起到将太阳光分解成不同频率的光的作用。如果把三棱镜看作是一个算法,把太阳光看作是一段信号,那么我们就可以设想:存在一种算法,能将一段信号分解成不同频率的信号。上图表示的是同一段信号,左图为时域图,右图为频域图,频域图中y轴的值最大的那个尖峰(即第二个尖峰)是时域信号最为重要的一个分量(或者说,最为相似的一个分量),而第一个尖原创 2022-12-07 18:07:52 · 2350 阅读 · 0 评论