배운 것을 기록해두려고 몇 달째 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로 넘어가는 전환이 정말 좋았다. 버터처럼 매끈했다. 그러다 DJing을 Wikipedia에서 찾아봤는데, 비트를 맞춰 트랙을 섞는 일이라는 식으로 설명이 나오길래 나는 그냥, 음악은 하나도 모르지만 이런 “음악”이라면 A.I.로 할 수 있겠는데? 싶었다. 이거야말로 A.I.에게 딱 좋은 일 아닌가.
x축에 time, y축에 bpm을 놓으면, 그녀의 콘서트에서 에너지가 시간에 따라 어떻게 움직이는지 곡선으로 그려볼 수 있을 것 같다. 그리고 그다음 곡을 A.I.가 골라서 크로스페이드까지 해주면 멋지지 않겠나!?
사실 관객에게서 들어오는 그 모든 소리를 MIDI로 바꾸고, 거기에 실시간 신경 오디오 합성을 얹어 공연 안으로 끌어들일 수도 있다! 물론 Spotify에는 그런 걸 하라고 이미 라이브러리가 있다.
DJ는 싫고 그냥 연주만 하고 싶어도 방법은 있다. #ideas
언젠가 손이 닿으면 이런 아이디어들을 직접 해보는 것도 엄청 재미있을 것 같다. 하지만 다음 업데이트는 아마 모델 병합과 LLM fine-tuning 이야기가 될 듯하다!
원문은 PubPub의 erniesg.pubpub.org/pub/r2map92q에 실렸다.