用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.pswp.cn/web/77658.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77658.shtml
英文地址,請注明出處:http://en.pswp.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…