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)