用Python做有趣的AI项目 6:AI音乐生成器(LSTM Melody Generator)

🎵 项目名称:AI音乐生成器(LSTM Melody Generator)

🧠 项目简介

这个项目的目标是:用 AI 来自动生成简单的旋律(MIDI格式),类似于基础的钢琴曲、背景音乐片段。

我们使用一个 LSTM(长短期记忆网络)模型,它能学习并预测音符的序列结构,实现自动作曲。

🔧 技术栈

技术 用途
Python 编程语言
TensorFlow / Keras 构建神经网络
music21 分析、处理和播放 MIDI 音乐
Streamlit 构建图形界面(可视化生成结果)
🎹 音乐格式说明
我们使用的是 MIDI 格式(.mid 文件),它记录的是音符序列而不是录音,适合用于训练模型和自动生成旋律。

✅ 项目流程

📥 Step 1:数据准备(音乐序列)
读取一个或多个 .mid 文件,并用 music21 将其转为音符/和弦的序列,然后用于训练。

⚙️ Step 2:模型训练(LSTM)
用 LSTM 模型来学习音符之间的关系,通过预测下一个音符生成完整旋律。

🧪 Step 3:生成旋律(Predict)
给一个起始片段,自动预测接下来的 50~200 个音符。

💾 Step 4:保存为 MIDI 文件
把生成的音符序列转换成音乐文件(.mid)并保存或播放。

📄 项目代码(打包为 Python 文件)
保存为:music_generator.py

pythonimport numpy as np
from music21 import converter, instrument, note, chord, stream
from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout
import glob
import pickle

Step 1: 提取音符

def get_notes():notes = []for file in glob.glob("midi_songs/*.mid"):midi = converter.parse(file)parts = instrument.partitionByInstrument(midi)notes_to_parse = parts.parts[0].recurse() if parts else midi.flat.notesfor element in notes_to_parse: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))with open("data/notes.pkl", "wb") as f:pickle.dump(notes, f)return notes

Step 2: 准备训练序列

def prepare_sequences(notes, sequence_length=100):pitchnames = sorted(set(notes))note_to_int = {note: i for i, note in enumerate(pitchnames)}network_input = []network_output = []for i in range(len(notes) - sequence_length):seq_in = notes[i:i + sequence_length]seq_out = notes[i + sequence_length]network_input.append([note_to_int[n] for n in seq_in])network_output.append(note_to_int[seq_out])n_patterns = len(network_input)network_input = np.reshape(network_input, (n_patterns, sequence_length, 1)) / float(len(pitchnames))network_output = np.eye(len(pitchnames))[network_output]return network_input, network_output, note_to_int, pitchnames

Step 3: 创建模型

def create_network(network_input, output_dim):model = Sequential()model.add(LSTM(256, input_shape=(network_input.shape[1], network_input.shape[2]), return_sequences=True))model.add(Dropout(0.3))model.add(LSTM(256))model.add(Dense(128, activation='relu'))model.add(Dropout(0.3))model.add(Dense(output_dim, activation='softmax'))model.compile(loss='categorical_crossentropy', optimizer='adam')return model

Step 4: 生成音符

def generate_notes(model, network_input, pitchnames, note_to_int, num_notes=100):int_to_note = {num: note for note, num in note_to_int.items()}start = np.random.randint(0, len(network_input) - 1)pattern = network_input[start]prediction_output = []for note_index in range(num_notes):prediction_input = np.reshape(pattern, (1, len(pattern), 1))prediction = model.predict(prediction_input, verbose=0)[0]index = np.argmax(prediction)result = int_to_note[index]prediction_output.append(result)pattern = np.append(pattern, [[index / float(len(pitchnames))]], axis=0)pattern = pattern[1:]return prediction_output

Step 5: 将音符输出为 MIDI 文件

def create_midi(prediction_output, filename="output.mid"):offset = 0output_notes = []for pattern in prediction_output:if "." in pattern or pattern.isdigit():notes_in_chord = pattern.split(".")notes = [note.Note(int(n)) for n in notes_in_chord]chord_notes = chord.Chord(notes)chord_notes.offset = offsetoutput_notes.append(chord_notes)else:new_note = note.Note(pattern)new_note.offset = offsetoutput_notes.append(new_note)offset += 0.5midi_stream = stream.Stream(output_notes)midi_stream.write('midi', fp=filename)

▶️ 使用说明

下载一些 MIDI 文件放入 midi_songs/ 文件夹

创建 data/ 文件夹用于保存训练数据

执行以下代码:

pythonnotes = get_notes()
network_input, network_output, note_to_int, pitchnames = prepare_sequences(notes)
model = create_network(network_input, output_dim=len(pitchnames))
model.fit(network_input, network_output, epochs=20, batch_size=64)

生成音乐

prediction = generate_notes(model, network_input, pitchnames, note_to_int, num_notes=200)
create_midi(prediction)

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

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

相关文章

【运维】利用任务计划程序定时重启 nssm 服务 | Windows 服务每日定时维护实践

🚀 利用任务计划程序定时重启 nssm 服务 | Windows 服务每日定时维护实践 一、前言 在 Windows 系统中,nssm(Non-Sucking Service Manager) 是一个非常好用的工具,可以将任意可执行程序注册为系统服务。很多运维场景…

MATLAB小试牛刀系列(1)

问题描述 某机床厂生产甲、乙两种机床,每台机床销售后的利润分别为 4 千元与 3 千元。生产甲机床需用 A、B 机器加工,加工时间分别为每台 2h 和每台 1h;生产乙机床需用 A、B、C 三种机器加工,加工时间均为每台 1h。若每天可用于加…

云原生周刊:Kubernetes v1.33 正式发布

开源项目推荐 Robusta Robusta 是一个开源的 K8s 可观测性与自动化平台,旨在增强 Prometheus 告警的智能化处理能力。它通过规则和 AI 技术对告警进行丰富化处理,自动附加相关的 Pod 日志、图表和可能的修复建议,支持智能分组、自动修复和高…

React速通笔记

相关视频: 黑马程序员前端React18入门到实战视频教程,从reacthooks核心基础到企业级项目开发实战(B站评论、极客园项目等)及大厂面试全通关_哔哩哔哩_bilibili 一、React介绍 React由Meta公司开发,是一个用于 构建W…

人工智能与机器学习:Python从零实现K-Means 算法

🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…

【神经网络与深度学习】训练集与验证集的功能解析与差异探究

引言 在深度学习模型的训练过程中,训练集和验证集是两个关键组成部分,它们在模型性能的提升和评估中扮演着不可替代的角色。通过分析这两者的区别和作用,可以帮助我们深入理解模型的学习过程和泛化能力,同时为防止过拟合及优化超…

Macos m系列芯片环境下python3安装mysqlclient系列问题

最近学习python3,在安装mysqlclient的时候遇到了一些问题,直接使用哦pip install mysqlclient 直接报错了,记录一下解决方案。 环境信息 设备:Macbook Pro m1 系统:macos Sequoia 15.3.2 最终成功的python版本&#xf…

微信小程序-van-uploader的preview-size

preview-size支持数组格式 修改前修改后1、升级微信小程序里面的van版本:2、 重新构建npm3、重启微信开发工具 修改前 引用van组件的上传文件,设置预览图尺寸,刚开始设置的是preview-size“140”,出来的效果就是一个正方形。 修改后 1、升级…

2. 第一个网页:前端基础入门

第一个网页:前端基础入门 一、网页文件基础认知 1. 文件扩展名 .htm 或 .html 均为网页文件后缀,二者功能完全一致扩展名隐藏方法 系统设置 → 文件夹选项 → 查看 → 取消勾选「隐藏已知文件类型的扩展名」 二、前端发展简史 1. 浏览器战争与标准混…

云原生--核心组件-容器篇-7-Docker私有镜像仓库--Harbor

1、Harbor的定义与核心作用 定义: Harbor是由VMware开源的企业级容器镜像仓库系统,后捐赠给 CNCF (Cloud Native Computing Foundation)。它基于Docker Registry扩展了企业级功能,用于存储、分发和管理容器镜像(如Docker、OCI标准…

Java项目与技术栈场景题深度解析

Java项目与技术栈场景题深度解析 在互联网大厂Java求职者的面试中,经常会被问到关于Java项目或技术栈的场景题。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官:马架构,欢迎来到我们公司的面试现场。请问您对Java…

SpringMVC 静态资源处理 mvc:default-servlet-handler

我们先来看看效果,当我把这一行注释掉的时候&#xff1a; 我们来看看页面&#xff1a; 现在我把注释去掉&#xff1a; 、 可以看到的是&#xff0c;这个时候又可以访问了 那么我们就可以想&#xff0c;这个 <mvc:default-servlet-handler />它控制着我们页面的访问…

【leetcode】最长公共子路径问题

滚动hash 滚动哈希&#xff08;rolling hash&#xff09;也叫 Rabin-Karp 字符串哈希算法&#xff0c;它是将某个字符串看成某个进制下的整数&#xff0c;并将其对应的十进制整数作为hash值。 滚动hash算法的推导 假设有一个长度为n的数组a[0],a[1],a[2],…a[n-1]&#xff0…

【Linux网络】:套接字之UDP

一、UDP和TCP协议 TCP &#xff08;Transmission Control Protocol 传输控制协议&#xff09;的特点&#xff1a; 传输层协议有连接&#xff08;在正式通信前要先建立连接&#xff09;可靠传输&#xff08;在内部帮我们做可靠传输工作&#xff09;面向字节流 UDP &#xff08;U…

React19 useOptimistic 用法

用法 乐观更新 发起异步请求时&#xff0c;先假设请求会成功立即更新 UI 给用户反馈若请求最终失败&#xff0c;再将 UI 恢复到之前的状态 const [optimisticState, addOptimistic] useOptimistic(state, updateFn) 参数 state&#xff1a;实际值&#xff0c;可以是 useSta…

Deepseek-v3+cline+vscode java自动化编程

1、Deepseek DeepSeek 充值后&#xff0c;创建apikey 2、vscode Visual Studio Code - Code Editing. Redefined 3、下载插件cline 4、配置deepeseek-v3 的密钥到cline 5、不可用 在开始的几次调用能正常使用起来&#xff0c;用了几次后&#xff0c;不能使用了&#xff0c;请求…

数据分析案例:环境数据分析

目录 数据分析案例&#xff1a;环境数据分析1. 项目背景2. 数据加载与预处理2.1 数据说明2.2 读取与清洗 3. 探索性数据分析&#xff08;EDA&#xff09;3.1 时序趋势3.2 日内变化3.3 气象与污染物相关性 4. 特征工程4.1 时间特征4.2 滞后与滚动统计4.3 目标变量 5. 模型构建与…

网络原理 - 8

目录 补充 网络层 IP 协议 基本概念&#xff1a; 协议头格式 地址管理 如何解决 IP 地址不够用呢&#xff1f;&#xff1f;&#xff1f; 1. 动态分配 IP 地址&#xff1a; 2. NAT 机制&#xff08;网络地址映射&#xff09; 3. IPv6 网段划分 一些特殊的 IP 地址 …

向量检索新选择:FastGPT + OceanBase,快速构建RAG

随着人工智能的快速发展&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;技术日益受到关注。向量数据库作为 RAG 系统的核心基础设施&#xff0c;堪称 RAG 的“记忆中枢”&#xff0c;其性能直接关系到大模型生成内容的精准度与…

dify对接飞书云文档,并且将图片传入飞书文档

前面讲了如何让dify展示图片&#xff0c;但是如果想让智能体回答的带图片的内容生成个文档该怎么弄呢&#xff1f;今天来实践一下。 dify工具带的有飞书云文档&#xff0c;正好&#xff0c;咱们就利用飞书云文档。 1、首先配置飞书云文档的key跟secret 注意要开头左侧的权限&a…