旋律生成学习日记(一)

123因为自己做音频方向,偶然看见了旋律生成这个东西,就想自己学着做一做,网上现有文章不多,我自己瞎琢磨琢磨。

第一章转自:(64条消息) 基于深度学习LSTM算法生成音乐_lstm生成音乐_lbship的博客-CSDN博客

MID数据集下载地址:GitHub - bytedance/GiantMIDI-Piano

一、背景知识

1.概念 (来自百度百科):

notes(音符):用来记录不同长短的音的进行符号。全音符、二分音符、四分音符、八分音符、十六分音符是最常见的音符。是五线谱中最重要的元素

chord(和弦):和弦是乐理上的一个概念,指的是一定音程关系的一组声音。将三个和三个以上的音,按三度叠置的关系,在纵向上加以结合,就成为和弦

如果无法使用TensorFlow或者配置不够强大,可以使用Colaboratory网址,在线运行,里面已经集成了TensorFlow,pandas等包,很方便使用
 

二、读取MIDI文件

import tensorflow as tf
import os
from music21 import converter, instrument, note, chord, stream
import numpy as np"""
notes(音符):用来记录不同长短的音的进行符号。全音符、二分音符、四分音符、八分音符、十六分音符是最常见的音符。是五线谱中最重要的元素chord(和弦):和弦是乐理上的一个概念,指的是一定音程关系的一组声音。将三个和三个以上的音,按三度叠置的关系,在纵向上加以结合,就成为和弦
"""# 读取训练数据的Notes
def get_notes():filepath = 'F:/GiantMIDI-Piano-master/midis_for_evaluation/giantmidi-piano/'#filepath =  'F:/GiantMIDI-Piano-master/midis_for_evaluation/data'files = os.listdir(filepath)Notes = []for file in files:try:stream = converter.parse(filepath + file)instru = instrument.partitionByInstrument(stream)if instru:  # 如果有乐器部分,取第一个乐器部分notes = instru.parts[0].recurse()else:  # 如果没有乐器部分,直接取notenotes = stream.flat.notesfor element in notes:# 如果是 Note 类型,取音调# 如果是 Chord 类型,取音调的序号,存int类型比较容易处理if isinstance(element, note.Note):Notes.append(str(element.pitch))elif isinstance(element, chord.Chord):Notes.append('.'.join(str(n) for n in element.normalOrder))except:pass# with open('Note', 'a+')as f:#     f.write(str(Notes))return Notes

原文有读取一个文件查看,但是我没有读取,我最后生成的note文件是一片空白,但是最后生成的音乐确实是有声的。后面我再研究研究。

三、构建神经网络

本次神经网络使用LSTM网络(Longshort term memory),它基于普通RNN在隐藏层各神经单元中增加记忆单元,从而使时间序列上的记忆信息可控,每次在隐藏层各单元间传递时通过几个可控门(遗忘门、输入门、候选门、输出门),可以控制之前信息和当前信息的记忆和遗忘程度,从而使RNN网络具备了长期记忆功能。

架构图:

def get_model(inputs, notes_len, weights_file=None):model = tf.keras.models.Sequential()model.add(tf.keras.layers.LSTM(512,input_shape=(inputs.shape[1], inputs.shape[2]),return_sequences=True))#512层神经元,return_sequences=True表示返回所有的输出序列model.add(tf.keras.layers.Dropout(0.3))  # 丢弃 30% 神经元,防止过拟合model.add(tf.keras.layers.LSTM(512, return_sequences=True))model.add(tf.keras.layers.Dropout(0.3))model.add(tf.keras.layers.LSTM(512))  # return_sequences 是默认的 False,只返回输出序列的最后一个model.add(tf.keras.layers.Dense(256))  # 256 个神经元的全连接层model.add(tf.keras.layers.Dropout(0.3))model.add(tf.keras.layers.Dense(notes_len))  # 输出的数目等于所有不重复的音调的数目model.add(tf.keras.layers.Activation('softmax'))model.compile(loss='categorical_crossentropy', optimizer='rmsprop')if weights_file is not None:model.load_weights(weights_file)return model

四 模型训练

def train():notes=get_notes()notes_len=len(set(notes))note_name=sorted(set(i for i in notes))#获得排序的不重复的音符名字sequence_length = 100 #序列长度note_dict=dict((j,i) for i,j in enumerate(note_name))#设计一个字典,把音符转换成数字,方便训练network_input = []#创建输入序列network_output = []#创建输出序列for i in range(0, len(notes) - sequence_length):#输入100个,输出1个sequence_in = notes[i: i + sequence_length]sequence_out = notes[i + sequence_length]network_input.append([note_dict[k] for k in sequence_in])network_output.append(note_dict[sequence_out])network_input = np.reshape(network_input, (len(network_input), sequence_length, 1))network_input = network_input / float(notes_len) #归一化network_output = tf.keras.utils.to_categorical(network_output)#输出布尔矩阵,配合categorical_crossentropy 算法使用model =get_model(network_input,notes_len)filepath = "weights-{epoch:02d}-{loss:.2f}.hdf5"checkpoint = tf.keras.callbacks.ModelCheckpoint(filepath,monitor='loss',  # 监控的对象是lossverbose=0,save_best_only=True,mode='min'  # 如果监控对象是val_acc则取max,是loss则取min)callbacks_list = [checkpoint]model.fit(network_input, network_output, epochs=100, batch_size=128, callbacks=callbacks_list) #整体迭代100次,每小批128个

原文博主说训练时间非常长,我还不信,喵的我错了,我真的错了,一个epoch我的电脑耗时一个小时,根本跑不动,最后拿52个样本跑了十个epoch跑了个模型出来,看看是否能实现。路径直接给mid文件的路径就行。不需要其余另外的标签。

五、生成音乐

# 生成mid音乐
def create_music():notes = get_notes()notes_len = len(set(notes))note_name = sorted(set(i for i in notes))sequence_length = 100  # 序列长度note_dict = dict((j, i) for i, j in enumerate(note_name))  # 设计一个字典,把音符转换成数字,方便训练network_input = []  # 创建输入序列network_output = []  # 创建输出序列for i in range(0, len(notes) - sequence_length):# 输入100个,输出1个sequence_in = notes[i: i + sequence_length]sequence_out = notes[i + sequence_length]network_input.append([note_dict[k] for k in sequence_in])network_output.append(note_dict[sequence_out])network_input = np.reshape(network_input, (len(network_input), sequence_length, 1))normal_network_input = network_input / float(notes_len)  # 归一化# print(len(network_input)) #1541019# network_input, normal_network_input,notes_len,note_name=train()# 寻找loss最小的weight文件,作为训练参数files = os.listdir()minloss = {}for i in files:if 'weights' in i:num = i[11:15]minloss[num] = ibest_weights = minloss[min(minloss.keys())]print('最佳模型文件为:' + best_weights)model = get_model(normal_network_input, notes_len, best_weights)predictions = generate_notes(model, network_input, note_name, notes_len)offset = 0output_notes = []# 生成 Note(音符)或 Chord(和弦)对象for data in predictions: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 = offsetoutput_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='output1.mid')

博主源代码有个报错,ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray).这个是由于数据格式不对引起的,我添加了.astype(np.float)搞定,最后也成功生成了十个模型以及一个音频,给大伙长长眼!!!

 怀揣着炽热的心走向最宽容的刑场~~~~

妈的啥玩意,叮叮叮一直叮,就一个调???

查看了评论区注释,生成音乐一直当当当不变是因为样本太多,准确的来说是训练次数太少。

总结,没有一点基础第一次上手,跟我想象的不一样,我还以为会是和图像一样能给标签描述就会给我音频,但是这个方法的实现貌似不是这样的,我开始对这个感兴趣,也是因为chatgpt,提问请给我一段欢快的音频,它也确实能给你一段小调。

接下来有空试试其他的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16411.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国内唯一可以在本地搭建Stable Diffusion WebUI教程-安装时无需魔法安装全程流畅到尖叫

Stable Diffusion是什么 Stable Diffusion简称SD是一款Ai图片生成工具。“输入几句话,生成精美图片。” 比如说我一开头这幅图片就是用的SD生成的。 我在我的“ChatGPT让我变成了“超人”-如何提升团队30%效能质量提高100%的阶段性总结报告”里提到过midjourney,但是midjou…

电子表格软件的开山鼻祖 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 5 月 11 日,在 1995 年的今天,我国成为第六个研制成功磁悬浮列车的国家。磁悬浮列车利用“同性相斥,异性相吸”的原理&#…

行业报告 | AIGC发展研究

原创 | 文 BFT机器人 01 技术篇 深度学习进化史:知识变轨 风起云涌 已发生的关键步骤: 人工神经网络的诞生 反向传播算法的提出 GPU的使用 大数据的出现 预训练和迁移学习 生成对抗网络 (GAN) 的发明 强化学习的成功应用 自然语言处理的突破 即将发生的关键…

手把手带你快速实现直播聊天室

废话不多说,直接开干! 工具要求: (1) Android Studio 3.2或更高版本。 (2) SDK targetVersion至少为26。 本文聊天室是集成环信IM SDK实现聊天功能,及实现发送礼物、点赞和弹幕等功能。视频直播采用的是七牛相关的推拉流SDK。app …

地摊叫卖、超市播音工具-简洁的文字转语音播音软件

简介: 文件名称 : 播音员.exe 文件大小 : 0.5MB (568KB) 文件类型 : application/x-dosexec 运行平台 : Windows7 / Windows10 软件功能 : 自定义语录文字、图片,快捷发送聊天 软件特色 : 无需安装、永久免费、无自启、无广告 关于软件: 1、…

海威超市播音易源码+成品

介绍: 源码介绍: 目前一直在用的超市播音软件,送给不会编程的人,下载后打开直接可用! 会编程的人,可以修改后使用! 网盘下载地址: http://kekewangLuo.cc/VM4aIepRMTH 图片&#x…

养成这个好习惯,让播音主持成为你的加分项

我们都知道,习惯的力量是很大的,我们只有在日常生活中养成一个良好的习惯,才能为我们的学习“添砖加瓦”。 养成下面四个习惯,可以让学习播音主持的你在学习和考试中都会加分哦! 科学用声和护嗓 对于播音主持专业的学生来说&…

内容创业洗稿,知识付费拆书

作者: 深几度 来源: https://mp.weixin.qq.com/s/WXGURnbutf1BUV54ytuzjw 罗振宇又因为跨年演讲的问题成为众矢之的了,顺带着他的得到APP知识付费模式再一次被拖出来,被人批判了一番。 批判知识付费的理由已经屡见不鲜。此前公众号…

518超市播音软件如何放大音量到150的,传统播音软件声音太小(0-100)

518超市播音软件(http://www.518boyin.com/)最新版6.2 支持放大语音音量,最多可放大150%,而传统的播音软件声音太小。就是说播放音乐的时候音量挺大,到播放语音就感觉音量降低了很多。这可能是由于讲话天然没有歌曲喊的…

基于STM32的录音与播音

基于STM32的录音与播音 设计方案 本设计通过STM32的内置ADC加一个麦克风和放大电路(可以在网上买模块)实现音频的采集,然后存放在SD卡中(这里可以参考我之前的博客FATFS文件系统),然后再读取SD卡里存放的…

海威超市播音源码+成品

源码介绍: 目前一直在用的超市播音软件,送给不会编程的人,下载后打开直接可用!会编程的人,可以修改后使用! 网盘下载地址: http://www.bytepan.com/8sfiNvAioAc 图片:

基于WASAPI的录音播音系统

最近写了一个小的系统,在VS2022平台上做的,主要是通过调用Windows的API接口实现录音(PCM格式),播音(PCM、WAV、Mp3格式),PCM格式转WAV格式、遍历指定文件夹下的所有音频文件并播放。…

播音计算机论文,广播中计算机的应用论文

广播中计算机的应用论文 引言 随着社会的发展,人们的物质生活水平也在提高。而在这种发展趋势下,人们对精神生活水平也提出了新的要求。面对这些要求,传统的广播电视技术的应用已经无法满足广播事业的发展需要。而计算机技术的应用&#xff0…

学校的校园广播是如何设置的

9月开学季,各个校园的广播也开始播音了,随着互联网的发展,现在很多校园使用的都是播音软件,通过软件来操作可以节省人力,可以设置一次性、每天、每周、每月定时播放,支持开机自动运行。学校可自动定时广播打…

chatgpt赋能python:Python抄股票的秘诀

Python 抄股票的秘诀 在股票市场中,抄股票是许多投资者都会尝试的一种方式。然而,随着市场变化和行情的波动,抄股票并不是一件容易的事情。但是,有了 Python,我们可以利用其强大的数据处理和可视化功能来进行股票分析…

chatgpt赋能python:学Python炒股:聪明投资策略

学Python炒股:聪明投资策略 在金融市场中,投资者要获取财务知识并实际操作从而创造财富。多年来,投资者一直在寻找有效的技术分析手段,并逐步将其用于各种产品。Python在这方面提供了先进的技术,其跨平台的特性和Pyth…

chatgpt赋能python:利用Python炒股:一篇详细的指南

利用Python炒股:一篇详细的指南 炒股是许多人致富的途径。随着技术的发展,现在在线炒股已经变得越来越普及。在这个数字时代,Python提供了一个强大的数据分析和编程工具,可以帮助投资者更好地研究股市行情和制定更好的交易策略。…

chatgpt赋能python:用Python炒股效益如何?

用Python炒股效益如何? 介绍 随着互联网的不断发展,越来越多的人开始尝试使用Python来炒股。Python作为一种强大的编程语言,其在数据分析和机器学习领域拥有广泛的应用。而在股票投资领域,Python的优势也逐渐显现。 Python在股…

chatgpt赋能python:Python对炒股有用吗?

Python对炒股有用吗? 随着互联网的快速发展,炒股已经成为越来越多人的投资选择。而Python作为一种流行的编程语言,也逐渐被越来越多的投资者应用在炒股分析中。那么,Python对炒股有用吗?这是本文要探讨的问题。 Pyth…

飞书发送消息

import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSON; import cn.hutool.json.JSONUtil;import java.util.HashMap; import java.util.Map;/*** 飞书工具* author: czy* date: 2022-9-14*/ p…