![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=1738891375-oVEhxfHRr5rkFcQTlDmqnx2WDyGc3c4x-0-bfbd2bfd3cfc9bf7c8dc3179f9dd7582)
图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=1738891375-ijSqb4MuQVHekYGxRCCMJE2f3HLDhs1a-0-44ef0c6a485458dd0076b7f286a7db1c)
图1-2 伴奏制作、即兴旋律生成的流程
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P15_1.jpg?sign=1738891375-eRo7EeMVWDtaDUCndTvuBdotXADlFR52-0-0b5cebdf08c85ae28ca678d296815966)
图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=1738891375-YK2RevuYQmSx6yxE8hBVhpHBUlvLtnzw-0-3cc01a8580b5d02a510d404e426e078c)
2.和弦级数转为当前调式音阶
将用户输入的和弦级数(数字1~7)转换为绝对的和弦名称,再用musthe()方法将和弦名称转为当前调式下的音阶。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P17_1.jpg?sign=1738891375-NPrf38BwUSjgFKqCwatrSkMRRMY4GPgg-0-56df283e555fa471003d3f5244ae52b4)
3.根据预置节奏生成伴奏
本项目为4/4拍和3/4拍的歌曲各提供了6种预置节奏型,共12种节奏型的钢琴伴奏,其中预置节奏型由日常演奏经验而得,是常用的节奏型,能适应大多数曲目。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P17_2.jpg?sign=1738891375-x0a1PODEQnoHJZMEno1mOilzhZ7M3g22-0-c1bdae1489c385b86e041d95d02435c9)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P18_1.jpg?sign=1738891375-O7BHjTRh0hO0V88N3a4U0mEzjaSlaowV-0-2ef11dda1fdd42d96d2b80573d2badbe)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P19_1.jpg?sign=1738891375-oLu4AcidQo5wXctJ4kplvJVBEfQqNT9F-0-7010b8b5078423f6649cf2dd43fcee0c)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P20_1.jpg?sign=1738891375-bVLaxaM7zDE7e34LdICtNOtYwjqxObB7-0-4ea9ce63ce2ef82c0704026dd4400a7b)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P21_1.jpg?sign=1738891375-hDFiJesA4cAufD1stXNABFwMBMVdYhJ9-0-97626d9d320b79e2a74cc1789735ce04)
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=1738891375-2R6adTBJtYW5qaXvkY6Ya22qU83BDO7L-0-0e15f7f642fc71b2fd5c9845a04d765e)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P22_1.jpg?sign=1738891375-HAhKFUwHaCY7uVMxhhGcjufsYquDmY4T-0-4eeaf9967a2cd23b8efe891489b3f98f)
2.旋律生成
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P23_1.jpg?sign=1738891375-Pc19m6URcLuPHKpwbrB2ioeuYdwdrY6V-0-a993078418bfcc535a77a0f06e406b53)
3.节奏生成
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P23_2.jpg?sign=1738891375-UYYQ9irLQOQ0FEtvIoWcLNMUW6S6lHUa-0-ec2a9ef30ba6ff6d29d7cdcf2b979195)
1.3.3 贝斯伴奏制作
为丰富曲目内容,预置14组贝斯供用户选择。
1.添加贝斯轨
向歌曲内添加贝斯轨的相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P24_1.jpg?sign=1738891375-unz5T6RixFaUAu0XD8aBqcEINUR3EQqf-0-63cac154863cc769f1828cc925664cef)
2.预置贝斯轨
根据日常演奏经验,对4/4拍和3/4拍的歌曲分别给出7种常用贝斯轨,共14种,其中函数的输入chord_progression可以是和弦名称,也可以是和弦级数。例如:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P25_1.jpg?sign=1738891375-KIZ29HzF6IflOkk9SCy44vLDajmPFG3A-0-cb4002429db5510d0e610ece677f1a20)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P26_1.jpg?sign=1738891375-9jNi5GZeLqJwOD2GS3cNgnfNDLBbeFMb-0-792fa471c09a20cc7f8815f2a38990fa)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P27_1.jpg?sign=1738891375-i5dN9lBDICCoAeUs26ilwBljxlikqGPg-0-612167f8a810860243c312b0b0a482e0)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P28_1.jpg?sign=1738891375-DyCA1K4CrzLRmAu4phqvFkfxxmOSyJg0-0-ac7ab7e74da6b02c01c9ff7ed14bbca2)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P29_1.jpg?sign=1738891375-6wuz6T9WxDXVmq511AIBl0ZTasYA0dKj-0-83bd6653a470c1559685bbe6ba07a249)
1.3.4 汇总歌曲制作
完成钢琴伴奏制作、乐句生成模块后,使用类Impromptu调用并完成MIDI文件的写入与播放,并使用装饰器完成日志记录,函数piano_roll_test()实现音乐的可视化。
1.日志模块
制作歌曲时记录日志,在当前目录下生成日志文件。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P29_2.jpg?sign=1738891375-CoCqkT4yWlb5azjSpeIm7qGY3nHbUrHh-0-e128994842760e506e1300f7deb540b8)
2.音乐可视化
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P29_3.jpg?sign=1738891375-P2XMn1sz71ga9g2fBBrf2M6WMQahC15k-0-cc4ab0b2326e12120da943dd8ec071aa)
3.Impromptu类
后台所有功能汇总类,在此实现即兴曲目的信息输入,可以保存并播放文件,实现音乐可视化。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P30_1.jpg?sign=1738891375-1hdDxP1TlnBXXxrN0LAxinoB8oYGPoFJ-0-f68b0b9b3ea2cc98c565c82421935128)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P31_1.jpg?sign=1738891375-mzGjyAEkvmD59D8IaJEeohRWwaYOzW0V-0-24625fe7e40e9e84d746acdacf5c78be)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P32_1.jpg?sign=1738891375-iE098DfUEqV4QNAuMATPScaaJ9nTLClB-0-7733627a4d7f0d01f2e0aa0306eb8600)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P33_1.jpg?sign=1738891375-WKLUAabrEx1R8QAC3y5JqyytmKK1ROXW-0-1b45f24cdc35e30cad1c0179a5984845)
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=1738891375-A9k2dbkvGskAkqYtoL9QOXFZmq4TIXMn-0-5bd826a22169ba241f1e7c205382e4af)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P34_1.jpg?sign=1738891375-Fz3x23QoksAupVnRCLBI2YnLvYdDdxgY-0-fac5888d1627973dd0045736bf525359)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P35_1.jpg?sign=1738891375-RSlW0TjKZQJhXAVN4kJI2KYIE67ygnr2-0-0cb09c48f507d026e53fcf875e90d9e1)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P36_1.jpg?sign=1738891375-XuQWUSibezLQYo7oqEzDnJZqPOvgKkaA-0-e18b7368f5ceb25be6d21b96a1e74b00)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P37_1.jpg?sign=1738891375-erpOkMCU1PUrCxnQYO0eLU6JifDsppl7-0-2c53314348a277b2fe51f8273a81a17e)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P38_2.jpg?sign=1738891375-xWHvGEJZ0ZrjeY4PBBuSQIxg6IgJpNgz-0-aae4ba1f038bbf360f33fe330299734e)
2.将控件绑定功能(信号与槽的绑定)
通过MainCode实现的继承关系如图1-4所示,其中Impromptu类为可运行的脚本,Ui_MainWindow为PyQt 5。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P38_1.jpg?sign=1738891375-BZ8XAW1ZcxfxtocNXgDiJ4KyvrLKEpl1-0-6106c73077aa83e796cc421df54bb0bc)
图1-4 继承关系
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P39_1.jpg?sign=1738891375-Z5Tuqvf2IlNrcPhOBmwX4MEONM4N4yWR-0-835cec046d10075fc2a7d7780a0e522f)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P40_1.jpg?sign=1738891375-Ubrm7g3tDDlG840a77dkynHEcpjprEV1-0-98e6882dd99b61c6e692bcab5c5f6e0c)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P41_1.jpg?sign=1738891375-2waVPdiQYZSL05n8ZXkN9RU1FZ7zHpyo-0-15ad708b45bb36b16a374c8fee3752d5)
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=1738891375-3LdxrKHdf4pJ3MZm3XGdhDu39WUUjjDf-0-a20d67561f9c38455613a976f7771b7c)
图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=1738891375-mbH2zL8kJVUDuNi6cs9F6EJmgDdmzUcv-0-4cf0507d64d30ba7de12a6856296a8bc)
图1-6 钢琴伴奏可视化
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P43_1.jpg?sign=1738891375-39Sw2GGsA9ltNukWMhfEps6R7wWBJJ5G-0-fa5d1c3d3e1412e3d3f204904050cc30)
图1-7 即兴旋律可视化
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P43_2.jpg?sign=1738891375-GHWqQaH5a3HKGWCzZEmNxveAHFdbrVEN-0-d8e0dad1e28807fc20f9a4fdd1c85182)
图1-8 贝斯伴奏可视化