目的是使用d-vectors来创建声纹识别(speaker identification)和分离系统(speaker diarization)
d-vector顾名思义就是一个从音频中提取出来的矩阵,就是把这个d-vector代表一个人的“声音指纹”
d-vector使用DNN提取出来的,为了提取d-vector,DNN模型采用堆叠的滤波器组特征(这是啥意思?)
这篇文章说需要至少12-15s的speaker所说的任何话作为voice samples,训练样本要至少2-6s
这篇文章采用的是基于hindi(北印度)语的youtube视频
得到了音频之后,要首先对他们采样(sample),我们对音频随机采样,采样时间从5秒到10秒不等。随机采样帮助模型更具有泛化性。
举个例子帮助理解采样: 假设我们有一批包含1小时音频记录的数据集。如果我们直接使用完整的1小时音频进行模型训练,这将需要大量的计算资源和时间。相反,我们可以对每个音频文件进行随机采样。假设我们设置采样长度在5秒到10秒之间。那么对于每个音频文件,我们会随机选择5秒、6秒、7秒、8秒、9秒或10秒的片段进行采样。这样,即使每个音频文件只提供了几个短时段的采样数据,但在整个数据集中仍然能够获得足够多样性的音频片段。
许多的研究都是在这个真实的音频数据上加入一些模拟数据,比如增加一些模拟的白噪声,或者背景噪声来提高训练的准确性。
所以在本项目中采用添加白噪声,改变音高(pitch)和增加背景噪声来提高模型的准确性。
文章推荐了两个话音的python libraries:librosa和nlpaug
link : librosa、nlpaug
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)
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)
增加背景噪声就是要把背景噪声叠加到音频样本中,所以两个音频文件应该是等长的。但大多数的情况不是等长的,所以就需要我们把短的音频用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:
可以尝试更加随机的增加噪声来增强数据。比如不要把所有音频都加上白噪声或者环境噪声,而是随机的选择一些音频加入随机的一些噪声,增加了随机性
以前我们使用MCFF和FBANK等方法提取话音特征,但这种方法并不能提取任意的话音的全部特征
使用SincNet神经网络来生成d-vector
SincNet的优势: