ここ数か月、A.I. で試していることを学習記録も兼ねて動画で上げてきた。なので今回初めて「どうやって作ったの?」と聞いてもらえたのは、本当にうれしい。😊
握りこぶしで「エアドラム」できるスクリプトを作った。マレーの打楽器で学習させた RAVE モデルから生成した音を鳴らす、短時間で区切った小さな実験だ。作れるから作った、というだけのくだらなくて妙に楽しいやつ。だから、これまでの A.I. 投稿全部を合わせたより反応がいいのがかなりうれしい。もしかして Instagram の使い方、ずっと間違えていたのかも。笑
握りこぶしでエアドラム
はじめに
ともあれ、これはあらゆる A.I. アプリのゴッドファーザー、つまり Python で書いた。Python は、人間にやさしい言語であればあるほど、依存関係の管理が人間にやさしくなくなる。この記事を追うには、Python をインストールし、pip install のやり方を知っていて、コマンドラインから Python スクリプトを実行できる必要がある。コード自体はたった115行で、いつものように ChatGPT と「ペアプロ」しながら書いた。笑
僕の環境構成とパッケージのバージョンはこんな感じ:
-
Apple M2 Max
-
Python 3.10.6 -
mediapipe 0.10.9 -
pygame 2.5.2
下の動画は、チュートリアルというより、このデモを作るときの考え方と、ロジックをどう切り分けたかの説明に近い。そこが他の技術作業にも応用しやすく、むしろ重要だったりする。必要な材料が何かを把握して、A.I. にやってほしいことを手順ごとにはっきり指示できれば、あとはコードが生成されるのを眺めていればいい。もちろん、そのコードを実行してデバッグする方法は知っておく必要がある。
チュートリアル:A.I. でエアドラム
114行のコード
注:gesture_recognizer.task と、再生したい .mp3 ファイルをスクリプトと同じディレクトリに置くか、パスを更新する必要がある。僕が使った音声ファイルは、基本的にはマレーの打楽器で学習させた RAVE モデル から生成したものだ。無料の Google Colab ノートブックを使って自分で学習させる方法のチュートリアルも作るつもりなので、しばしお待ちを!
import mediapipe as mp
import cv2
import pygame
import time
mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands
# For webcam input:
hands = mp_hands.Hands(min_detection_confidence=0.5, min_tracking_confidence=0.5)
last_sound_time = 0 # Tracks when the sound was last played
sound_cooldown = 2 # Cooldown in seconds
pygame.mixer.init()
sound = pygame.mixer.Sound('sample_out.mp3')
BaseOptions = mp.tasks.BaseOptions
GestureRecognizer = mp.tasks.vision.GestureRecognizer
GestureRecognizerOptions = mp.tasks.vision.GestureRecognizerOptions
GestureRecognizerResult = mp.tasks.vision.GestureRecognizerResult
VisionRunningMode = mp.tasks.vision.RunningMode
# Function to draw hand landmarks on the frame
def draw_hand_landmarks(frame, landmarks):
# Assuming landmarks is a list of landmarks with x, y, z coordinates normalized to the image size
for landmark in landmarks:
x = int(landmark.x * frame.shape[1])
y = int(landmark.y * frame.shape[0])
cv2.circle(frame, (x, y), 5, (0, 255, 0), -1)
# Create a gesture recognizer instance with the live stream mode:
def print_result(result: GestureRecognizerResult, output_image: mp.Image, timestamp_ms: int):
print('gesture recognition result: {}'.format(result))
handle_gesture(result)使っていなかったので numpy は削除した。それから、q を押してループを抜ける処理は動いていないように見える。僕はたいていコマンドライン側から直接スクリプトを終了している。
これは僕の GitHub リポジトリにも置いてある。できるだけ定期的にコードを投稿して共有するようにしているので、いま何を作っているか追いたい人はそちらもフォローしてもらえるとうれしい。
着想
これを作ろうと思ったきっかけは、Antoine(RAVE の作者)の仕事だった。空中で音楽を作る、というアイデアをちょっと試してみたかったのだ。;) だって、エアドラムしない理由ある!?!? 見た目がめちゃくちゃかっこいいし、Instagram の800以上のいいねも同意しているらしい!
どう作ったか
そのアイデアが浮かんでからは、基本的に hand_osc リポジトリを読みながら、時間をかけすぎずに何ができるか試せる最小構成の実装に集中した。で、一晩かけてスクロールし、ChatGPT と話し、デバッグし、指示をより具体的にしていった結果、これができた。
いちばん大きなハードルは、GPT-4 が持っている mediapipe のコード知識がかなり古かったことだ。なので結局、ちゃんとドキュメントを読み、A.I. に例を渡し、動かしながらデバッグする必要があった。上に書いたほど楽な話ではまったくない。でも僕がよく言うように、A.I. で作るのは拷問みたいに楽しい。
次にやりたいこと
何ができるかに気づいた直後、しかも Disney+ で Taylor Swift のコンサートを観ていた直後に、こう思った。A.I. と Embodme Erae II を使って、彼女の曲で DJ できたら最高では? Don’t Blame Me から Look What You Made Me Do へのつなぎが本当に好きで、あれはバターみたいに滑らかだった。それで DJ について Wikipedia で調べたら、ビートを合わせて複数のトラックを混ぜる、みたいな話が出てきたので、僕は「音楽のことは何も知らないけど、この“音楽”なら A.I. でできる」となった。これは A.I. にぴったりの仕事に見える。
x 軸に time、y 軸に bpm を置けば、彼女のコンサートにおけるエネルギーの推移を時間に沿ってプロットできるようなものだ。そこで A.I. が次の曲を選んで、クロスフェードまでしてくれたら最高じゃない!?
実際、観客から入ってくる音を全部 MIDI に変換し、それをもとにニューラル・オーディオ合成をリアルタイムで重ねて、パフォーマンスに取り込むこともできる。もちろん Spotify には、それをやるためのライブラリがすでにある。
DJ ではなく、ただ演奏したいだけなら、それはそれで方法がある。#ideas
手が回ったらこのあたりのアイデアを試すのはかなり楽しそう。ただ、次に更新するのはたぶんモデルマージと LLM のファインチューニングの話になると思う!
もともとは PubPub の erniesg.pubpub.org/pub/r2map92q で公開したものです。