![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=1739178886-qckZei58h1pWa4ORvZH00R0VG4FNeoCK-0-04348e35a726c1e8459eeb363952e5a2)
图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=1739178886-1emhsF3XJoOYt3YK0IMY7qW9WKY3PGwP-0-9f4934845bbe106e1ce5a3596c14a787)
图1-2 伴奏制作、即兴旋律生成的流程
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P15_1.jpg?sign=1739178886-ruRnSp6jG03kojrysxIuHdet5Z0lmgkv-0-5c8b50a7300116de00471fb18da27496)
图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=1739178886-KahbFbjrA4uVFiTQEUOq2hoVdTGwL6Ig-0-06f98ca9ab704c3120e4fbe40fe90dcd)
2.和弦级数转为当前调式音阶
将用户输入的和弦级数(数字1~7)转换为绝对的和弦名称,再用musthe()方法将和弦名称转为当前调式下的音阶。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P17_1.jpg?sign=1739178886-LFg2XuwEMU4v8M5U7nP6fPfstNKYTUeQ-0-58b753d16706ae95d0848e10e7adf00e)
3.根据预置节奏生成伴奏
本项目为4/4拍和3/4拍的歌曲各提供了6种预置节奏型,共12种节奏型的钢琴伴奏,其中预置节奏型由日常演奏经验而得,是常用的节奏型,能适应大多数曲目。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P17_2.jpg?sign=1739178886-8YfaeWzdWF0PRb816fzyEPAJKfvugFz5-0-5293ef4cf8a40a478c5cae1bfa8de67d)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P18_1.jpg?sign=1739178886-4Zz6uMI1sCz64OhY7jIjbDn3hMmKXlXf-0-8e1f23429fadbee5ed2f74f56c7fae0f)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P19_1.jpg?sign=1739178886-ypwFB5Wb2qmpshTMMF4qBug1jMAWaEMg-0-8a1e3dea53370c5b341ce919984f4e34)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P20_1.jpg?sign=1739178886-d0sEX6J1soOBmElsBJaZblBrCNXBsfdG-0-372c965dd906c9f146e29061652b62b2)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P21_1.jpg?sign=1739178886-T5aDKbmzui12gES6G2HpjSTnzCm6NpSN-0-1d4943e3125f2b5c9388ab9e302ed60d)
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=1739178886-TVIOHxmTsNE9QHV8dpiRM7A3HyNfTn1z-0-736484c5889b569296ad8e817225ebec)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P22_1.jpg?sign=1739178886-kMW8EzOCzJJeDyJvp6k9K6y8iJlgBRAo-0-eccf29ab5dcdd4623ba15091bc726950)
2.旋律生成
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P23_1.jpg?sign=1739178886-CjozlEmC6P8xiJtNDQdQtJMr1kMY5jiS-0-8b6582aca2cb74a8d4148ccc88776fa4)
3.节奏生成
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P23_2.jpg?sign=1739178886-Gr4Ux0CaRJsa1RfVQEaf6NatHUbx15Fz-0-8ff71db172bdbb671d7a233495c42038)
1.3.3 贝斯伴奏制作
为丰富曲目内容,预置14组贝斯供用户选择。
1.添加贝斯轨
向歌曲内添加贝斯轨的相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P24_1.jpg?sign=1739178886-8YrjeM7kG7oTo4RuqIcu6fImbsicf6m2-0-b153017cd8f1dc139d41694e1bfdc06b)
2.预置贝斯轨
根据日常演奏经验,对4/4拍和3/4拍的歌曲分别给出7种常用贝斯轨,共14种,其中函数的输入chord_progression可以是和弦名称,也可以是和弦级数。例如:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P25_1.jpg?sign=1739178886-eoHSDwhs4WQ4MmHqmyQNarVW46RtQh4V-0-2f5c3b75883501fa8f1d413b0f1a4379)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P26_1.jpg?sign=1739178886-gG59jd2W3kEHuTTgbqcVX9KGPZeIBEP1-0-4fd880bf6639f11e93dcd9ac252bab57)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P27_1.jpg?sign=1739178886-lVTxqDGFAgShExyK6azPJRtC8R1jOch6-0-8bcfb3e7ebf8fadd82e2ddf8636e0f37)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P28_1.jpg?sign=1739178886-CtCXaJMh1sz9ALjU9HY75elf1uyTm8Sa-0-0bea97accce013d3f5883066ca1ac02d)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P29_1.jpg?sign=1739178886-LmzvGKaeXodeixETjja0pyKgKVbuh65f-0-6eb7203a24e56c970362283e83ebac70)
1.3.4 汇总歌曲制作
完成钢琴伴奏制作、乐句生成模块后,使用类Impromptu调用并完成MIDI文件的写入与播放,并使用装饰器完成日志记录,函数piano_roll_test()实现音乐的可视化。
1.日志模块
制作歌曲时记录日志,在当前目录下生成日志文件。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P29_2.jpg?sign=1739178886-BA0muqlWvrKpQNUJuxDZ7HXf2glo8k7Z-0-a375caa62450cd9ac5aab4d08b1bed9e)
2.音乐可视化
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P29_3.jpg?sign=1739178886-b3kgiCB9z46vUFiyFxT4e21LmmTv7aAu-0-3c1d92f6a8b507e8e4ca50706b7d11da)
3.Impromptu类
后台所有功能汇总类,在此实现即兴曲目的信息输入,可以保存并播放文件,实现音乐可视化。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P30_1.jpg?sign=1739178886-HGKdo2z9wkztyOqifPdISmHwhqWSWyWb-0-1142a5e9520434128d3e662a8a43d506)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P31_1.jpg?sign=1739178886-9C3H4g1mNtT2eATPyJOmSUVEPowF6wGC-0-9156af798804afc6a58d04c1bfc827c7)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P32_1.jpg?sign=1739178886-mWggwv2LEzHqgbmKD4cvjSbnTTxFQZUN-0-e1a88fafc7c0f4c04094bcb6ab4b5d56)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P33_1.jpg?sign=1739178886-sPpgTDLYCyJmpihlBMGBkd5H8H1noVHr-0-787f741671c69b377871519c5c025254)
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=1739178886-jCjjP0gUOJ5gGK0eJ2D7LqXpOlgfDMkt-0-cb2e21c46e82863aa2a0af505d61df9e)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P34_1.jpg?sign=1739178886-dcrO3uTq9OcZ6SvYF22zwCzGxOjsxXPZ-0-da7d69f096001af9361622ad94e7f689)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P35_1.jpg?sign=1739178886-hCDg8yWsksKaZUbl6OpRXK1JaPJLUjDV-0-e4f51ca84471aff83e32cad3f3689ad5)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P36_1.jpg?sign=1739178886-5xmlZsfzvPWwLAQjeM2FTCFs8mNgvt6k-0-3ae89d414c4528e1c11ba2d6a1e3489a)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P37_1.jpg?sign=1739178886-LOrsWYdidw4LCkmpbWS3LLJiXrYx7kwF-0-04c7e59500404fbcadc9845f4ba8f3e8)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P38_2.jpg?sign=1739178886-bAQPFXykoWIxTSbsCYGw6vMwgU7smMdV-0-238076f8014887d9578db24c74a4d70a)
2.将控件绑定功能(信号与槽的绑定)
通过MainCode实现的继承关系如图1-4所示,其中Impromptu类为可运行的脚本,Ui_MainWindow为PyQt 5。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P38_1.jpg?sign=1739178886-qhe0ohGbTgPPBoFkLYP1y5iPeJEk60vb-0-bf19d21dc88325d507f76620edc0171a)
图1-4 继承关系
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P39_1.jpg?sign=1739178886-FfXBCUgD318LPTPHs533PTNSoJm9Uue0-0-21979c682843971efdc90fe26b5f25bf)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P40_1.jpg?sign=1739178886-Yl0PhqJI0Tdgx04e9zEQpcpUbBJGqV9W-0-92b8f5c58fda06a024a9adaae81b3662)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P41_1.jpg?sign=1739178886-IbWJCaj1q51LjAgU0AloBgNM4SuNsKqC-0-4f4d51dbdaad0e1bc52ef24cba3d74d9)
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=1739178886-HtUTxDePxrHURSDVr83uG4cqACA9F1AH-0-3875bbe7e2d85d97a6b682483e652f35)
图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=1739178886-UiNWsJ4cam80iRINaYoiP7Q0UvYSJyTj-0-b8daa3397fbfe054fd019334deb2ebfe)
图1-6 钢琴伴奏可视化
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P43_1.jpg?sign=1739178886-Yk07fvHt1R0WOjFg52WwLogEXsrhdTNM-0-249472e254e8e96d5fad6362e58297a1)
图1-7 即兴旋律可视化
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P43_2.jpg?sign=1739178886-u6l2QG7fZnkK5zjuYOczPDHC2GPQknAx-0-5685e5e29c660cd7d6de135e92420bc5)
图1-8 贝斯伴奏可视化