![AI源码解读:推荐系统案例(Python版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/894/44509894/b_44509894.jpg)
项目1 PROJECT 1 基于马尔可夫模型的自动即兴音乐推荐
本项目通过用户选择主音调式即兴参数,输入歌曲信息BPM(Beat Per Minute,节拍)、弦级数及重复次数后生成音乐,实现上下文相关的即兴演奏。
1.1 总体设计
本部分包括系统整体结构和系统流程。
1.1.1 系统整体结构
系统整体结构如图1-1所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P13_1.jpg?sign=1739532849-AlIhgJCGrkz3vEXCSeTiaH3GEFFXubQv-0-87291f459068b5bb8d25e63e51ee3955)
图1-1 系统整体结构
1.1.2 系统流程
伴奏制作、即兴旋律生成的流程如图1-2所示,贝斯模块及GUI (Graphical User Interface,图形用户接口)制作流程如图1-3所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P14_1.jpg?sign=1739532849-Gcz4ejh5LldBMYMVzOh8qQVMjO6ygSNB-0-0fd82280d5725fd1df436c0e3976193d)
图1-2 伴奏制作、即兴旋律生成的流程
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P15_1.jpg?sign=1739532849-lBoJ9L6wLTjat2tTDB9hX9r0eamSqUjP-0-6974f587e3a543d8b3cab9ac3f6442d3)
图1-3 贝斯模块及GUI制作流程
1.2 运行环境
本部分包括Python环境和PC环境配置。
1.2.1 Python环境
需要Python 3.7及以上配置,安装库包括hmmlearn、numpy、pypianoroll、pygame、mido、musthe、PyQt 5、PyQt-tools(仅支持Windows),在Windows cmd中使用以下命令:
pip install hmmlearn、numpy、pypianoroll、pygame、mido、musthe
安装PyQt 5和PyQt-tools:
pip install sip pip install PyQt5 pip install PyQt-tools
将当前目录下的4.ui转换输出成4.py文件:
python - m PyQt5.uic.pyuic 4.ui - o 4.py
1.2.2 PC环境配置
本程序最终将打包成.exe,在Windows环境下运行。安装能读取并播放MIDI文件程序的用户可自行查看生成文件;反之,在选项卡中选择“自动播放”选项播放生成的MIDI文件。
1.3 模块实现
本项目包括5个模块:钢琴伴奏制作、乐句生成、贝斯伴奏制作、汇总歌曲制作和GUI设计,下面分别给出各模块的功能介绍及相关代码。
1.3.1 钢琴伴奏制作
用户选择调式、输入和弦级数后,首先,将和弦级数转换为和弦名称;其次,用musthe将和弦名称转换为对应音;最后,根据用户选择的预置节奏型向MIDI中的钢琴轨写入钢琴伴奏。
1.和弦的实现
本部分代码完成添加和弦功能。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P16_1.jpg?sign=1739532849-nR3m7qSGGXOcwiW7V26jA5XWwExXbciS-0-ae8e23fdf018997b68d2ffb6918f1388)
2.和弦级数转为当前调式音阶
将用户输入的和弦级数(数字1~7)转换为绝对的和弦名称,再用musthe()方法将和弦名称转为当前调式下的音阶。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P17_1.jpg?sign=1739532849-iKnapn7ZnAeZl6pg5X9JjMSdRVawl4Qe-0-31c9d2d03e02959cf9cae87e6158d016)
3.根据预置节奏生成伴奏
本项目为4/4拍和3/4拍的歌曲各提供了6种预置节奏型,共12种节奏型的钢琴伴奏,其中预置节奏型由日常演奏经验而得,是常用的节奏型,能适应大多数曲目。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P17_2.jpg?sign=1739532849-rqBDtbjHCUpbmnyTS70hOIMT6pH8qSB0-0-c671eb23d5c10a89c8654991f01018c8)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P18_1.jpg?sign=1739532849-SlCreSUBy0FkRs1rFbYwPgpWPRytWs8O-0-a181899f7a4444bd6fff9ef47badde68)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P19_1.jpg?sign=1739532849-d5QlEpkMoImzgbXV0aktpnCPsnYpX0Jf-0-78b195c2002341815c48eb92595b60f9)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P20_1.jpg?sign=1739532849-8Mql23LKaKGtvGhC0nckRBJc7VPkVdDJ-0-74b9ce9a7d48d4a68cb4f0016eaea1dd)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P21_1.jpg?sign=1739532849-Q7nAQKfbppxpfZDKvZIcI8r1jhJgiqWx-0-3d08b20a8a6039e61f87788390ec3343)
1.3.2 乐句生成
使用hmmlearn,利用马尔可夫模型生成旋律和节奏。其中旋律表示为数字1~7,加上0和-1,1~7对应音阶中第1~7音(五声音阶对应五个音),0对应休止符,-1对应延音音符;节奏表示为数字1、2、4、8、16、32、6、12、24,分别表示全音符、二分音符、四分音符、八分音符等。
1.添加音符
音轨内添加一个普通音符/休止符/延音音符的相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P21_2.jpg?sign=1739532849-uLDc5k4yrivkJc6GOzitmaCtMbvubDkN-0-980b52d89551271b0de2bbd5410dc7cc)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P22_1.jpg?sign=1739532849-REmXsf80ShW3DDaKFEy5WMq2HBh2kFJC-0-b066ac50d152fdd40471864cb257eeeb)
2.旋律生成
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P23_1.jpg?sign=1739532849-cyA6Kf1MZkkNEzcAXpUCJM4ve1WyfwCz-0-f910057e01d22443b765b0ef7d243e6f)
3.节奏生成
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P23_2.jpg?sign=1739532849-OvZHGL8nX2LhK4OG8P14G3JKqbcJOBrr-0-d01d924769ac73492541c944bf1ce9e4)
1.3.3 贝斯伴奏制作
为丰富曲目内容,预置14组贝斯供用户选择。
1.添加贝斯轨
向歌曲内添加贝斯轨的相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P24_1.jpg?sign=1739532849-yokwzjZbe3z4JR4uWgOWz685FrHQyp6i-0-0a1ecf6848be6a6b1cbf1cf936304071)
2.预置贝斯轨
根据日常演奏经验,对4/4拍和3/4拍的歌曲分别给出7种常用贝斯轨,共14种,其中函数的输入chord_progression可以是和弦名称,也可以是和弦级数。例如:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P25_1.jpg?sign=1739532849-T6YJi3XA1w1RKozJ7bgkF0BTUlSvgC85-0-45f1463d61bfa11fabf04e52ee2fe587)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P26_1.jpg?sign=1739532849-jbSv5a2EYcRPggJ7F3X8QJUDRsY3UocS-0-2fc6e9fb6debe2ecf8e4234dd4db5f25)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P27_1.jpg?sign=1739532849-hnrsmp9yGxjFvA5RVGoEVxtvIe2pN8Hm-0-40ef867ac15dd4623a070b578d2c228b)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P28_1.jpg?sign=1739532849-AZQNfNNSw9QbZjI22Nglb5teKhMmHjwp-0-f7ba779deb6c35a507216b194c5a4304)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P29_1.jpg?sign=1739532849-0fQFTsYGYLZ7JqGTwKfg8loJO6yJW1ns-0-2e28f6347f3c410ad237edb3c985bc63)
1.3.4 汇总歌曲制作
完成钢琴伴奏制作、乐句生成模块后,使用类Impromptu调用并完成MIDI文件的写入与播放,并使用装饰器完成日志记录,函数piano_roll_test()实现音乐的可视化。
1.日志模块
制作歌曲时记录日志,在当前目录下生成日志文件。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P29_2.jpg?sign=1739532849-BxoSDR5tLxD9lfq9bn42wodIUngF5gVm-0-a688101bd96c03394f66a791f8d07cbc)
2.音乐可视化
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P29_3.jpg?sign=1739532849-L36y99I5yWWyVQ7c04n0M7ZaenQ5knQF-0-830d15970570939af96e6e88577d93f6)
3.Impromptu类
后台所有功能汇总类,在此实现即兴曲目的信息输入,可以保存并播放文件,实现音乐可视化。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P30_1.jpg?sign=1739532849-5k8caugykLZ3B2Zqxp0HEqRzYzSQuc7D-0-ddff5b60e70e663ad0150583a593eaee)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P31_1.jpg?sign=1739532849-aPSyj99qzCP3DUrHCju2a8liXMpvj6xa-0-7bfee3c75067d4a8f0d1b77c93ba973f)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P32_1.jpg?sign=1739532849-OmVI2ko993ic1FXTZxrtgwWCcmMUwgFd-0-43984e186c06eb7fccf6ce96ae28c2d4)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P33_1.jpg?sign=1739532849-Vk5Y0L6HUazpuFinyvO7852LbxLbYdH8-0-a5f624eb8011c85e956f4427ab1aa58c)
1.3.5 GUI设计
为方便用户交互,使用PyQt 5 Designer拖动控件,设计图形界面,使用PyQt-tools将制作好的.ui文件转为.py代码,完成用户界面初始化,再将控件绑定对应功能。
1.用户界面空间初始化
此代码由制作好的.ui文件经PyQt-tools转换而成,在Windows下运行。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P33_2.jpg?sign=1739532849-R6pk1giPAKfrW0K3GxG4DH12Ly7D6ULy-0-e453cbabef1f8ba884ba359f80af286f)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P34_1.jpg?sign=1739532849-bgy9wcLnvvmJffNo2LsBuISqVFeQtk5L-0-aa928995a5a01994424ad73dbd71ab0c)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P35_1.jpg?sign=1739532849-kt7joQxWWNoQMcvUqiCFtILznCQY6y6D-0-f8c27eb7a03accde92a6e7f536dfb623)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P36_1.jpg?sign=1739532849-gtkJUDjCnAhWwfU93PC8LbalGdRM3mgu-0-542caade10daba800e1a7f08adc427f6)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P37_1.jpg?sign=1739532849-hw6HOSqThdbFQm7va4dw2eKeoNcCd2P6-0-0618b7695e3c7822efc01ef859a2b207)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P38_2.jpg?sign=1739532849-sTiPGoA6TuxXGyxW98MEH9AKvx5CnSa1-0-03c3f1c37c7d6172df27302831566325)
2.将控件绑定功能(信号与槽的绑定)
通过MainCode实现的继承关系如图1-4所示,其中Impromptu类为可运行的脚本,Ui_MainWindow为PyQt 5。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P38_1.jpg?sign=1739532849-buZbVpAqSfSRZT57Kwt7r8b4VUqCFQ2n-0-421ab8c8d00b9d9732530352eceea721)
图1-4 继承关系
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P39_1.jpg?sign=1739532849-nEWJIgW424PNepiq3qWQgzoxbJ2tV2Us-0-f800f0f91ea846a3c70bc2916d7303a5)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P40_1.jpg?sign=1739532849-GmW5HvyKxqFKXdJZKYfKDLydMBLnRSvh-0-3d47826a3bab0df82e9d6f5ed3b19b43)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P41_1.jpg?sign=1739532849-x1LJXlt29exxW1DVKb0V5NWCoMDn6350-0-77211e60a4cd5d69b37b5837b8c32ab7)
1.4 系统测试
GUI界面选择的和弦级数都是调内和弦。在Impromptu中使用self.chord_progression = ['Cmaj7 ', 'Am7 ', 'F', 'E7 '],可以使用调外和弦,给歌曲引入更丰富的和声。
运行主程序后显示GUI界面如图1-5所示。用户可选择的歌曲信息有主音、调式、bpm、拍号、钢琴伴奏类型、贝斯伴奏类型、和弦进行、重复次数和即兴的强度,另外还有右下角音色的切换(普通/安静)。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P42_1.jpg?sign=1739532849-xBKhk3GJbSQCDmPAwxVjbVfrAJQkxINu-0-dbb004748c1e2b60dba13f1b2dbae5bc)
图1-5 模型训练效果
由于即兴的特点,每次运行产生的音频都不同,此处展示C大调下和弦进行为4321,重复次数为1,贝斯和钢琴伴奏类型均为类型1的歌曲可视化结果,如图1-6所示。钢琴伴奏位于中音区(C3~C4)。即兴旋律可视化结果如图1-7所示,即兴旋律位于高音区(C4~C5)。贝斯伴奏可视化结果如图1-8所示,即兴旋律位于低音区(C1~C2)。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P42_2.jpg?sign=1739532849-sQtaI1XlosgQebpdyRaakEiHOEitOBHD-0-89f5d70f649ba66ff932c2af2a0f4b37)
图1-6 钢琴伴奏可视化
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P43_1.jpg?sign=1739532849-VkoXGOE7oeIbZyQYRHFIhsvMEJntVL7W-0-b745dc3ca8d748d38dc18673d8440eb2)
图1-7 即兴旋律可视化
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P43_2.jpg?sign=1739532849-Cmpun4UkeM0eA1IPaPcZA4cMbKuFz5zG-0-1d7a958a2bbeab303a828816ed629046)
图1-8 贝斯伴奏可视化