【Python×AI】顔色ひとつで音楽生成?「Mood SYNC」で感情直結型サウンドスケープを作ろう

顔認識で音楽生成!PythonとAIで作るMood SYNC実装ガイド 生成AIクリエイティブ
【Python×AI】顔色ひとつで音楽生成?「Mood SYNC」で感情直結型サウンドスケープを作ろう

「今の気分に合った曲を聴きたい」——そう思ってプレイリストを探しても、しっくりくる曲が見つからない。そんな経験はありませんか?

AIハック術師・ハヤトです。

今回は、既存の曲を選ぶのではなく、あなたの表情(感情)に合わせて、AIがその場で音楽を「作曲」してくれる画期的なプロジェクトを紹介します。

GitHubで公開されている「Mood SYNC」は、単なるリコメンドシステムではありません。カメラが捉えたあなたの「顔」をCNN(畳み込みニューラルネットワーク)が分析し、その感情データを元にLSTM(長短期記憶)モデルがMIDI音源をリアルタイム生成する——まさに「感情直結型サウンドスケープ」の実装例です。

結論から言うと、この技術を応用すれば、「ユーザーのテンションに合わせてBGMが変わるゲーム」「表情で演奏するインタラクティブアート」が、個人のPCレベルで作れてしまいます。

この記事では、Mood SYNCの仕組みを解剖し、Pythonを使って実際に感情反応型AI音楽システムを構築するための「最短ルート」を解説します。

MOOD SYNCとは?:顔と音をつなぐAIの仕組み

PranaliSawant1211氏らがGitHubで公開したこのプロジェクトは、2つの異なるAIモデルを結合させることで、マルチモーダルな体験を生み出しています。

機能 使用技術 (モデル) 役割
視覚(入力) CNN (Convolutional Neural Network) Webカメラの映像から顔を検出し、7つの感情(Happy, Sad, Angry, Neutralなど)に分類する。
聴覚(出力) LSTM (Long Short-Term Memory) 検出された感情ラベルを「種(Seed)」として、それにマッチする旋律(MIDIデータ)を時系列生成する。

なぜ「Suno」や「Udio」ではなく、これなのか?

現在、Suno AIのようなテキストから完パケ楽曲を作るサービスが流行していますが、Mood SYNCのアプローチは「インタラクティブ性(双方向性)」にあります。

  • リアルタイム性: 生成に数分待つのではなく、カメラの前で笑えば即座に明るいメロディに変化する(実装次第で可能)。
  • MIDI制御: 音声波形ではなくMIDIデータ(楽譜情報)を生成するため、音色(楽器)を自由に変えたり、DAW(音楽制作ソフト)に流し込んで再編集したりできます。
  • ローカル動作: 巨大なクラウドGPUを必要とせず、一般的なPC環境で動作可能です。

技術解剖:感情を「音」に変換するプロセス

このシステムがどのように動いているのか、エンジニア視点で深掘りします。

1. 視覚野:OpenCVとCNNによる感情抽出

まず、OpenCVを使ってWebカメラのフィードから顔領域を切り抜きます。切り抜かれた画像はグレースケール化され、事前に学習されたCNNモデル(多くの場合、FER-2013データセットなどで学習済み)に入力されます。

モデルは確率ベクトルを出力します。例えば {Happy: 0.8, Neutral: 0.15, ...} といった具合です。ここで最も高い確率を持つ感情が「現在のムード」として決定されます。

2. 聴覚野:LSTMによるシーケンス生成

ここがこのプロジェクトの肝です。LSTMは「以前の文脈を覚えておく」ことが得意なニューラルネットワークで、文章生成や翻訳だけでなく、音楽生成にも適しています。

通常、音楽生成AIは「ド・レ・ミ」と来たら次は「ファ」が来る確率が高い、というように学習します。Mood SYNCでは、「Happyな曲のデータセット」で学習した重み「Sadな曲のデータセット」で学習した重みを使い分ける(あるいは条件付けする)ことで、感情に応じた作曲を行っています。

実践ガイド:やってみよう

では、実際にこのコンセプトをPythonで再現するためのステップを解説します。今回は、複雑なGUIアプリ全体ではなく、「カメラで感情を読み取り、それに対応する処理を行う」コア部分の実装にフォーカスします。

ステップ1:環境構築

必要なライブラリをインストールします。Python 3.8〜3.10環境を推奨します。

pip install opencv-python tensorflow keras numpy music21

ステップ2:学習済みモデルの準備

本来はデータセットから学習させる必要がありますが、手っ取り早く動かすために、公開されている学習済みモデル(.h5ファイル)を探してくるか、以下のような簡易的なCNN構築コードを使用します。ここでは推論部分のロジックを示します。

ステップ3:感情検出と音楽トリガーの実装コード

以下のコードは、Webカメラを起動し、表情を検出し、その結果に基づいて「音楽生成関数」を呼び出すスケルトン(骨組み)です。

import cv2
import numpy as np
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing.image import img_to_array

# 1. モデルとカスケード分類器のロード
# ※事前に学習済みの emotion_model.h5 を用意してください
# GitHub等で "FER2013 Keras model" と検索すると入手可能です
try:
    face_classifier = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    emotion_model = load_model('emotion_model.h5') # パスは適宜変更
    class_labels = ['Angry', 'Disgust', 'Fear', 'Happy', 'Neutral', 'Sad', 'Surprise']
except Exception as e:
    print(f"モデルのロードに失敗しました: {e}")
    exit()

# 2. 音楽生成のダミー関数(ここをLSTM生成ロジックに置き換える)
def trigger_music_generation(emotion):
    print(f">>> Generating music for mood: {emotion} <<<")
    # ここに music21 や mido を使ったMIDI生成/再生コードが入る
    # 例: if emotion == 'Happy': play_major_scale()

# 3. メインループ
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        break
        
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = face_classifier.detectMultiScale(gray, 1.3, 5)

    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
        
        # 顔領域の切り出しと前処理
        roi_gray = gray[y:y+h, x:x+w]
        roi_gray = cv2.resize(roi_gray, (48, 48), interpolation=cv2.INTER_AREA)

        if np.sum([roi_gray]) != 0:
            roi = roi_gray.astype('float') / 255.0
            roi = img_to_array(roi)
            roi = np.expand_dims(roi, axis=0)

            # 推論実行
            prediction = emotion_model.predict(roi)[0]
            label = class_labels[prediction.argmax()]
            
            # 画面表示
            label_position = (x, y - 10)
            cv2.putText(frame, label, label_position, cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
            
            # 感情が検出されたら音楽生成トリガーを引く
            # (連続再生を防ぐためのタイマー処理などが本来は必要)
            trigger_music_generation(label)

    cv2.imshow('Mood SYNC Demo', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

ステップ4:音楽生成(LSTM)の考え方

上記の `trigger_music_generation` の中身ですが、本格的にやるなら Music21 ライブラリを使います。

例えば、「Happy」ならメジャーコード(C, F, G)を中心に、BPM(テンポ)を120以上に設定したMIDIストリームを生成します。「Sad」ならマイナーコード(Am, Dm, Em)でBPMを80以下に落とします。

AIハック術師のTips:
完全にゼロからLSTMで曲を作るのは学習コストが高いです。まずは「感情ごとのコード進行テンプレート」を用意し、メロディラインだけをランダムウォークやマルコフ連鎖で生成する簡易実装から始めると、挫折せずに「動くもの」が作れます。

応用:この技術をどうマネタイズ・活用するか

この技術は、単なる「面白ツール」で終わりません。以下のようなビジネス/クリエイティブ用途が考えられます。

  • 店舗BGMシステム: 来店客の表情(平均的なムード)を読み取り、店内の音楽のテンポや雰囲気を自動調整する。
  • インタラクティブWeb広告: ユーザーがカメラを許可すると、その人の表情に合わせたジングルが流れるランディングページ。
  • メンタルヘルスケアアプリ: 「落ち込んでいる」と判定された時に、徐々にテンションを上げるような「誘導音楽」を生成するバイオフィードバック療法。
  • VTuber/配信者向けツール: ゲーム実況中、配信者のピンチや歓喜の表情に合わせてBGMが勝手に盛り上がるプラグイン。

まとめ:感情は最大の入力インターフェースになる

キーボードやマウスで指示を出す時代から、AIが私たちの「状態」を察して先回りしてコンテンツを提供する時代へ。Mood SYNCのようなプロジェクトは、その先駆けです。

「顔で作曲する」という体験は、クリエイティブの敷居を劇的に下げます。ぜひ、上記のコードをベースに、あなただけの「感情シンクロAI」を作ってみてください。

コメント

タイトルとURLをコピーしました