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


コメント