前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何用卷积神经网络从歌曲中提取纯人声?这里有教程+代码

如何用卷积神经网络从歌曲中提取纯人声?这里有教程+代码

作者头像
量子位
发布2018-03-30 15:31:07
1.8K0
发布2018-03-30 15:31:07
举报
文章被收录于专栏:量子位量子位
安妮 编译整理自 Madebyollin博客 量子位 报道 | 公众号 QbitAI

你应该对阿卡贝拉(Acapella)不陌生吧。这种无伴奏合唱的纯音乐起源于中世纪的教会音乐,虽曾一度濒临灭绝,但在今天人们又开始怀念起这种纯人声合唱。

这阵猝不及防“Acapella热”仿佛唤起人们对这种原始音乐形式的渴望。很多音乐人发现将纯人声清唱用来混音听觉效果很好,但无奈纯人声资源目前很难寻找。因此,音乐论坛中尝尝出现“一曲难求”的景象。

幸运的是,坐落于华盛顿大学的程序猿Ollin Boer Bohan(Twitter:@madebyollin)发布在GitHub上的代码可以解决这个问题。这个程序可以过滤掉一段音乐中的伴奏,将纯人声部分提取出来。比如,这首来自Vicetone的金曲《No Way Out》,纯人声部分就是这样的。

去原文听纯人声和带配乐版对比:
http://www.madebyollin.com/posts/cnn_acapella_extraction/

它是怎样实现的?

模型背后,其实隐藏着对程序猿对纯人声的理解——

人声和乐器声,有着不同的特征,表现在声谱图上也不一样。Ollin Boer Bohan所做的,就是将一首歌曲先转化为声谱图,利用卷积神经网络(Convolutional Neural Network, CNN)进行图像识别,再将识别所得的新声谱图转化成音频,生成最后的纯人声部分。整个过程大致如下图所示:

这部分的实现代码:

代码语言:javascript
复制
mashup = Input(shape=(None, None, 1), name='input')
convA = Conv2D(64, 3, activation='relu', padding='same')(mashup)
conv = Conv2D(64, 4, strides=2, activation='relu', padding='same', use_bias=False)(convA)
conv = BatchNormalization()(conv)

convB = Conv2D(64, 3, activation='relu', padding='same')(conv)
conv = Conv2D(64, 4, strides=2, activation='relu', padding='same', use_bias=False)(convB)
conv = BatchNormalization()(conv)

conv = Conv2D(128, 3, activation='relu', padding='same')(conv)
conv = Conv2D(128, 3, activation='relu', padding='same', use_bias=False)(conv)
conv = BatchNormalization()(conv)
conv = UpSampling2D((2, 2))(conv)

conv = Concatenate()([conv, convB])
conv = Conv2D(64, 3, activation='relu', padding='same')(conv)
conv = Conv2D(64, 3, activation='relu', padding='same', use_bias=False)(conv)
conv = BatchNormalization()(conv)
conv = UpSampling2D((2, 2))(conv)

conv = Concatenate()([conv, convA])
conv = Conv2D(64, 3, activation='relu', padding='same')(conv)
conv = Conv2D(64, 3, activation='relu', padding='same')(conv)
conv = Conv2D(32, 3, activation='relu', padding='same')(conv)
conv = Conv2D(1, 3, activation='relu', padding='same')(conv)
acapella = conv

这里的训练数据是基于人声和器乐伴奏的组合动态产生的,并且以每分钟128拍(Beat Per Minute, BMP)为标准,涵盖了男女两种音色。这样和用成对的人声/带伴奏歌曲来训练效果差不多,但获取数据的效率更高。

除了文章开头的No Way Out,原文(地址:http://www.madebyollin.com/posts/cnn_acapella_extraction/)中还给出了更多纯人声与原曲对照的例子。

在这些例子中,人声的过滤并不算完美。作者对模型的特点进行了一些总结:

这个模型在本地信息充足,或者人声音量相对较大的情况下,伴奏声会过滤得比较好。但真正的音乐还包含着更多、更微妙的情况需要模型去推断。很遗憾,这个模型目前还不能处理这么复杂的问题。

有待改进的地方

作者说,他还是神经网络和信号处理新手,这个模型可能还有改进的空间。以下是他希望有机会改进的方面:

完善频率信息:我试了多种方法,将更全面的频率信息整合到模型中,发现这些模型可以减少音质损失,但并不能在这个模式框架里改善性能。我不确定问题的原因是过拟合还是没选好损失函数,所以我并没有把这些频率信息增加到代码库。

更好的损失函数:我目前采用的是均方误差,但更强的模型试验表明均方误差与实际运行表现关联性并不是很好。

立体声信息:目前,该模型只输入/输出单声道数据。用立体声通道训练可能会提高模型从同频率其他声音中识别人声的性能。

更好的时频变换(Time-frequency Transforms):我目前使用短时傅里叶变换(STFT)来处理输入数据,但还不清楚这是不是最好的选择。

最后,对这个模型感兴趣的同学,记得去看原文和代码:

原文:http://www.madebyollin.com/posts/cnn_acapella_extraction/

代码:https://github.com/madebyollin/acapellabot

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 量子位 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 它是怎样实现的?
  • 有待改进的地方
相关产品与服务
图像识别
腾讯云图像识别基于深度学习等人工智能技术,提供车辆,物体及场景等检测和识别服务, 已上线产品子功能包含车辆识别,商品识别,宠物识别,文件封识别等,更多功能接口敬请期待。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档