![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=1739284340-T2SaPObxBUJUruegt90kSY4fZsjnn6qD-0-8b553b08747e4ee22fded61b561c6d0c)
图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=1739284340-IyzGy47JuALAKstnY0oIJmqdGPgEgMpk-0-7d45c83b857da58a4598e0f76b67511a)
图1-2 伴奏制作、即兴旋律生成的流程
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P15_1.jpg?sign=1739284340-7eynlGDseQSoB0pAfS4d650EOc65kTpi-0-0db6a4be2b721366da8139fef5bcfc07)
图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=1739284340-hm6CFcJWaXVf9z2qIAm0UW7TPAqxdqrB-0-cda3b10abcc892b2a84037c47c4f28a5)
2.和弦级数转为当前调式音阶
将用户输入的和弦级数(数字1~7)转换为绝对的和弦名称,再用musthe()方法将和弦名称转为当前调式下的音阶。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P17_1.jpg?sign=1739284340-fmOucW5ZKJiReTou1qLi46RYXnl5KnN0-0-ab35254bc5f8796f17a778d4e8dd4194)
3.根据预置节奏生成伴奏
本项目为4/4拍和3/4拍的歌曲各提供了6种预置节奏型,共12种节奏型的钢琴伴奏,其中预置节奏型由日常演奏经验而得,是常用的节奏型,能适应大多数曲目。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P17_2.jpg?sign=1739284340-LWKRinxsr13GPHDJPEQeqmnCDfAA3swV-0-a60335e5c5bdb912c38350ef36c09cc1)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P18_1.jpg?sign=1739284340-TfNBywAD6acFUDGuRryCIgLNed1NZUZJ-0-59344bdea82206b614bb49a616131f49)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P19_1.jpg?sign=1739284340-4oamg10jIz3Kx0nZXPu143yK25HKL7AS-0-c8749a235d245fc4e63ba777cd946308)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P20_1.jpg?sign=1739284340-IjcpjksJSitHqZfiq8WKfBKrDOlgpxhF-0-e4863667d48c05a73dfeda07d08043fb)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P21_1.jpg?sign=1739284340-vFHN5Z2cvuTbm9CDpJgPHiiGs46NOdhi-0-814c62bd6b58cd275d2c10f2e5d82784)
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=1739284340-ifhhcANucnZi0FZt6wJKwAaCRogCee8n-0-317c894a6de3b7da69e597a496008ce4)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P22_1.jpg?sign=1739284340-nzYEaoKWcoSrxc78tNeLELaAEpocDq81-0-3113a1e301cc37b7810aeada9a0940b9)
2.旋律生成
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P23_1.jpg?sign=1739284340-s6bfvggnFmZU8rcqdY2iiFGyJSzZXSVu-0-4612c1190bc2088aa5d0939b4cdaf208)
3.节奏生成
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P23_2.jpg?sign=1739284340-kMDUeetwQG8Uvi8zZNOZKy41xJpECqkX-0-652eed6be14402e9bdbae1b14926f79b)
1.3.3 贝斯伴奏制作
为丰富曲目内容,预置14组贝斯供用户选择。
1.添加贝斯轨
向歌曲内添加贝斯轨的相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P24_1.jpg?sign=1739284340-9VTDAZSSzrHdJ1RyEOLzqncJMrQ4huO8-0-14b7f6009dd2e11043cf3f1c5ebd13d8)
2.预置贝斯轨
根据日常演奏经验,对4/4拍和3/4拍的歌曲分别给出7种常用贝斯轨,共14种,其中函数的输入chord_progression可以是和弦名称,也可以是和弦级数。例如:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P25_1.jpg?sign=1739284340-bAGLBETN50YVCShvrXaQrRwzGMP9uewl-0-bbb2ca27d6d937b2bfd68031f4f5bc9b)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P26_1.jpg?sign=1739284340-KC9jeSg6GmvndSjITm3v4QliHdEKzhkm-0-59bf25d281a9bbd8dfd7c578387e41b4)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P27_1.jpg?sign=1739284340-EGdWq00JaIoGka3b8ow3xXZvfZIvdUar-0-c1593e02262377ad8a94b6e8871febb3)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P28_1.jpg?sign=1739284340-vLcImPPXi4RBchRepd452ryuH4HVhExW-0-b39f489808b79970a3bd0eb27c70f1b4)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P29_1.jpg?sign=1739284340-av4KFVGXheznZqoaec2MxnSgtPDtVlsE-0-52cc1748f0f23c431f86edeea860d7bd)
1.3.4 汇总歌曲制作
完成钢琴伴奏制作、乐句生成模块后,使用类Impromptu调用并完成MIDI文件的写入与播放,并使用装饰器完成日志记录,函数piano_roll_test()实现音乐的可视化。
1.日志模块
制作歌曲时记录日志,在当前目录下生成日志文件。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P29_2.jpg?sign=1739284340-9wp7Asc8KR6SPgS6gCM8tIOzZX6okT2c-0-061c8847f9fbe736d3609180aaeb4c98)
2.音乐可视化
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P29_3.jpg?sign=1739284340-ThvyPWcd3vPSBR7ppDRqXJeHhxbx3Jf4-0-1a8071c160211d7f23bfebae7073c8a0)
3.Impromptu类
后台所有功能汇总类,在此实现即兴曲目的信息输入,可以保存并播放文件,实现音乐可视化。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P30_1.jpg?sign=1739284340-jLNJuHkmvX2LC40aJE7ULCcmh0B9EUU7-0-6734da1c793fc64e1885579c514b5d86)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P31_1.jpg?sign=1739284340-Z40mcbflqkxSgHZ6xSwNuEbiVgtLSdpL-0-659fbdd22f486c926352ae2e0b73da2e)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P32_1.jpg?sign=1739284340-oWPeb30bLaO9cezG2L0xBKQ0T94KZ7fs-0-0ea4ac5ba12301b9c1876a81f82cad02)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P33_1.jpg?sign=1739284340-lYwgYlnod7BP1g1Xnkn5G8hPt476kudT-0-b00c78703845889f6172f0516357f0c8)
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=1739284340-PZGE0QsJdLRGfZJjEIUBIpLfjfmr0HjF-0-bfa311d188b0e65c2e8eb9a3d5016a11)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P34_1.jpg?sign=1739284340-sF9cVfQ4uFqOQvArwvnQlIAwKtyOVefA-0-ad2079d93c7f8e9a74d65471e0a20988)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P35_1.jpg?sign=1739284340-PIJzhEptpMQQim905B9bmlWHUEf8FnBc-0-78a99ac79d1e9ab66fba816e02be37ba)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P36_1.jpg?sign=1739284340-lsLt2At9iUoojo1pSv6wY2F8KRpv1FOJ-0-af25ace1e29c2cc668ddd30cc6a46b63)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P37_1.jpg?sign=1739284340-gwolSD4J4yhKOaeEynroJLB3h71F8TcQ-0-295700e32d33ab4a8a9bbe2f373c5b81)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P38_2.jpg?sign=1739284340-WtWzM7GCdrpwJAfTUCnnoDLtuNZN0wPg-0-0e2688ffbc262ee138465d63a3f32747)
2.将控件绑定功能(信号与槽的绑定)
通过MainCode实现的继承关系如图1-4所示,其中Impromptu类为可运行的脚本,Ui_MainWindow为PyQt 5。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P38_1.jpg?sign=1739284340-uJTFJc6lR6kEQ7mTBXrqE87aIowU7tvU-0-b753d99c55bd316fccac1dd2818eb3f9)
图1-4 继承关系
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P39_1.jpg?sign=1739284340-iXhIBjkMeQ4O36RjjM88m2sFjm5064o7-0-30d7942a36ab2deb03c66a84255233c5)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P40_1.jpg?sign=1739284340-sjRlwabggahqAw2aAUitc3VSjIeR9G2R-0-1cbc9d93e4c630c1ef22be8712a04ccc)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P41_1.jpg?sign=1739284340-dbGAynhs3aC2AYxEgVODF6kWzdhlDOPU-0-6f78961548a382dd0910c5f2eaeb8d8b)
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=1739284340-zLBAfRuZHP0NxiGca24nWpm1WWocazQc-0-b94ad21644a68c5b5c5d371732b65a6c)
图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=1739284340-EzX70AZXOHU4rr1q6zh1LgOfMmCuwqR6-0-ce0d0fa7ca9767207b46d6bbae8a73ec)
图1-6 钢琴伴奏可视化
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P43_1.jpg?sign=1739284340-CqRJQTCxb5wqSP8EiSyAtasU8ysyozka-0-85b7ff1f621d09fdf3df3956a3faf62c)
图1-7 即兴旋律可视化
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P43_2.jpg?sign=1739284340-Nq2hpacZIEG1fUHTgreV3uYvrdnLlaeD-0-959435ca615909f5b56d33822cdfc500)
图1-8 贝斯伴奏可视化