[流程圖](#流程圖)
- [一. 資料收集](#一-資料收集)
- [1. 收集資料](#1-從各種不同來源收集資料)
- [2. 音樂分類](#2-將音樂進行分類各100首,時長30秒以上)
- [二. 資料處理](#二-資料處理)
- [1-自動生成文本和轉檔](#1-自動生成文本和轉檔)
- [2-音樂曲風分類](#2-音樂曲風分類)
- [三. 使用MusicGen模型進行訓練](#三-使用Musicgen-model-進行訓練)
- [四. 調整參數](#)
- [五. 模型儲存](#)
- [六. 生成音樂](#)
[改進](#改進)
[問題和討論](#問題和討論)
# 流程圖

## 一. 資料收集
### 1. 從各種不同來源收集資料
- [Pixabay](https://pixabay.com/zh/music/)
- [Huggingface](https://huggingface.co/datasets/breadlicker45/bread-midi-dataset/tree/main)
- [Magenta](https://magenta.tensorflow.org/datasets/maestro)
- [Youtube](https://www.youtube.com)
- [Purple Planet](https://www.purple-planet.com/)

### 2. 將音樂進行分類:各100首,時長30秒以上
- 藍調 blues
- 古典 classical
- 鄉村 country
- 迪斯可 disco
- 嘻哈 hiphop
- 爵士 jazz
- 金屬 metal
- 流行 pop
- 雷鬼 reggae
- 搖滾 rock
- 未知 unknow: 尚未分類的音樂將放置在unknow資料夾

## 二. 資料處理
### 1. 自動生成文本和轉檔
- 將midi、mp3等音樂格式統一轉成**wav**檔
- 將轉換後的音檔生成相對應的文本描述,包括音檔的名稱、風格等描述性內容。
### 2. 音樂曲風分類
- 使用**MFCC**提取特徵
- 切割成訓練集、測試集
```python!
import numpy as np
from sklearn.model_selection import train_test_split
def prepare_dataset(test_size, validation_size):
X, y = load_data("D:\\Senior Project\\save\\music_data.json")
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train,
test_size=validation_size)
X_train = X_train[..., np.newaxis]
X_val = X_val[..., np.newaxis]
X_test = X_test[..., np.newaxis]
return X_train, X_val, X_test, y_train, y_val, y_test
X_train, X_val, X_test, y_train, y_val, y_test = prepare_dataset(0.25, 0.2)
input_shape = X_train.shape[1:]
print(input_shape)
```
- 使用**CNN Model**進行訓練
```python!
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Input, Conv2D, MaxPool2D, BatchNormalization, Flatten, Dense, Dropout
model = Sequential([
Input(shape=input_shape),
Conv2D(64, (3, 3), activation="relu"),
MaxPool2D((3, 3), strides=(2, 2), padding="same"),
BatchNormalization(),
Conv2D(32, (3, 3), activation="relu"),
MaxPool2D((3, 3), strides=(2, 2), padding="same"),
BatchNormalization(),
Conv2D(32, (2, 2), activation="relu"),
MaxPool2D((2, 2), strides=(2, 2), padding="same"),
BatchNormalization(),
Conv2D(16, (1, 1), activation="relu"),
MaxPool2D((1, 1), strides=(2, 2), padding="same"),
BatchNormalization(),
Flatten(),
Dense(64, activation="relu"),
Dropout(0.3),
Dense(10, activation="softmax")
])
model.summary()
```
- 進行音樂曲風分類並生成相對應文本
## 三. 使用**Musicgen model** 進行訓練
## 四. 調整參數
## 五. 模型儲存
## 六. 生成音樂
# 改進
### 1. 自動生成文本和轉檔
在訓練過程中,音樂的WAV檔案及相關文本的TXT檔案是必須的。為了簡化預處理階段,我們開發了一個功能,能夠自動將MP3、MIDI等格式的文件轉換成WAV格式。同時,該功能還會根據文件所在的目錄結構自動生成相應的文本檔案。這樣,我們就無需手動創建新的文本文件或進行格式轉換,從而大大節省了準備數據的時間和工作量。
### 2. 音樂風格分類器
在搜集音樂資料的過程中,我們致力於選擇可自由使用的曲目,以規避版權問題。然而,我們偶爾會遇到未經分類或文件名呈現亂碼的音檔,這對於資料收集工作帶來了不小的挑戰。為了解決這一問題,我們在AI音樂助手中加入了一項新功能:音樂風格辨別器。透過這個工具,我們能夠有效地對音檔進行風格分類,進一步優化我們的資料整理流程。
### 3. 音樂訓練框架
在我們推進音樂生成的工作中,主要依賴於一款名為MusicGen的尖端模型,該模型專為音樂創作的自動化而設計,旨在令音樂生成變得更加便捷、迅速。MusicGen模型憑借其卓越的音樂理解能力和優異的生成質量而聞名,其生成的音樂質量之高,甚至足以應用於音樂信息檢索(MIR)領域。然而,該模型僅提供了預訓練的模型參數,未開放自定義訓練的接口。為了使研究人員和開發者能夠根據自身的音樂需求和風格偏好,創建定制的AI音樂助理,我們開發了一套全面的訓練框架。該框架深入剖析了MusicGen模型的架構及其運作原理,精煉出了核心音樂生成機制,并在此基礎上,擴充了多項功能模塊,包括音頻的預處理、動態數據加載以及自定義訓練參數設置等。藉助於自動混合精度訓練和梯度累積技術,這套訓練框架使使用者能夠毫不費力地將自己的音樂數據集投入模型進行訓練,從而實現個性化音樂創作。
# 問題和討論
### 1. 高性能硬件要求
在模型訓練階段,我們經常面臨電腦內存不足的問題,這阻礙了模型的執行和開發進度。為了降低對高性能硬件的依賴並加速訓練過程,我們採取了優化數據加載和模型結構的策略。然而,當處理大量音頻文件時,內存溢出的問題仍然存在,顯示出進一步優化的必要性。
### 2. 數據收集的複雜性
音樂數據的收集過程中,我們面臨著版權、音質不佳、缺乏分類和元數據亂碼等問題。此外,為音頻文件手動生成匹配的文本標籤增加了額外的工作量。為解決這些問題,我們改善了數據預處理和清洗流程,並採用自動化工具提高效率。
### 3. 路徑配置問題
程式執行中需要手動配置多個路徑,這一過程繁瑣且易出錯。為提高用戶體驗,我們正在開發更加友好的路徑配置系統,透過自動化探測和智能提示,簡化路徑設置過程。
### 4. 系統兼容性限制
我們在項目中使用了triton這一深度學習優化套件,但遇到了其不支持Windows操作系統的問題。雖然網路上有修改版本使其能在Windows上運行,但存在版本兼容問題。我們目前的解決方案是在虛擬機中安裝Linux系統,以規避兼容性問題,同時我們也在考慮對相關依賴進行調整,以適應更廣泛的開發環境。
### 5. Mamba model
將模型中的Transformer架構替換為最新發布的Mamba架構,可能為處理速度、長序列數據處理能力及計算資源消耗帶來顯著改進。Mamba模型,以其獨特的選擇性信息傳播機制和線性時間複雜度,不僅在語言模型測試中展現出優異的性能,甚至在推理速度上實現了相較於Transformer高達五倍的提速。這種改進尤其適用於要求實時響應和處理大規模數據集的應用場景。同時,Mamba的高效數據處理能力對於生成式AI服務和長文本生成等任務來說,也提供了新的可能性。但實現這一轉變需要對Mamba架構有深刻的理解,目前我們的技術能力尚不足以對其進行更動。
### 6. Music Transformer
在訓練過程中,為了有效地縮短訓練所需的時間,我曾嘗試探索同時生成多個音樂段落的可能性,目的是在不損失音質的前提下提高效率。然而,儘管單個段落的音質達到了預期的高水準,但段落與段落之間的連貫性卻未能達到理想的流暢度。基於這一發現,我計劃嘗試運用Google開發的Music Transformer模型來進行改進,希望通過其先進的多頭自注意力機制來優化段落之間的過渡,從而在保證音樂質量的同時,實現段落間的無縫銜接。