🎼 PythonのAI作曲家:ゼロから音楽を作る
音楽を理解し、生成し、ファイルに保存して聴くことができるようにニューラルネットワークを学習させる方法!
音楽をかけると、メロディーが聞こえます。さて、想像してみてください。ニューラルネットワークも音楽を「聞き」、それを記憶し、そして独自の音楽を作曲します! 🤯
💡 私たちはそのようなニューラルネットワークをゼロから作成します。まず最初のステップから始めましょう。学習に適した形式で音楽を準備し、モデルをトレーニングし、最後に最初の楽曲を生成します。
🔧第1部:データの準備と基礎
1.音楽を操作するためのツールをインストールする
ターミナル(またはコマンドライン)を開き、次のように入力します。
pip install music21📦 これはmusic21ライブラリです。音楽の翻訳者のようなものです。
.midファイルを読み込みます(音楽が含まれています)。音符とコードを引き出し、
新しいメロディーを保存して作成できます。
これは、音楽をPythonとニューラルネットワークが理解できるデータに変換するためのアシスタントです。
2. 音楽を準備する
AIが作曲を学ぶには、例が必要です。子供のように、まず大人が歌うのを聞いて、それから自分で歌い始めます🎵
🎼 私たちにはMIDI-файлыが適しています。これは、どの音符をどの順序でどのくらいの時間演奏するかが書かれた「音楽の草稿」のようなものです。
🔍 どこで手に入れることができますか?
サイトにアクセスしてみてください https://bitmidi.com
いくつかのメロディーをダウンロードします(例:バッハまたはベートーベン)
コードの横に
midi_songsという名前のフォルダを作成します拡張子が
.midのファイルをそこに置きます
3. Pythonで音楽を読む
今度はコードです。すべてのMIDIファイルを読み取り、音符を抽出してリストに追加します。完全な例は次のとおりです。
from music21 import converter, note, chord
import glob
notes = []
# midi_songsフォルダー内のすべてのファイルを読み込みます
for file in glob.glob("midi_songs/*.mid"):
# 音楽作品としてファイルをアップロードする
midi = converter.parse(file)
# 楽器を無視して、すべての音符とコードを取得します
elements = midi.flat.notes
for element in elements:
if isinstance(element, note.Note):
# これは単音です。たとえば、「C4」(4オクターブのド)
notes.append(str(element.pitch))
elif isinstance(element, chord.Chord):
# これはコードです。たとえば、「60.64.67」
# コード内のすべての音符の番号を取得し、文字列に結合します
notes.append('.'.join(str(n) for n in element.normalOrder))📌 説明:
glob.glob("midi_songs/*.mid")— フォルダ内のすべてのMIDIファイルを検索します。converter.parse(file)はファイルを読み取り、操作可能なオブジェクトに変換します。midi.flat.notes— 音符のみを取得します(リズム、テンポ、楽器はまだ触りません)。note.Note—単音(ド、レ、ミなど)chord.Chord— コード(ギターのコードのように、同時に複数の音を奏でる)。
🎵なぜ音符を線で表すのですか?
ニューラルネットワークに転送するのが簡単だからです。例えば:
"C4"— 通常のノート。"60.64.67"は、3つの音からなるコードで、各数字は音の高さの番号です。
私たちが達成したこと
👉 変数notesには、MIDIファイルのすべての音楽が含まれるようになりました。音符ごと、コードごとにです。
例:
notes[:10]
# ['E4', 'D4', 'C4', 'C4', 'D4', 'E4', 'E4', 'E4', 'D4', 'D4']これは、メロディーを聞き取って、それをそのままコードに書き起こすようなものです🎧
✅ 第1部の結果:
必要なライブラリをインストールしました
音楽をダウンロードしました
それを音符のリストに変えた
これがAIの「学習教材」です。
🔁 パート2:ニューラルネットワークのトレーニング
前回は、.midファイルの音楽を音符リストに変換しました。さて、ここからが面白いところです。AIにメロディーの構成を理解させ、独自のメロディーを生成させましょう🎶
Pythonを学び始めたばかりでも、理解できます!さあ始めましょう🚀
1. 音楽を細かく分割する
AIが作曲を学ぶには、例が必要です。 「これが音符の一部です。次の音符は何だと思いますか。」 聞き覚えのある曲を聴いて、次に何が起こるかを予想するような感覚です🎧
# ユニークなノートのリストを取得します
pitchnames = sorted(set(notes))
# 辞書を作成します: メモ -> 数字
note_to_int = {note: number for number, note in enumerate(pitchnames)}
sequence_length = 50 # ピースの長さ(50ノート)
network_input = []
network_output = []
for i in range(len(notes) - sequence_length):
# 50個の連続した音符を取ります
sequence_in = notes[i:i + sequence_length]
# 次の音は「答え」ですse"
sequence_out = notes[i + sequence_length]
# 音符を数字に変換する
network_input.append([note_to_int[n] for n in sequence_in])
network_output.append(note_to_int[sequence_out])📌 こちら:
すべてのユニークなノートを見つけます(例:C4、D4、60.64.67)。
ニューラルネットワークはテキストを理解せず、数字だけを理解するため、各音符を数字に変換します。
🧠 簡単に言うと:
50個の音符から1つの断片をコンテキストとして取り出します。
そしてニューラルネットワークに51番目の音符を当ててもらいます。
このような例は何千ものものがあり、ニューラルネットワークはそれぞれから学習します。
2.ニューラルネットワークのデータを準備する
ニューラルネットワークは、単なる音符の数ではなく、0から1までの数で動作します。したがって、入力データを正規化します。
import numpy as np
from tensorflow.keras.utils import to_categorical
n_patterns = len(network_input)
n_vocab = len(pitchnames)
# 必要な形式に変換し、合計音数で割ります
network_input = np.reshape(network_input, (n_patterns, sequence_length, 1))
network_input = network_input / float(n_vocab)
# カテゴリの出力を変換します(one-hot)
network_output = to_categorical(network_output)🔍 何が起こっているのか:
通常のリストから3D形式に入力フォームを変更します(ニューラルネットワークの動作に必要です)。
各数字を全音数で割って、0から1までの値を得ます。
出力(正解)は、各ノートがネットワークの個別の「出力」である特別なビューに変換されます。
3.シンプルなニューラルネットワークを構築する
さあ、魔法の時間です。
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dropout, Dense model = Sequential() model.add(LSTM(256, input_shape=(sequence_length, 1))) model.add(Dropout(0.3)) model.add(Dense(n_vocab, activation='softmax'))📌 説明:
LSTMは、連続したもの(音楽など)を記憶するのに優れた特殊なニューラルネットワークです。Dropout— モデルが「学習」するのではなく、本当に学ぶようにします。Dense(n_vocab, activation='softmax')— 出力時にネットワークは次のようになります。 「次の音は80%の確率でC4、10%の確率でD4だと思う…」
4.ニューラルネットワークをトレーニングする
model.compile(loss='categorical_crossentropy', optimizer='adam') model.fit(network_input, network_output, epochs=50, batch_size=64)💡 トレーニングには少し時間がかかります。要点は次のとおりです。
ネットワークは50の音符を見ています。
51番目を当てようとしています。
間違っているかどうかを知る。
そして、次回はより正確に予測できるように「ロジック」を調整します。
何千回も続けて。そして、毎回、どんどん良くなっていきます。まるで、聞き耳を立ててメロディーを作曲することを学ぶ子供のようです🎶
🔥 これで完了です。これで、メロディーの次の音符を予測できるトレーニング済みモデルができました。
🎼 パート3:音楽の生成と保存
データを収集し、ニューラルネットワークをトレーニングしたので、いよいよ魔法の瞬間です。👉 AIが音楽を作曲します!そして、あなたはその結果を聞くことができるのです。
1. まずは小さなメロディーから始めましょう
ネットワークに教えたこと: 「ここに50の音符があります。51番目の音符を当ててください。」 今度は逆のことをします。 50の音符を与えると、次の音符を予測し、さらに次を予測します。
import random import numpy as np # 語彙:数から ― 音符へ int_to_note = {number: note for number, note in enumerate(pitchnames)} # ランダムな開始シーケンスを選択します(50ノート) start = random.randint(0, len(network_input) - 1) pattern = network_input[start]💡 1つのランダムなピースを取ります(トレーニングで提供されたものと同じ形式)。これは「ヒント」、新しいメロディーの始まりになります。
2. メロディーの続きを作る
次に、モデルに300回連続で次の質問をします。 「次はどの音を出しますか?」
prediction_output = [] for i in range(300): # 300の新しいノートが欲しい # 入力を準備します: 再成形 + 正規化 (0 から 1 まで) prediction_input = pattern.reshape(1, len(pattern), 1) prediction_input = prediction_input / float(n_vocab) # 次の音を予測する prediction = model.predict(prediction_input, verbose=0) # 最も可能性の高い音の指数を取得します index = np.argmax(prediction) # 数字を音符の名前に戻します result = int_to_note[index] prediction_output.append(result) # シーケンスを更新します。1番目を削除し、新しいシーケンスを追加します pattern = np.append(pattern[1:], [[index]], axis=0)🔍 ここで重要な点は次のとおりです。
.reshape(...)— データを必要な形式に変換します(1つのメロディー、50のノート、1ノートあたり1つの値)。/ float(n_vocab)—ネットワークが正しく動作するように値を正規化します。model.predict(...)— ネットワークはすべての音符の確率を予測します。np.argmax(...)— 最も可能性の高いものを選択します。append(..., [[index]], ...)— メロディーを1ステップスクロールします。
📌 このように、AIは段階的に新しいメロディーを作曲します。まずは51番目の音符、次に52番目、そして300番目まで続きます。
3. 音符を音楽に戻す
これで、線の形の音符のリストができました。
['E4', 'F4', 'G4', '60.64.67', ...]これは将来のメロディーですが、それを聞くには、そこからファイルを収集する必要があります。これは音楽プログラムのドラフトのようなものです。
from music21 import stream, note, chord, instrument output_notes = [] for pattern in prediction_output: if '.' in pattern or pattern.isdigit(): # これはコードです notes_in_chord = pattern.split('.') chord_notes = [note.Note(int(n)) for n in notes_in_chord] new_chord = chord.Chord(chord_notes) output_notes.append(new_chord) else: # これは「C4」のような単音です new_note = note.Note(pattern) new_note.storedInstrument = instrument.Piano() output_notes.append(new_note)📌 説明:
線に点または数字のみが含まれている場合、それはコード(複数の音符)です。
通常の音符の場合は、
note.Note(...)を作成し、個別の音として追加します。すべての音符/コードを
output_notesに追加します。
4.音楽をファイルに保存する
次に、音楽ストリームを作成してファイルに保存します。
midi_stream = stream.Stream(output_notes) midi_stream.write('midi', fp='generated_music.mid')🎉 これで完了です!
generated_music.midファイルができました。以下で開いてください:🎼 https://musescore.org/ — 無料の楽譜エディターとプレーヤー
🧠 ブラウザでも: https://onlinesequencer.net/
再生を押して、AI作曲家が作曲したものを聴いてみよう 🤖🎵
✅ あなたがしたこと:
音楽をデータに変換
ニューラルネットワークにメロディーを続けるように教えました
最初に生成された曲を受け取りました
🧑🎼 これはもはや単なるPythonコードではありません。これはあなたのAI共同制作者です!
🎁 追加したいもの:
特定のスタイルのエッセイですか?
リズムと持続時間のサポート?
Webアプリケーションでボタンを押して音楽を生成しますか?
素敵なものができたら、Telegramで共有したり、TikTokにアップロードしてください。AIミュージシャンは今トレンドです😎
ソースコード
プロジェクトの完全なソースコードはGitHubで見つけることができます。
