这几个月我一直在发自己折腾 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 给她的歌打碟一定会很酷。我真的很喜欢 Don’t Blame Me 转到 Look What You Made Me Do 的那段,顺得像抹了黄油一样;然后我去 Wikipedia 查了查打碟,看到它开始讲什么通过对齐节拍把曲目混在一起,我就:我对音乐一无所知,但这种“音乐”我可以用 A.I. 做。听起来就是一份非常适合交给 A.I. 的工作。
如果把 time 放在 x 轴、bpm 放在 y 轴,就好像可以把她演唱会里能量随时间演化的曲线画出来;然后让 A.I. 帮你挑下一首歌,再平滑地混进去,岂不是很酷!?
事实上,我们还可以把观众那边输入的所有声音转成 midi,再在上面实时做神经音频合成,把它并入演出!当然,Spotify 已经有现成的库可以处理这件事。
如果你不想 DJ,只想玩,也有办法。#ideas
等我有空真的去试这些想法,应该会很好玩;不过我预计下一篇会先更新模型合并和 LLM 微调!
最初发布于 PubPub:erniesg.pubpub.org/pub/r2map92q。