[简单应用]利用sklearn进行乐曲音色分类
zx-165332016/08/08软件综合 IP:江西

sklearn是python的一个ML库。其文档非常详细,详细程度可称教材级别。使用简便。

运作流程

音频输入==>STFT==>寻峰==>泛音提取==>使用sklearn进行聚类==>输出

有关STFT

本应用中由于输入的音频文件为44k的CD采样率,因此采用的STFT使用44100的原采样率,不再重新采样。并使用8000点的帧长度,步进2000点(即帧重叠6000点),使用hanning窗,以达到足够高的频率分辨度同时足以显示出乐曲的动态变化。

详细: XXXXXXXXXXXXXXXXXXXXXXXX/t/78789

寻峰

这里没有使用特别复杂的寻峰算法,只是最简单的二阶导数+阈值

泛音提取

乐音中各次泛音成分的比例关系反映了声音的音色特征。因此提取前n次泛音与基频的比例,取对数(消除距离不均)后放入n维向量中进行聚类。由于高次数的泛音十分弱,易被噪音干扰,所能提供的特征信息也不多,因此n过大反而不利于分类。经多次测试,n的取值应在4附近,效果比较理想。 同时,由于和弦结构会对泛音产生一定干扰(例如,其中五度音程的两个音,二、三次泛音将会重叠在一起),因此应使用尽量简单的乐曲。

聚类

聚类使用sklearn库的SpectralClustering算法。样本应采用乐器种类较多,音色差别较大的乐曲,经实际测试,对部分乐器种类较少的乐曲分类效果不好。n_clusters的值应按照实际音色种类选择。

测试散点图

这几张图是各种测试参数的结果中效果比较好的几张。 泛音向量维度 3~5 n_clusers 5~7

figure_1-35.png fig.35 figure_1-30.png fig.30 figure_1-29.png fig.29 figure_1-27.png fig.27

从散点图中可看出,由于过于简单的寻峰算法,导致较弱的音丢失严重(例如最开头一段),较强的部分噪音比较严重(例如fig.36后部) 图中总体上还是能够反映出乐曲中各种乐器的使用情况的。

测试音频:
StarSky.mp3 5.11MB立即下载 mp3格式,请转换成wav后使用。(linux用户请使用mpg123而不是mpg321,python的wave库似乎无法读取mpg321所转换出的wav格式。。。。然而使用ubuntu的音乐播放器,视频播放器和octave读取都完全正常)

代码:XXXXXXXXXXXXXXXXXX/gym487/MLProj/

按规定论坛上传一份:
attachment icon MLProj.rar 5.07MB RAR 48次下载

[修改于 8年5个月前 - 2016/08/08 16:06:39]

来自:计算机科学 / 软件综合
4
2
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
1211
8年5个月前 IP:四川
824206
赞扬,应该可以推广用来做其它各种谱的自动分析。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
Cirno
8年5个月前 修改于 8年5个月前 IP:美国
824207

这个好玩,做了STFT以后对音乐的处理跟图像处理很像了。
3_2.jpg 无标题.png 回想起以前为了交作业抓学音乐的同学帮忙手动分析泛音的事了,因为坐标系的缘故,这里的图跟楼主在频率上是上下颠倒的。

看了一下代码,用的好像应该是 spectral clustering? DBSCAN 是不用预先知道需要分的cluster的数目。另外我在想,这个的 Feature selection 除了基于已有音乐知识,选择用泛音基频比例,有没有可能试试用PCA之类的方法盲处理? 我也想好好想一下,有脑洞了再来回复。

还有一个就是,如果改用supervised learning 来对不同乐器成分进行分类,对一段音乐的ground truth标记有什么比较好的解决方法?我现在能想到的只有用乐谱或者同一首曲目的MIDI文件。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
zx-16533作者
8年5个月前 修改于 8年5个月前 IP:江西
824215
引用 琪露诺:
这个好玩,做了STFT以后对音乐的处理跟图像处理很像了。

3_2.jpg
无标题.png
回想起以前为了交作业抓学音乐的同学帮忙手动分析泛音的事了,因为坐标系的缘故,这里的……
DBSCAN是笔误,已改。
原先确实用过DBSCAN,但是感觉它的参数不大好调整,效果不好。后来改成SpectralClustering,副作用就是慢了好多。
给记混了2333

MATLAB、Octave和matplotlib里的specgram()的图都是这种纵坐标反过来的2333。。。不过MATLAB生成了图之后还可以把坐标轴编辑正过来。。//其实另外两个也行...只是没有一个“坐标轴反转”的勾勾,但是调换下上下限是一样的......

使用PCA也许能在处理比较复杂的成分时也能获得十分好的效果......具体应用方法有待研究......

如果用有监督的话,先生成标签,再按标签生成MIDI文件,再以此用软音源/MIDI播放器之类的东西(貌似有python库可以干这个?)来生成对应的音频样本应该是比较可行的办法。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
bg8npk
8年5个月前 IP:广东
824241
引用 琪露诺:
这个好玩,做了STFT以后对音乐的处理跟图像处理很像了。

3_2.jpg
无标题.png
回想起以前为了交作业抓学音乐的同学帮忙手动分析泛音的事了,因为坐标系的缘故,这里的……
可不可以套和弦呢?
乐曲里和弦的组成一般来说总是不变且有规律的,跑无规律(相比之下)单音的乐器除了人声,只占比较小的部分,从这个规律入手可能可以做部分训练
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
zx-16533
进士 学者
文章
125
回复
2655
学术分
4
2010/08/22注册,3年7个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:未同步
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}