Python音频处理 第1周

515 阅读7分钟

说在前面:由于我对音乐方面的知识可以说是一窍不通,下文中如果存在一些明显的认知错误请务必指出。

musicpy

这个库是由作者Rainbow_Dreamer——一个b站的博主制作的,我们先来看看他对自己作品的介绍:

Musicpy是一个可以让你用编程写音乐的python领域特定语言,可以让你用非常简洁并且可读性高的语法通过乐理知识和算法写出优美的音乐。Musicpy容易学,容易写,可读性也比较强,并且是一个完全计算机化的乐理系统。

Musicpy除了用来创作音乐之外,还可以从乐理层面上来创作音乐和分析音乐,并且你可以在musicpy的基础上设计乐理算法来探索音乐的可能性。

Musicpy可以让你用非常简洁的语法来表达一段音乐的音符,和弦,旋律,节奏,力度等信息,可以通过乐理逻辑来生成曲子,并且进行高级的乐理操作。你可以很容易地把musicpy代码输出为MIDI文件的格式,也可以很简单地加载MIDI文件并且转换为musicpy的数据结构进行高级乐理的操作。musicpy的语法设计非常地简洁与灵活,因此musicpy的代码的可读性比较强,并且musicpy和python完全兼容,因此你可以写python代码和musicpy进行互动。这个库里面涉及到非常多的乐理知识,所以个人推荐至少要先了解一部分乐理再来使用会比较上手。相对地,如果你是一个对乐理比较了解的人,那么看完我在wiki正在写的教程之后你应该很快就可以上手了。

musicpy的github地址: github.com/Rainbow-Dre…

引用原文链接:www.bilibili.com/read/cv5624… 出处:bilibili

如果大家有兴趣的话可以移步他的专栏上面有正在更新的教程:space.bilibili.com/104991944/a…

安装和使用方法和其他Python第三方库一样,用pip进行安装,然后在使用前import就行:

from musicpy import *

注意在使用这个库时不能使用vs code来运行程序代码,因为它会阻止播放音乐的函数,导致程序运行出现问题。我切换到Jupyter Notebook之后就可以正常地跑作者给出的示例代码了。

可以自行尝试跑如下代码:

from musicpy import * 
a = C('CM9') @ [1,3,5,2.1,4.1,5.1] % (1, 1/8) | 1/4
bass = chord('C2, A#1') % ([1, 1], [1, 1]) * 4
piano = (a | a - 2) * 4
string = C('CM9', 4) % (1, 0)
string |= string - 2
string.setvolume(50)
string %= 4
oboe1 = chord('B5[.16;.16], C6[.16;.16], D6[1;1], C6[.2;.2], E6[.2;.2], D6[1;1], C6[7/8;7/8]')
part1 = P([piano | piano-4, bass | bass-4, string | string-4, oboe1 | oboe1-4],
          [9, 34, 49, 'Pan Flute'],
          90,
          [0, 0, 0, 3+7/8])
play (part1)

运行就可以听到一段城市风格的优美音乐了。

这个库我个人觉得是用于音乐创作,语法也非常简单,没有任何乐理知识的人看完也能有个初步的理解,使用它的话还是需要像真正的音乐创作一样,对乐理有了解。如果有需要的话,我们可以利用这个库去做音乐创作。

暂时我还没有发现其中有适合我们对已有音频进行处理的部分,所以我又找了一些别的库,它们可能更适用于我们的主题。

pyAudioProcessing

A Python based library for processing audio data into features (GFCC, MFCC, spectral, chroma) and building Machine Learning models.

原文链接:github.com/jsingh811/p…

这是一个用以歌曲特点学习并分类的机器学习模型,但它的学习方法原理我暂时还不清楚。(后面弄懂了再填坑)

(坑)

第一次尝试——使用作者的示例文件

具体步骤参照原文,用作者给的示例文件可以得到很好的结果,这个机器学习模型可以很好地区分music和speech。由于我做这部分的时候没有记录,详细的步骤说明会放在下文第二次尝试中。

如果返回结果告诉你缺少ffmpeg的话,可以去这个网站下载:Releases · BtbN/FFmpeg-Builds · GitHub,然后解压缩,把里面的文件夹bin的路径添加到系统路径中即可,具体步骤可参考这篇文章:Python 技术篇-ffmpeg.exe的安装及配置_小蓝枣的博客-CSDN博客_ffmpeg.exe

输出告诉你跑出来的结果被放在了一个json文件中:

image.png

如果找不到这个文件直接用Windows的全局搜索功能就能找到,用vs code打开就能看到结果,做到这一步的时候没有截图,可以参考我的第二次尝试中的图。

第二次尝试——自己建数据集进行测试

由于不知道该模型的具体原理,我就只能先简单地把我们要测试的音乐分为三类:流行、民谣和摇滚,由于只是急着想跑出一个结果,所以在歌曲选择和归类上也显得非常草率。

注意:该模型仅支持wav格式的音频。

在训练集中,1代表的是流行,2代表的是民谣,3代表的是摇滚。

image.png

每个类型我都选择了5首歌曲放在训练集中,以类型1为例,分别标号11、12、13、14、15.

image.png

每个类型我都选择了2首歌曲放在测试集中,以类型1为例,分别标号16、17.

image.png

类型2和类型3均同理。

训练模型

代码如下:

from pyAudioProcessing.run_classification import train_and_classify
train_and_classify("C:/Users/WS/Desktop/data/Training", "train", ["gfcc", "spectral", "chroma"], "svm", "svm_clf")

"C:/Users/WS/Desktop/data/Training"代表的是训练集的位置,其中的每一个文件夹在学习过程中都会被当成一个类进行归纳学习,并在之后的测试中提供测试样本属于这个类的概率。

返回结果如下:

There are 3 classes in the specified data folder


        
Training using features gfcc, spectral, chroma with classifier svm that will be saved as svm_clf

        
Analyzing file 1 of 5: C:/Users/WS/Desktop/data/Training\1\11.wav
Analyzing file 2 of 5: C:/Users/WS/Desktop/data/Training\1\12.wav
......
Param = 20.00000 - classifier Evaluation Experiment 100 of 100

		1			2			3		OVERALL
	C	PRE	REC	f1	PRE	REC	f1	PRE	REC	f1	ACC	f1
	0.001	83.7	72.0	77.4	100.0	84.0	91.3	76.9	100.0	87.0	85.3	85.2	 best f1	 best Acc
	0.010	75.4	86.0	80.4	92.4	61.0	73.5	80.8	97.0	88.2	81.3	80.7
	0.500	72.9	70.0	71.4	66.7	66.0	66.3	76.2	80.0	78.0	72.0	71.9
	1.000	70.9	78.0	74.3	69.2	63.0	66.0	75.8	75.0	75.4	72.0	71.9
	5.000	65.5	76.0	70.4	67.5	52.0	58.8	72.9	78.0	75.4	68.7	68.2
	10.000	65.2	75.0	69.8	65.9	56.0	60.5	72.0	72.0	72.0	67.7	67.4
	20.000	68.1	77.0	72.3	65.9	60.0	62.8	78.1	75.0	76.5	70.7	70.6
Confusion Matrix:
	1	2	3
1	24.00	0.00	9.33
2	4.67	28.00	0.67
3	0.00	0.00	33.33
Selected params: 0.00100

暂时还看不懂。

测试模型

代码如下:

train_and_classify("C:/Users/WS/Desktop/data/Testing", "classify", ["gfcc", "spectral", "chroma"], "svm", "svm_clf")

返回结果如下:

There are 3 classes in the specified data folder


Classifying using features gfcc, spectral, chroma with classifier svm that is saved as svm_clf

        

 C:/Users/WS/Desktop/data/Testing\1
Either you passed in data with unknown classes, or
0 out of 2 instances were classified correctly

 C:/Users/WS/Desktop/data/Testing\2
Either you passed in data with unknown classes, or
0 out of 2 instances were classified correctly

 C:/Users/WS/Desktop/data/Testing\3
Either you passed in data with unknown classes, or
0 out of 2 instances were classified correctly

Results saved in classifier_results.json

我们根据指示打开classifier_results.json文件,就可以看到测试的结果。

{
 "C:/Users/WS/Desktop/data/Testing\\1": {
  "16.wav": {
   "probabilities": [
    0.296335733838403,
    0.38952469211365603,
    0.3141395740479408
   ],
   "classes": [
    "1",
    "2",
    "3"
   ]
  },
  "17.wav": {
   "probabilities": [
    0.2802860994983631,
    0.3894131731883921,
    0.3303007273132448
   ],
   "classes": [
    "1",
    "2",
    "3"
   ]
  }
 },
 "C:/Users/WS/Desktop/data/Testing\\2": {
  "26.wav": {
   "probabilities": [
    0.3103611723547706,
    0.3539467655053329,
    0.33569206213989644
   ],
   "classes": [
    "1",
    "2",
    "3"
   ]
  },
  "27.wav": {
   "probabilities": [
    0.3340335039189803,
    0.28536361207511196,
    0.38060288400590747
   ],
   "classes": [
    "1",
    "2",
    "3"
   ]
  }
 },
 "C:/Users/WS/Desktop/data/Testing\\3": {
  "36.wav": {
   "probabilities": [
    0.34334570402145487,
    0.35406713920372007,
    0.30258715677482484
   ],
   "classes": [
    "1",
    "2",
    "3"
   ]
  },
  "37.wav": {
   "probabilities": [
    0.33175649034234805,
    0.38773613030210236,
    0.28050737935554965
   ],
   "classes": [
    "1",
    "2",
    "3"
   ]
  }
 }
}

取上面文件的一块进行举例: 16.wav是前文提到的我们测试集中的音频文件数据,而下文的"probabilities""classes"则是一一对应的关系,这个文件的十位数是1,则表示我们预期它应该是流行类型的音乐,则期望是第一个概率的数值会比较大,但很遗憾它是最小的,所以验证不成功。不过不成功是很正常的,因为本次尝试只是希望能把这个库用自己建的数据集跑出来,已经达成了目标。

失败的原因总结

1、训练集的数据可能不具代表性。

2、测试集的数据可能不具代表性。

3、训练集和测试集中数据的数量可能不合理。

4、我们定义的分类可能不合理,实际上一首歌可能既有摇滚风也有流行风,后来我在听我选的歌中,发现有一首被普遍归类在流行乐的歌曲其实很摇滚,而这个模型确实认为它是摇滚的可能性大一些。

5、对于本机器学习模型的学习归纳方法不了解。

后续的优化步骤

1、更深入了解该模型的学习归纳方法。

2、根据该方法制定更合理的分类,并放入更具代表性的音频数据。

其他的参考资料

www.pianshen.com/article/189…