【2020华为云AI实战营】利用Librosa和noisereduce进行语音降噪

举报
pr0d1gy 发表于 2020/08/30 21:55:38 2020/08/30
【摘要】 实战营第八章课程实践中,我们已经学习了语音识别领域的常见任务,并使用Librosa工具绘制音频的波形图、频谱图和MFCC特征图,作业里更是要求使用Librosa工具对音频文件进行变声处理。Librosa功能强大,这里我们来学习一下如何配合noisereduce工具进行语音降噪。首先我们准备一段清晰的音频文件,见附件a.wav或者b.wavdata, rate = librosa.load(t...


实战营第八章课程实践中,我们已经学习了语音识别领域的常见任务,并使用Librosa工具绘制音频的波形图、频谱图和MFCC特征图,作业里更是要求使用Librosa工具对音频文件进行变声处理。

Librosa功能强大,这里我们来学习一下如何配合noisereduce工具进行语音降噪。


首先我们准备一段清晰的音频文件,见附件a.wav或者b.wav

data, rate = librosa.load(test1, sr=None)
IPython.display.Audio(data=data, rate=rate)

plot一下振幅是这样的

Screenshot 2020-08-30 at 20.57.06.png

接下去我们加入一段噪音

# add noise
from noisereduce.generate_noise import band_limited_noise

noise_len = 2 # seconds
noise = band_limited_noise(min_freq = 2000, max_freq = 12000, samples=len(data), samplerate=rate)*10
noise_clip = noise[:rate*noise_len]
audio_clip_band_limited = data+noise

noise_clip噪音音频:

Screenshot 2020-08-30 at 21.14.31.png

添加了噪音的音频:

Screenshot 2020-08-30 at 21.02.34.png


我们再来尝试一下去掉噪音

# remove noise
noise_reduced = nr.reduce_noise(audio_clip=audio_clip_band_limited, noise_clip=noise_clip, prop_decrease=1.0, verbose=True)


Screenshot 2020-08-30 at 21.18.50.png

Screenshot 2020-08-30 at 21.17.25.png

大家可以看到最后一张recovered spectrogram,降噪效果不错。

接下去我们来试试一段真实录制的咖啡馆的噪音

Screenshot 2020-08-30 at 21.22.28.png

加入到刚才无噪的音频中

snr = 2 # signal to noise ratio
noise_clip = noise_data/snr
audio_clip_cafe = data + noise_clip

如果这里报错,只要简单处理一下data[:200542]就可以了

operands could not be broadcast together with shapes (221174,) (200542,)

Screenshot 2020-08-30 at 21.28.06.png

可以明显看到讲话时候的振幅,降噪处理结果

Screenshot 2020-08-30 at 21.30.39.png

Screenshot 2020-08-30 at 21.29.41.png

处理后为

Screenshot 2020-08-30 at 21.32.10.png

可以看到中间降噪效果明显,但一开始由于原音频没有振幅,噪音也被默认添加进去了,最好的处理办法就是在原音频上只剪辑振幅较大的片段。


以上均在cpu上完成,那如果gpu速度上是否会有提升呢?

noise_reduced = nr.reduce_noise(audio_clip=audio_clip_cafe.astype('float32'),
                                noise_clip=noise_clip.astype('float32'),
                                use_tensorflow=True, 
                                verbose=False)
# compare longer clips
# make a longer clip by repeating the same clip a few times
longer_clip = np.concatenate([audio_clip_cafe.astype('float32') for i in range(100)])
print("Clip is {} seconds long.".format(round(len(longer_clip)/rate)))

将100段Clip拼接进行比较

这里我们用%%timeit


non-tensorflow
15.7 s ± 12.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
tensorflow
9.29 s ± 27.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


可见gpu还是有明显提升的。

    附件下载

  • data.zip 9.12MB 下载次数:48
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200