python 颤音_自成一派,这个作曲大师确实名副其实!
AWS DeepComposer 是一項教育型的 AWS 服務,可以訓練出生成式人工智能,并利用 GAN(Generative Adversarial Network)轉換輸入的旋律,創作出完整的原創樂曲。
簡單來說,借助 AWS DeepComposer,我們可以使用預先訓練好的音樂流派模型(如爵士、搖滾、流行、交響樂等)將我們提供的旋律轉換為相應流派的曲子。那么當你玩轉這個服務后,有沒有想過自己也「開宗立派」,通過一定的參數訓練出自己的流派選項?
當然可以!我們只需要將音樂數據文件存儲在 NumPy 對象中,隨后結合 GitHub 上的 Lab 2—— 訓練一套自定義 GAN 模型中的訓練步驟進行操作即可。下文將介紹如何將 MIDI 文件轉換為適用于 AWS Deepomposer 的格式,而訓練出自己的流派模型。
在下文中,我們可以使用自己的 MIDI 文件訓練出雷鬼音樂流派模型。雷鬼音樂誕生于牙買加島,常用樂器包括低音吉他、鼓以及各類打擊樂器。不過本文介紹的方法也是通用的,大家完全可以借此訓練任何其他音樂流派。
數據處理:生成訓練數據
MIDI(.mid)文件是訓練數據的最初始狀態。MIDI 文件由軟件生成(并讀取),文件中包括關于音符及聲音回放的數據。在數據處理過程中,我們需要將 MIDI 文件轉換為 NumPy 數組,并將其持久化保存成磁盤上的一個單獨的.npy 文件。下圖展示了數據的轉換過程:
盡管機器學習普遍使用.csv文件存儲數據,但.npy文件是為加速訓練過程中的讀取速度高度優化的。.npy文件的最終形態應為(x, 32, 128, 4),其含義分別為(樣本數量,每個樣本的時間步數, 音高范圍, 樂器)。
若將 MIDI 文件轉換為適當的格式,我們需要完成以下步驟:讀取 MIDI 文件以生成一個 Multitrack 對象。
確定要使用的四條樂器音軌。
檢索各音軌中的 Pianoroll 矩陣,并將其調整為正確的格式。
將 Pianoroll 對象與給定的樂器相匹配,并將其存儲在.npy文件中。
讀取 MIDI 文件以生成一個 Multitrack 對象
數據處理的第一步,是解析各 MIDI 文件并生成一個 Multitrack 對象。下圖即為 Multitrack 對象的基本結構。
這個過程用需要用到 Pypianoroll 庫,它以 Python 代碼實現讀取及寫入 MIDI 文件的功能。具體參見以下代碼:#init with beat resolution of 4
music_tracks = pypianoroll.Multitrack(beat_resolution=4)
#Load MIDI file using parse_midi
#returns Multitrack object containing Track objects
music_tracks.parse_midi(your_midi_file_directory + your_midi_filename)
music_tracks是一個 Mulitrack 對象,包含一個從 MIDI 文件中讀取到的 Track 對象列表。每個 Mulitrack 對象都包含速度(Tempo)、節拍(Downbeat)、節拍分辨率(Beat resolution)以及名稱(Name),具體如以下代碼所示:tracks: [FRETLSSS, ORGAN 2, CLAVINET, MUTED GTR, CLEAN GTR, VIBRAPHONE, DRUMS],
tempo: [120. 120. 120. ... 120. 120. 120.],
downbeat: [ True False False False False False False False False . . .
False False False False False False False False False False False False],
beat_resolution: 4,
name: “reggae1”
確定要使用的四條樂器音軌
如果要解析的 Mulitrack 對象中恰好包含四種樂器,則可以直接跳過此步驟。
我們之前解析的 Mulitrack 對象共包含7條樂器音軌(Fretless 電貝司、風琴、豎笛、靜音電吉他、清音電吉他、顫音琴和鼓)。模型需要學習的樂器種類越多,訓練時間就越長,成本自然也越高。有鑒于此,這里我們選擇的 GAN 只支持最多4種樂器。如果 MIDI 文件中的音軌包含4種以上樂器,請直接從所選擇的音樂流派中選擇最重要的4種樂器進行模型訓練。相應的,如果樂器數量不足4種,則需要擴充 MIDI 文件。樂器數量錯誤會導致 NumPy 的形制出現錯誤。
給定音軌上的每一種樂器都擁有自己的編號。編號由通用 MIDI 規范規定,相當于樂器的唯一標識符。以下代碼示例就用相關編號提取到鋼琴、風琴、貝司以及吉他四種樂器:instrument1_program_numbers = [1,2,3,4,5,6,7,8] #Piano
instrument2_program_numbers = [17,18,19,20,21,22,23,24] #Organ
instrument3_program_numbers = [33,34,35,36,37,38,39,40] #Bass
instrument4_program_numbers = [25,26,27,28,29,30,31,32] #Guitar
if track.program in instrument1_program_numbers:
collection['Piano'].append(track)
elif track.program in instrument2_program_numbers:
collection['Organ'].append(track)
elif track.program in instrument3_program_numbers:
collection['Bass'].append(track)
elif track.program in instrument4_program_numbers:
collection['Guitar'].append(track)
檢索每條音軌中的 Pianoroll 矩陣,并將其調整為正確的格式
Multitrack 對象為每種樂器提供一個 Track 對象。每個 Track 對象中都包含一個 Pianoroll 矩陣、一個編號、人個表示音軌是否為鼓的布爾值以及一個名稱。
以下代碼,為單一 Track 的具體示例:pianoroll:
[[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
...
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]],
program: 7,
is_drum: False,
name: CLAVINET
在訓練當中,單一 Pianoroll 對象應具有32個離散的時間步長,代表一首歌曲的片段與128個音高。所選樂器音軌的 Pianoroll 對象的起始形態為(512,128),我們需要將其調整為正確的格式。每個 Pianoroll 對象將重新調整為2個小節(32個時間步長)、音高為128。輸入以下代碼后,單一 Pianoroll 對象的最終形制為 (16, 32, 128):#loop through chosen tracks
for index, track in enumerate(chosen_tracks):
try:
#reshape pianoroll to 2 bar (i.e. 32 time step) chunks
track.pianoroll = track.pianoroll.reshape( -1, 32, 128)
#store reshaped pianoroll per instrument
reshaped_piano_roll_dict = store_track(track, reshaped_piano_roll_dict)
except Exception as e:
print("ERROR!!!!!----> Skipping track # ", index, " with error ", e)
為了簡潔起見,以下代碼示例僅顯示鋼琴音軌的制作示例:{'Piano': [Track(pianoroll=array([[[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]]], dtype=uint8), program=7, is_drum=False, name=CLAVINET)]
將 Pianoroll 對象與給定樂器相匹配,并將其存儲在.npy 文件中。
下一步是按樂器將所有音軌連結起來,并將其存儲在.npy 訓練文件當中。我們可以將這個過程理解為各 Pianoroll 對象間的彼此堆疊。我們需要為4種所選樂器分別重復這個過程,具體請參見以下代碼:def get_merged(music_tracks, filename):
...
#will hold all merged instrument tracks
merge_piano_roll_list = []
for instrument in reshaped_piano_roll_dict:
try:
merged_pianorolls = np.empty(shape=(0,32,128))
#concatenate/stack all tracks for a single instrument
if len(reshaped_piano_roll_dict[instrument]) > 0:
if reshaped_piano_roll_dict[instrument]:
merged_pianorolls = np.stack([track.pianoroll for track in reshaped_piano_roll_dict[instrument]], -1)
merged_pianorolls = merged_pianorolls[:, :, :, 0]
merged_piano_rolls = np.any(merged_pianorolls, axis=0)
merge_piano_roll_list.append(merged_piano_rolls)
except Exception as e:
print("ERROR!!!!!----> Cannot concatenate/merge track for instrument", instrument, " with error ", e)
merge_piano_roll_list = np.stack([track for track in merge_piano_roll_list], -1)
return merge_piano_roll_list.reshape(-1,32,128,4)
現在,我們將合并后的 Pianoroll 存儲在.npy 文件當中,詳見以下代碼:#holds final reshaped tracks that will be saved to training .npy file
track_list = np.empty(shape=(0,32,128,4))
. . .
#merge pianoroll objects by instrument
merged_tracks_to_add_to_training_file = get_merged(music_tracks, filename)
#concatenate merged pianoroll objects to final training data track list
track_list = np.concatenate((merged_tracks_to_add_to_training_file, track_list))
# binarize data
track_list[track_list == 0] = -1
track_list[track_list >= 0] = 1
#save the training data to reggae-train.npy
save(train_dir + '/reggae-train.npy', np.array(track_list))
結果
以上代碼將一組存儲在 your_midi_file_directory 中的 MIDI 文件生成 reggae-train.npy。相應 Jupyter notebook 與完整代碼可通過GitHub repo獲取。
現在,我們已經擁有了訓練數據文件,接下來就可以根據 AWS DeepComposer 示例 notebook 中 Lab 2—— 訓練自定義 GAN 模型提出的步驟訓練自定義音樂流派模型。
本文在 SoundCloud 上提供兩個由 AI 生成的雷鬼風格音軌:Summer Breeze 與 Mellow Vibe。
技巧與秘訣
我們可以使用以下技巧與秘訣理解你的數據內容,并生成更悅耳的 AI 樂曲。
在 GarageBand 中查看及收聽 MIDI 文件
如果你使用 Mac 設備,可以使用 GarageBand 收聽 MIDI 文件并查看其中使用的樂器。如果沒有 Mac 設備,則可使用任何其他支持 MIDI 文件的Digital Audio Workstation(DAW)。在通過 GarageBand 收聽 AI 生成的樂曲時,音質要明顯更好,甚至可以連接專業級揚聲器以獲得極好的聽覺效果。
使用樂器編號更改伴奏的樂器
在運行Lab 2—— 訓練自定義 GAN 模型提供的推理代碼時,大家可能會注意到,所有由 AI 生成的音軌都會在 GarageBand 中顯示為“Steinway Grand Piano”。如果熟悉 AWS DeepComposer 控制臺,則可隨時調整樂器種類。要在訓練自定義模型時更改伴奏的樂器種類,請在調用midi_utils中的save_pianoroll_as_midi函數時使用programs參數,具體請見以下代碼:#use programs to provide the program numbers for the instruments I care about
#17 = Drawbar Organ, 28 = Electric Guitar, 27 = Electric Guitar, 11 = Music Box
midi_utils.save_pianoroll_as_midi(fake_sample_x[:4], programs=[17, 28, 27, 11], destination_path=destination_path)
使用 GarageBand 添加其他伴奏
在使用AI生成一首樂曲(帶伴奏)之后,我們可以使用GarageBand(或者其他類似的工具)進一步添加更多伴奏。我們可以調整音軌的速度,甚至讓某些樂器靜音。我們也可以添加任意數量的其他伴奏樂器以創造出獨特的聲音表現。
在 AWS DeepComposer 控制臺上創建推理旋律
在運行推理時,我們需要一段 MIDI 格式的自定義旋律。我們還可以添加伴奏樂器配合該自定義旋律生成一首獨特的樂曲。在訓練自定義模型時,最簡單的旋律創建方法就是使用 AWS DeepComposer 控制臺。我們可以使用虛擬鍵盤或者 AWS DeepComposer 鍵盤記錄下旋律,而后選擇“Download”將其下載為 MIDI 文件。
使用 Matplotlib 繪制 Pianoroll
大家可以使用 Track 上的 Plot 函數繪制 Pianoroll 對象,這樣就能直觀查看 Pianoroll 對象了。具體請參見以下代碼:import matplotlib.pyplot as plt
...
fig, ax = track.plot()
plt.show()
下圖所示,為 Pianoroll 對象的基本觀感。
數據二值化
代碼包含了一段對數據進行二進制化的部分。這項更新非常重要,因為在處理二進制化輸入時,該模型實際處理的是-1與1(而非0與1)。Track_list中包含最終訓練數據,在繼續使用 Reggae-train.npy之前,應將其設置為-1或者1。具體請參見以下代碼:# binarize data
track_list[track_list == 0] = -1
track_list[track_list >= 0] = 1
總結
AWS DeepComposer 不只是一款普通的鍵盤,同時也是一種有趣的互動方式,幫助我們了解生成式的 AI 與 GAN 的復雜性。我們可以在它的幫助下學習演奏簡單的旋律,甚至可能激發出創作全新樂曲的靈感、訓練出自己的自定義音樂流派模型、最終創造出前所未有的聲音。我們也可以將兩種流派融合起來以創造出新的音樂類型!
總結
以上是生活随笔為你收集整理的python 颤音_自成一派,这个作曲大师确实名副其实!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: insert exec 语句不能嵌套_走
- 下一篇: python开发跟淘宝有关联微_使用Py