{}const=>[]async()letfn</>var
AIバックエンド開発

PythonのAI作曲家

ニューラルネットワークに音楽を作曲させる方法:最初のステップはデータの準備です。PythonとMLを使い始めたばかりの方にもわかりやすい説明。

К

Kodik

著者

2分で読める

🎼 PythonのAI作曲家:ゼロから音楽を作る

音楽を理解し、生成し、ファイルに保存して聴くことができるようにニューラルネットワークを学習させる方法!

音楽をかけると、メロディーが聞こえます。さて、想像してみてください。ニューラルネットワークも音楽を「聞き」、それを記憶し、そして独自の音楽を作曲します! 🤯

💡 私たちはそのようなニューラルネットワークをゼロから作成します。まず最初のステップから始めましょう。学習に適した形式で音楽を準備し、モデルをトレーニングし、最後に最初の楽曲を生成します。


🔧第1部:データの準備と基礎

1.音楽を操作するためのツールをインストールする

ターミナル(またはコマンドライン)を開き、次のように入力します。

pip install music21

📦 これはmusic21ライブラリです。音楽の翻訳者のようなものです。

  • .mid ファイルを読み込みます(音楽が含まれています)。

  • 音符とコードを引き出し、

  • 新しいメロディーを保存して作成できます。

これは、音楽をPythonとニューラルネットワークが理解できるデータに変換するためのアシスタントです。

2. 音楽を準備する

AIが作曲を学ぶには、例が必要です。子供のように、まず大人が歌うのを聞いて、それから自分で歌い始めます🎵

🎼 私たちにはMIDI-файлыが適しています。これは、どの音符をどの順序でどのくらいの時間演奏するかが書かれた「音楽の草稿」のようなものです。

🔍 どこで手に入れることができますか?

  1. サイトにアクセスしてみてください https://bitmidi.com

  2. いくつかのメロディーをダウンロードします(例:バッハまたはベートーベン)

  3. コードの横に midi_songs という名前のフォルダを作成します

  4. 拡張子が.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の「学習教材」です。


🔥 10万人以上の学生が参加中

理論を読むのに疲れた?
コーディングの時間だ!

Kodik — 実践でプログラミングを学ぶアプリ。AIメンター、インタラクティブなレッスン、実際のプロジェクト。

🤖 AI 24時間
🎓 修了証
💰 無料
🚀 始める
今日参加

🔁 パート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 ファイルができました。以下で開いてください:

    再生を押して、AI作曲家が作曲したものを聴いてみよう 🤖🎵


    ✅ あなたがしたこと:

    • 音楽をデータに変換

    • ニューラルネットワークにメロディーを続けるように教えました

    • 最初に生成された曲を受け取りました

    🧑‍🎼 これはもはや単なるPythonコードではありません。これはあなたのAI共同制作者です!

    🎁 追加したいもの:

    • 特定のスタイルのエッセイですか?

    • リズムと持続時間のサポート?

    • Webアプリケーションでボタンを押して音楽を生成しますか?

    素敵なものができたら、Telegramで共有したり、TikTokにアップロードしてください。AIミュージシャンは今トレンドです😎

ソースコード

プロジェクトの完全なソースコードはGitHubで見つけることができます。

https://github.com/Coursme/ai-composer-python

🎯先延ばしをやめよう

記事は気に入った?
実践の時間だ!

Kodikでは読むだけでなく、すぐにコードを書く。理論 + 実践 = 本当のスキル。

即座に実践
🧠AIがコードを説明
🏆修了証

登録不要 • カード不要