基于keras构建lstm模型自动生成音乐系统
创始人
2024-02-08 22:23:48
0

目录
LSTM 机器学习生成音乐 1
数据集介绍 1
将 mid 转成 note 数组 4
将 note 数组转成 mid 文件 5
获取数据集并将其保存 6
将 note 进行编号 7
构建数据集 8
截取数据 8
进行 one-hot 编码 10
构建模型 11
训练 13
生成音乐 13
加载数据 16
加载模型 16
构建 id 与 note 的映射 16
预测下一个 note 16
源源不断产生 note 数据 17
生成音乐 20
总结 20
参考 20
将 mid 转成 note 数组
​ 下面定义get_notes,通过这个函数,我们可以将文件夹中所有mid文件变成一个名为all_note的数组。
关于具体怎么转化,实际上我们没有必要去关心,这个函数也是直接 copy 基于深度学习 lstm 算法生成音乐的,直接用即可。
from music21 import converter, instrument, note, chord, stream
def get_notes(song_path,song_names):
“”“获得midi音乐文件中的音符 :param song_path: [文件的保存地址] :type song_path: [str] :param song_names: [所有音乐文件的文件名] :type song_names: [list] :return: [所有符合要求的音符] :rtype: [list] “””
all_notes = []
for song_name in song_names:
stream = converter.parse(song_path+song_name)
instru = instrument.partitionByInstrument(stream)
if instru: # 如果有乐器部分,取第一个乐器部分
notes = instru.parts[0].recurse()
else: #如果没有乐器部分,直接取note
notes = stream.flat.notes
for element in notes:
# 如果是 Note 类型,取音调
# 如果是 Chord 类型,取音调的序号,存int类型比较容易处理
if isinstance(element, note.Note):
all_notes.append(str(element.pitch))
elif isinstance(element, chord.Chord):
all_notes.append(‘.’.join(str(n) for n in element.normalOrder))
return all_notes
将 note 数组转成 mid 文件
既然可以将mid文件转化成note数组,同理,也可以将note数组转成mid文件(也就是音乐)。定义一个create_music函数,同理这个函数也是copy基于深度学习lstm算法生成音乐的,同样也不需要关心其如何实现。
create_music函数在使用模型生成音乐的时候会用到(到后面看到的时候别懵逼了哦!!!!)。
def create_music(result_data,filename):
“”“生成mid音乐,然后进行保存 :param result_data: [音符列表] :type result_data: [list] :param filename: [文件名] :type filename: [str] “””
result_data = [str(data) for data in result_data]
offset = 0
output_notes = []
# 生成 Note(音符)或 Chord(和弦)对象
for data in result_data:
if (‘.’ in data) or data.isdigit():
notes_in_chord = data.split(‘.’)
notes = []
for current_note in notes_in_chord:
new_note = note.Note(int(current_note))
new_note.storedInstrument = instrument.Piano()
notes.append(new_note)
new_chord = chord.Chord(notes)
new_chord.offset = offset
output_notes.append(new_chord)

    else:new_note = note.Note(data)new_note.offset = offsetnew_note.storedInstrument = instrument.Piano()output_notes.append(new_note)offset += 1
# 创建音乐流(Stream)
midi_stream = stream.Stream(output_notes)
# 写入 MIDI 文件
midi_stream.write('midi', fp=filename+'.mid')

获取数据集并将其保存
通过前面的介绍,调用get_notes将使用music21库将文件夹中所有的mid文件变成一个note数组,但实际上这个过程是比较慢的,因此可以在第一次的时候将转换后的note数组保存起来,下面定义分别定义保存和读取的函数:
def save_data(filename,content):
“”“保存音符 :param filename: [保存的文件名] :type filename: [str] :param content: [内容] :type content: [list]] “””
with open(filename,“w”) as f:
for data in content:
f.write(str(data)+“\n”)
def get_data(filename):
“”“从文件中获取音符 :param filename: [文件名] :type filename: [str] :return: [返回音符] :rtype: [list] “””
with open(filename) as f:
all_notes = f.readlines()
return [ note[:len(note)-1] for note in all_notes]
​ 接下来就是调用以上几个函数:将mid文件转成note数组——>将note数组进行保存。
import ossong_path = "./midi_songs/"song_names = os.listdir(song_path)

获取note数组all_notes = get_notes(song_path,song_names)# 保存文件save_data(“data.txt”,all_notes)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关内容

热门资讯

最新母亲节祝福短信 最新母亲节祝福短信大全(精选60句)  妈妈:身在异乡的我不能给您亲手送上一束康乃馨,惟有以此语音信...
升学宴的学生答谢词 升学宴的学生答谢词范本  1,在坐的各位叔叔阿姨,同学朋友,大家晚上好,升学宴学生答谢词。  首先,...
个人委托书 个人委托书模板(通用10篇)  委托人不得以任何理由反悔被委托人的委托书上的合法权益。在不断进步的时...
最新讣告样本 最新讣告样本(精选8篇)  讣告一般是由死者的家属或治丧委员会发出的。下面是小编整理的最新讣告样本(...
实习证明英文 实习证明英文  在平日的学习、工作和生活里,大家都写过证明,肯定对各类证明都很熟悉吧,证明是核验一个...
破坏王自我介绍作文800字 破坏王自我介绍作文800字  超级破坏王,超级破坏王……你们知道超级破坏王是谁嘛?不知道。哈哈哈,当...
聘用的协议书 聘用的协议书范本(通用5篇)  在发展不断提速的社会中,很多地方都会使用到协议,签订协议能够最大程度...
文艺晚会开场白 文艺晚会开场白(精选25篇)  在社会发展不断提速的今天,越来越多的场景需要大家掌握一些开场白,开场...
年会主持人串词范文 年会主持人串词范文  一、年会策划场地  一、 年会活动场地的选择,室内还是室外。  二、年会现场控...
创建书香校园倡议书 创建书香校园倡议书三篇  培养书香少年,打造书香家庭,建设书香校园。让我们倡导学生们积极参与到书香行...
通知格式 通知格式范文(精选10篇)  在日新月异的现代社会中,我们都不可避免地要接触到通知,通知一般由标题、...
房屋证明是怎样的 房屋证明是怎样的  篇一:房产证明样本  房产证明  兹有我辖区居民 ,身份证号码: ,居住于 ,现...
端午节楼盘短信 端午节楼盘短信  1、你是我生命中最要的人,要珍惜你;你是我端午节的贵客,要热情招待;请你吃粽子,喝...
对公司发展的意见和建议 对公司发展的意见和建议精选  一段时间的工作在不知不觉间已经告一段落了,回顾坚强走过的这段时间,取得...
酒店行业的五项服务礼仪规范 酒店行业的五项服务礼仪规范  (1)着装规范。  上班时按规定着工作制服,男女员工都应做到端庄大方,...
河南洛阳简介欢迎词 河南洛阳简介欢迎词  各位游客朋友大家好,欢迎光临古都洛阳。现在向各位介绍一下洛阳市的概况。  洛阳...
写给老师的一封信 写给老师的一封信范文400字(精选16篇)  在学习、工作或生活中,大家都接触过书信吧,书信是人们是...
出行安全倡议书 出行安全倡议书  在现在的社会生活中,倡议书对我们的作用越来越大,倡议书一般由标题、称呼、正文、结尾...
住址证明 住址证明范本  住址证明范本应该怎么写?住址证明是指我国公民在日常居住环境中的一种证明文件。下面小编...
学生代表大会倡议书 学生代表大会倡议书  学生代表大会倡议书一:  全校青年朋友们:  在全党、全国人民深入贯彻学习党的...