基于d-vector的声纹识别(作为初学者的小总结)

基于d-vector的声纹识别(作为初学者的小总结😉)——2023年12月22日

0、简要介绍

目的是使用d-vectors来创建声纹识别(speaker identification)和分离系统(speaker diarization)
d-vector顾名思义就是一个从音频中提取出来的矩阵,就是把这个d-vector代表一个人的“声音指纹”
d-vector使用DNN提取出来的,为了提取d-vector,DNN模型采用堆叠的滤波器组特征(这是啥意思?

1、数据data

这篇文章说需要至少12-15s的speaker所说的任何话作为voice samples,训练样本要至少2-6s
这篇文章采用的是基于hindi(北印度)语的youtube视频

2、数据预处理

得到了音频之后,要首先对他们采样(sample),我们对音频随机采样,采样时间从5秒到10秒不等。随机采样帮助模型更具有泛化性。
举个例子帮助理解采样: 假设我们有一批包含1小时音频记录的数据集。如果我们直接使用完整的1小时音频进行模型训练,这将需要大量的计算资源和时间。相反,我们可以对每个音频文件进行随机采样。假设我们设置采样长度在5秒到10秒之间。那么对于每个音频文件,我们会随机选择5秒、6秒、7秒、8秒、9秒或10秒的片段进行采样。这样,即使每个音频文件只提供了几个短时段的采样数据,但在整个数据集中仍然能够获得足够多样性的音频片段。
许多的研究都是在这个真实的音频数据上加入一些模拟数据,比如增加一些模拟的白噪声,或者背景噪声来提高训练的准确性。
所以在本项目中采用添加白噪声,改变音高(pitch)和增加背景噪声来提高模型的准确性。

3、数据增强 data augmentation

文章推荐了两个话音的python libraries:librosa和nlpaug
link : librosanlpaug

(1)增加白噪声adding white noise

import librosa
import nlpaug.augmenter.audio as naa
file='sample.wav'
out='noiced_sample.wav'
audio, sampling_rate = librosa.load(file,sr=8000)
aug_noise = naa.NoiseAug(noise_factor=0.008)
augmented_noise = aug_noise.substitute(audio)
librosa.output.write_wav(out,augmented_noise,sr=8000)

(2)更改音高 changing pitch

file='sample.wav'
out='pitched.wav'
audio, sampling_rate = librosa.load(file,sr=8000)
aug_pitch = naa.PitchAug(sampling_rate=sampling_rate,
                         pitch_range=(1,2))
augmented_pitch = aug_pitch.substitute(audio)
librosa.output.write_wav(out,augmented_pitch,sr=8000)

(3)增加背景噪声

增加背景噪声就是要把背景噪声叠加到音频样本中,所以两个音频文件应该是等长的。但大多数的情况不是等长的,所以就需要我们把短的音频用0填充为长的音频。

file='sample.wav'
out='ambient_sound.wav'
        
y1, sample_rate1 = librosa.load(n_file, mono=True,sr=8000)
y2, sample_rate2 = librosa.load(file, mono=True,sr=8000)
     
if y1.shape[0]<y2.shape[0]:
      r = np.zeros(y2.shape)         #padding with zeros
      r[:y1.shape[0]]=y1
      amp=(r+y2)/2
if y1.shape[0]>y2.shape[0]:
      r = np.zeros(y1.shape)         #padding with zeros
      r[:y2.shape[0]]=y2
      amp=(r+y1)/2
librosa.output.write_wav(out,amp,
                sr=int((sample_rate1+sample_rate2)/2))

一个小tip🌸:
可以尝试更加随机的增加噪声来增强数据。比如不要把所有音频都加上白噪声或者环境噪声,而是随机的选择一些音频加入随机的一些噪声,增加了随机性👍

4、创建模型

以前我们使用MCFF和FBANK等方法提取话音特征,但这种方法并不能提取任意的话音的全部特征
使用SincNet神经网络来生成d-vector
SincNet的优势:

  • 快速收敛 fast convergence
  • 训练参数量少
  • 可解释性interpretability
    呜呜呜,文章没有给代码,我准备看一下SincNet
  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于引用[1]和引用的内容,我们可以得知CNN-LSTM结合可以用于声识别任务。下面是一个简单的CNN-LSTM声识别模型的示例代码: ```python from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D, LSTM, Dense, Flatten, TimeDistributed # 定义CNN模型 cnn_model = Sequential() cnn_model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(40, 500, 1))) cnn_model.add(MaxPooling2D(pool_size=(2, 2))) cnn_model.add(Conv2D(64, (3, 3), activation='relu')) cnn_model.add(MaxPooling2D(pool_size=(2, 2))) cnn_model.add(Flatten()) # 定义LSTM模型 lstm_model = Sequential() lstm_model.add(TimeDistributed(cnn_model, input_shape=(10, 40, 500, 1))) lstm_model.add(LSTM(64, return_sequences=True)) lstm_model.add(LSTM(32)) # 添加全连接层 lstm_model.add(Dense(128, activation='relu')) lstm_model.add(Dense(1, activation='sigmoid')) # 编译模型 lstm_model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) ``` 上述代码中,我们首先定义了一个CNN模型,然后将其作为TimeDistributed层的输入,再将TimeDistributed层作为LSTM模型的输入。这样做的目的是将CNN模型应用于时间序列数据,即将每个时间步的输入都通过CNN模型进行特征提取,然后将提取的特征序列输入到LSTM模型中进行分类。 需要注意的是,上述代码中的输入数据是40x500的声谱图,因此需要将输入数据reshape为(40, 500, 1)的形状。同时,我们将输入数据分为10个时间步,每个时间步包含一个40x500的声谱图,这样做的目的是增加模型的鲁棒性,避免模型过拟合。 --相关问题--: 1. 什么是声识别? 2. LSTM模型的原理是什么? 3. 如何评估

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭小儒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值