AI Lazy DJ: начните играть с помощью Spotify, управляемого жестами!

Использование Python с MediaPipe и Spotipy для управления воспроизведением музыки

Мотивация

Быть инженером-программистом — одна из лучших профессий в этом мире, потому что вы решаете технические проблемы, слушая любимую музыку. Где еще вы можете надеть наушники с шумоподавлением и слушать потрясающие мелодии, одновременно создавая чистый код и создавая отличные продукты?
Однако остается одна проблема: в мире, где сталкиваются технологии и лень, легкое управление музыкой по-прежнему остается проблемой. вещь.
Да! Боль реальна. Найдите вкладку браузера или откройте настольное приложение и нажмите «Далее». Кто хочет это сделать?
Я не хочу отвлекаться от своего драгоценного кода.

И поэтому я решил взяться за эту задачу, представьте себе это:
Пишите свой код и показываете короткий большой палец, машущий по воздуху, и ваша любимая музыка Spotify управляется и переходит к следующему треку.

Благодаря мощи искусственного интеллекта и небольшой интеграции стороннего API ваши музыкальные впечатления могут выйти на совершенно новый уровень.
Приготовьтесь погрузиться в удивительное царство Ленивого ди-джея!

Когда начать? Концепт.

В последнее время ИИ был в моде, и неудивительно, почему! Но забудьте на мгновение о сложных алгоритмах и умопомрачительных нейронных сетях. Наш сценарий AI Lazy DJ не нужно изобретать велосипед. Давайте использовать то, что уже есть. Используя самые современные алгоритмы распознавания жестов, он должен классифицировать ваши жесты руками по простым именам жестов. А затем мы воспользуемся ими и сопоставим их с запросами API Spotify.

Начиная с ИИ

На этот раз мы будем использовать Python, потому что мир ИИ выбрал его. К счастью для нас, есть библиотека mediapipe. Библиотека делает машинное обучение на устройстве доступным для всех и поставляется со встроенными решениями для распознавания жестов.
Запуск этого кода Python приведет к прямой видеотрансляции с вашей веб-камеры, которая распознает ваши жесты рук:

# main.py

import cv2
import mediapipe as mp
from mediapipe.tasks import python

class GestureRecognizer:

    def main(self):
        num_hands = 1
        model_path = "gesture_recognizer.task"
        GestureRecognizer = mp.tasks.vision.GestureRecognizer
        GestureRecognizerOptions = mp.tasks.vision.GestureRecognizerOptions
        VisionRunningMode = mp.tasks.vision.RunningMode

        self.lock = threading.Lock()
        self.current_gestures = []
        options = GestureRecognizerOptions(
            base_options=python.BaseOptions(model_asset_path=model_path),
            running_mode=VisionRunningMode.LIVE_STREAM,
            num_hands = num_hands,
            result_callback=self.__result_callback)
        recognizer = GestureRecognizer.create_from_options(options)

        timestamp = 0 
        mp_drawing = mp.solutions.drawing_utils
        mp_hands = mp.solutions.hands
        hands = mp_hands.Hands(
                static_image_mode=False,
                max_num_hands=num_hands,
                min_detection_confidence=0.65,
                min_tracking_confidence=0.65)

        cap = cv2.VideoCapture(0)

        while True:
            ret, frame = cap.read()
            if not ret:
                break
            
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            results = hands.process(frame)
            frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
            np_array = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            
            if results.multi_hand_landmarks:
                for hand_landmarks in results.multi_hand_landmarks:
                    mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)
                    mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=np_array)
                    recognizer.recognize_async(mp_image, timestamp)
                    timestamp = timestamp + 1 # should be monotonically increasing, because in LIVE_STREAM mode
                    
                self.put_gestures(frame)

            cv2.imshow('MediaPipe Hands', frame)
            if cv2.waitKey(1) & 0xFF == 27:
                break

        cap.release()

    def put_gestures(self, frame):
        self.lock.acquire()
        gestures = self.current_gestures
        self.lock.release()
        y_pos = 50
        for hand_gesture_name in gestures:
            # show the prediction on the frame
            cv2.putText(frame, hand_gesture_name, (10, y_pos), cv2.FONT_HERSHEY_SIMPLEX, 
                                1, (0,0,255), 2, cv2.LINE_AA)
            y_pos += 50

    def __result_callback(self, result, output_image, timestamp_ms):       
        self.lock.acquire() 
        self.current_gestures = []
        if result is not None and any(result.gestures):
            for single_hand_gesture_data in result.gestures:
                gesture_name = single_hand_gesture_data[0].category_name
                if(gesture_name == "Thumb_Down"):
                   # Do Something with Thumb Down Gesture
                   # ...
                self.current_gestures.append(gesture_name)
        self.lock.release()

if __name__ == "__main__":
    rec = GestureRecognizer()
    rec.main()

Переходим к Spotify!

Теперь, когда у нас есть распознаватель жестов, нам нужно добавить Spotify API.
К счастью для нас, для него есть библиотека Python: spotipy.
Она предоставляет все необходимые функции, которые нам нужны.
/> Ниже приведен фрагмент сценария:

# ...
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
from threading import Timer
from threading import Thread



# Set data client, redirect URL and username
SPOTIPY_CLIENT_ID = 'YOUR_CLIENT_ID'
SPOTIPY_CLIENT_SECRET  = 'YOUR_CLIENT_SECRET'
redirect_uri = 'http://localhost:8080'
scope = 'user-modify-playback-state'

sp = None
t = None
shouldNext = True

class SpotifyApi:
    def connect(self):
        auth_manager = SpotifyClientCredentials( client_id=SPOTIPY_CLIENT_ID, client_secret=SPOTIPY_CLIENT_SECRET)
        global sp 
        sp  = spotipy.Spotify(auth_manager=spotipy.SpotifyOAuth(scope=scope, client_id=SPOTIPY_CLIENT_ID, client_secret=SPOTIPY_CLIENT_SECRET, redirect_uri=redirect_uri))

def spotify_next():
        global sp
        global t
        global shouldNext 
        if sp != None and shouldNext == False:
            shouldNext = True
            sp.next_track()
            try:
                t.cancel()
                t = None
            except(AttributeError):
                pass

    def __result_callback(self, result, output_image, timestamp_ms):
                # ...
                if(gesture_name == "Thumb_Down"):
                    global t
                    global shouldNext
                 
                    if shouldNext == True: 
                        shouldNext = False
                        if t == None:
                            t = Timer(2.5, spotify_next)
                            t.start()

                # ...

if __name__ == "__main__":
    api = SpotifyApi()
    api.connect()
    # ...

При использовании Spotify API вам необходимо аутентифицировать себя, используя идентификатор клиента и секрет клиента. Вы можете получить и то, и другое, зарегистрировав приложение на портале разработчиков Spotify.

Добавление таймера для более плавного управления и использование библиотеки Spotipy — мы можем указать ему перейти к следующей песне, если покажем жест «Thumbs_Down».

Вот и все! Приготовьтесь и наслаждайтесь управлением своей музыкой с помощью ИИ.
Да, теперь вы можете называть себя AI Lazy DJ!
Теперь начинается самое интересное — что вы собираетесь с этим делать? ?
Вот несколько идей, которые было бы интересно реализовать:

  • Мне нравится: сохранить текущую воспроизводимую дорожку в избранное.
  • Победа — Повтор текущего трека
  • Указывая вверх — вернуться назад при воспроизведении.

и я уверен, что вы придумаете еще много.
Буду рад услышать ваши идеи в комментариях!

Краткое содержание

Примите великолепное сочетание лени, искусственного интеллекта и чистого удовольствия от веселья. С помощью скрипта AI Lazy DJ Python управление Spotify с помощью жестов рук становится реальностью, обеспечивая увлекательное и легкое прослушивание музыки.

Код проекта можно найти здесь:
dminkovski/ailazydj: AI Lazy DJ (github.com)