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

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

目录

  • 基于d-vector的声纹识别(作为初学者的小总结:wink:)——2023年12月22日
    • 0、简要介绍
    • 1、数据data
    • 2、数据预处理
    • 3、数据增强 data augmentation
      • (1)增加白噪声adding white noise
      • (2)更改音高 changing pitch
      • (3)增加背景噪声
    • 4、创建模型

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 : librosa、nlpaug

(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

你可能感兴趣的:(声纹识别,python,人工智能)