背景
音频质量检测模型训练中,纯净高质量的音频数据集比较好获得,但是损伤音频的数据集比较少,而且损伤音频的质量得分也很难评估。我们采用了一种只依靠纯净高质量的语音数据集来制作低质量音频并打分的方法。
在语音质量评估中,有很多主观和客观的评价方法。主观的评价方法就是人通过听觉感受来评价音频质量的好坏,并进行打分,常用的评分标准是MOS(Mean Opinion Score)。MOS是国际电信联盟(ITU)在语音质量的主观评价方法ITU-T P.800标准里提出的,该标准是对电话传输系统中声音质量主观评价的概述,其本质就是MOS方法。同时给出语音质量主观评价的普遍方法和普遍测试环境,其他所有测试都遵循该建议,特别是测试环境(在所有的主观评价方法中基本相同)。为完成MOS评价得分,需要大量评测人员对音频质量进行打分,分值范围为1-5分,分数越高表示音频质量越好。一般情况下MOS值大于4的被认为是质量比较好的语音,小于3的则被认为语音质量不合格。
客观的语音质量评估方法即通过算法来评估语音质量,主要有2类,有参考和无参考的语音质量评估方法。两者的主要区别在于是否需要标准音频参考。有参考的除了待评估的音频,还需要一个对应的高质量无损伤的音频作为参考,代表算法如PESQ(Perceptual eval(SNR)的形式加入到纯净语音数据的随机位置上,这种噪音添加方法可以有效地模拟真实场景中的噪声,最后计算PESQ指标作为每一份音频数据的GroundTruth,步骤如下:
- 随机选择加入噪声的起始与结束段落
- 根据指定的信噪比计算加入噪声的强度值
- 在计算好的段落内加入随机选择的噪声种类
- 计算PESQ分数
技术实现
- 随机选择加入噪声的起始与结束段落
def random_sample(n1, n2):
if n1 < n2:
start = random.randint(0, n1)
end = random.randint(start, n1)
else:
start = random.randint(0, n2)
end = random.randint(start, n2)
return
信噪比指为有用信号功率(Power of Signal)与噪声功率(Power of Noise)的比值。为了合成指定信噪比的混合语音,需要对噪声的能量进行调整。根据信噪比的计算公式,计算出噪声能量调整的倍数。
def add_noise(x, d, SNR):
P_signal = np.sum(abs(x) ** 2)
P_d = np.sum(abs(d) ** 2)
P_noise = P_signal / 10 ** (SNR / 10)
k
def make_noise_data(high_wave_data,noise_sample_data):
c_start, c_end = random_sample(len(high_wave_data), len(noise_sample_data))
n_start = random.randint(0, len(noise_sample_data) - (c_end - c_start))
n_end = c_end - c_start + n_start
k = add_noise(high_wave_data, noise_sample_data[n_start:n_end], -10)
convert_data = high_wave_data[c_start:c_end] + k * noise_sample_data[n_start:n_end]
new_wave_data
score = pesq(sr, high_wave_data, low_wave_data, 'nb')
总结
在现实场景中,我们评估一段音频的质量分值的时候,很难找到对应的高质量音频数据做参考,所以无法用PESQ算法来直接计算。我们可以通过神经网络模型来学习这种对应关系,用上面的方法由高质量音频数据构建出对应的低质量音频数据并计算出PESQ的分值;将构建好的两类数据输入给神经网络模型做训练,让神经网络学习内在的对应关系,并给任意输入的音频数据打分。当模型训练好后,我们就能对任意的音频数据进行评估打分,而不需要其对应的参考信号。
标签:noise,end,检测,音频,start,构建,语音,data From: https://blog.51cto.com/u_15649298/5719645