Logo Ernie.SG

教程:用 A.I. 空气打鼓

2024年3月19日
2 分钟阅读
暂无标签
Table of Contents

过去几个月里,我一直在发布关于自己探索 A.I. 的视频,把它当作记录学习的方式,所以第一次有人好奇地问我是怎么做出来的,真的很开心!😊

我写了一个脚本,用握拳来“空气打鼓”,播放的是我用马来鼓训练过的 RAVE 模型生成的声音。这只是一个限时小实验,有点像那种“只是因为可以所以就做出来”的傻玩意,所以我很高兴大家喜欢它,甚至超过我之前所有关于 A.I. 的帖子加起来。也许我一直都用错 Instagram 了,lol。

握拳空气打鼓

开始

总之,这是用所有 A.I. 应用的教父 Python 写的。说到 Python,依赖管理和这门语言的人类友好程度成反比。你需要安装 Python,知道如何 pip install,并能从命令行运行 Python 脚本,才能跟上这个教程。代码本身只有 115 行,是我像往常一样和 ChatGPT “结对编程”写出来的,lol。

这是我的系统配置和软件包版本:

  • Apple M2 Max

  • Python 3.10.6

  • mediapipe 0.10.9

  • pygame 2.5.2

下面的视频与其说是教程,不如说是在解释 demo 背后的思考过程和逻辑拆解。反正这些东西对迁移到其他技术任务更有价值也更重要。如果你知道自己需要准备哪些材料,并能清楚地一步一步指示 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 的过渡,它顺滑得像黄油。当我在维基百科上查打碟,看到它说 DJ 是通过对齐节拍把不同曲目融合在一起时,我就想:我对音乐一窍不通,但这种“音乐”我可以用 A.I. 做。这听起来像是一个非常适合 A.I. 的工作。

如果把 time 放在 x 轴、bpm 放在 y 轴,就好像可以画出她演唱会中能量随时间的演化。让 A.I. 为你选择下一首歌并交叉淡入,难道不酷吗!?

事实上,我们可以把观众席的所有声音输入转成 MIDI,并在其上实时进行神经音频合成,把它纳入一场演出!当然,Spotify 已经有一个库可以让你这么做。

如果你不想当 DJ,只想演奏,也有办法。#ideas

等我有时间试这些想法应该会非常有趣,但我预计接下来会更新模型合并和 LLM 微调!


最初发表于 PubPub:erniesg.pubpub.org/pub/r2map92q