AI Lazy DJ: Включете се в движение със Spotify, управляван с жестове!

Използване на Python с MediaPipe и Spotipy за управление на възпроизвеждането на вашата музика

Мотивация

Да си софтуерен инженер е една от най-добрите професии на този свят — защото можеш да решаваш технически проблеми, докато слушаш любимата си музика. Къде другаде можете да сложите вашите шумопотискащи слушалки и да слушате невероятни мелодии, докато пишете чист код и изграждате страхотни продукти?
Едно предизвикателство обаче остава – в свят, в който технологията и мързелът се сблъскват, безпроблемното управление на музиката все още е нещо.
Да! Болката е истинска. Намиране на раздела на браузъра или отваряне на настолното приложение и щракване върху Напред. Кой иска да направи това?
Не искам да се разсейвам от ценния си код.

И затова реших да се справя с това предизвикателство, представете си следното:
Напишете своя код и покажете кратък палец надолу, махайки във въздуха, и любимата ви музика от Spotify се контролира и преминава към следващата песен.

Благодарение на силата на изкуствения интелект и малко интеграция на API на трета страна, вашето музикално изживяване може да достигне съвсем ново ниво.
Пригответе се да се потопите в невероятното царство на Lazy DJ!

Къде да започна? Концепцията.

AI е на мода напоследък и не е чудно защо! Но забравете за момент сложните алгоритми и умопомрачителните невронни мрежи. Нашият AI Lazy DJ скрипт не се нуждае от преоткриване на колелото. Нека използваме това, което вече е там. Използвайки най-съвременните алгоритми за разпознаване на жестове, той трябва да класифицира вашите жестове с ръце в прости имена на жестове. И тогава ние ще ги използваме и ще ги картографираме, за да спотифицираме API заявките.

Започвайки с AI

Този път ще използваме Python, защото светът на AI се спря на него. За наш късмет има библиотеката 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!

Сега, когато имаме разпознавател на жестове, трябва да добавим API на spotify.
За наш късмет — има библиотека на 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()
    # ...

Когато използвате API на Spotify, трябва да се удостоверите, като използвате клиентски идентификатор и клиентска тайна. Можете да получите и двете, като регистрирате приложение в портала за разработчици на Spotify.

Добавяне на таймер за по-гладко управление и използване на библиотеката spotipy — можем да му кажем да премине към следващата песен, ако покажем жест „Thumbs_Down“.

Това е! Пригответе се и се насладете на управлението на вашата музика с помощта на AI.
Да - можете да се наречете AI Lazy DJсега!
Сега започва истинското забавление - какво ще правите с това ?
Ето някои идеи, които могат да бъдат забавни за изпълнение:

  • Палец нагоре— запишете текущо възпроизвежданата песен към вашите любими
  • Победа — Повторете текущата песен
  • Насочване нагоре— Върнете се назад във вашето възпроизвеждане

и съм сигурен, че ще измислите още много.
Ще се радвам да чуя вашите идеи в коментарите!

Резюме

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

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