[PYTHON] Un simple lecteur de musique interactif fait avec Chuck et OpenPose

C'est le 18e jour du Calendrier de l'Avent ABEJA 2019.

introduction

C'est imais qui a rejoint ABEJA en octobre de cette année. Dans mon travail quotidien, l'équipe de développement ABEJA Insight for Retail est en charge de développer une analyse des lignes de flux qui analyse le mouvement des clients dans le magasin. ..

Dans cet article, OpenPose, qui estime la posture à partir d'images bidimensionnelles, et [ChucK](https: // chuck), qui est un langage de programmation pour la musique, Présentation de l'aperçu du système et du contenu de développement d'un simple lecteur de musique interactif créé en combinant .cs.princeton.edu /).

Présentation du système

** "Lorsqu'un humain applaudit, les morceaux de musique sont ajoutés un par un" ** Construisez le système suivant sur MacBook Pro.

image.png

Le système fonctionne selon les étapes suivantes.

  1. L'application de contrôle utilise les informations de posture humaine estimées par OpenPose pour vérifier si une pose spécifique (applaudissements dans ce cas) a été prise.
  2. Une fois cette pose prise, l'application de contrôle envoie des commandes supplémentaires pour la piste musicale à l'application Chuck.
  3. L'application Chuck ajoute des morceaux de musique pré-préparés un par un.
  4. La piste musicale ajoutée est lue sur l'enceinte via jack, qui contrôle la connexion audio.

Construire un environnement de développement

Environnement de développement OpenPose

Cette fois, j'ai décidé de développer une application de contrôle en modifiant tf-pose-estimation, qui est la version TensorFlow de l'implémentation de l'application OpenPose par M. ildoonet. Fait.

Suivez le tutoriel de mdo4nt6n [TensorFlow version] OpenPose (compatible avec osx Mojave) sur MacBook pour construire l'environnement d'exploitation pour tf-pose-estimation.

Seul TensorFlow ne fonctionnait pas bien lorsque la dernière version a été installée, donc cette fois j'ai installé l'ancienne version comme suit.

$ pip install tensorflow=1.14

Comme vous pouvez le voir dans l'article du didacticiel ci-dessus, utilisez la commande suivante pour vérifier que l'estimation de la posture d'OpenPose fonctionne en temps réel sur la caméra intégrée du MacBook.

$ python run_webcam.py --model=mobilenet_thin --resize=432x368 --camera=0

Environnement de développement ChucK

ChucK

Téléchargez le programme d'installation pour Mac OS X à partir de ChucK et installez la dernière version v1.4.0.

Jack Installez le package fourni par Homebrew avec la commande suivante.

$ brew install jack

Contrôle de fonctionnement

Commencez par démarrer Jack sur un terminal comme suit.

$ jackd -d coreaudio

Après avoir confirmé que Jack a démarré, sur un autre terminal, à partir des exemples inclus dans code source ChucK , Sélectionnez un fichier et lisez la musique.

$ chuck examples/rhodey.ck

Si la musique joue, vous avez du succès!

Application de contrôle

Dans run_webcam.py, qui est une application de démonstration pour estimer la posture de la caméra intégrée de MacBook incluse dans tf-pose-estimation. Ajoutez le code suivant.

if 0 < len(humans) and hand_clapped(humans[0]) and \
    HAND_CLAPPING_MASK_DURATION_SEC < (time.time() - time_hand_clapped):
    time_hand_clapped = time.time()
    osc.send_message('/sndbuf/beats', [1])

Ce que vous faites est simple: si plus d'une personne est détectée, vérifiez avec hand_clapped pour voir si la première personne applaudit, et si des applaudissements sont détectés, commandez ChucK (contrôlez simplement le timing) Donc j'envoie juste le numéro 1). ChucK prend en charge l'envoi et la réception de données via Open Sound Control (OSC), qui ci-dessus envoie des commandes via le canal / sndbuf / beats de l'OSC.

Pour éviter que les commandes ne soient envoyées de manière trop continue, une fois les commandes envoyées, les commandes ne sont pas envoyées même si des applaudissements sont détectés pendant seulement HAND_CLAPPING_MASK_DURATION_SEC secondes.

Le «hand_clapped» qui détecte les applaudissements est le suivant.

def hand_clapped(human):
    parts = [part for idx, part in human.body_parts.items() if part.score > THRESHOLD_PART_CONFIDENCE]

    is_rwrist, part_rwrist = include_part(parts, RWrist)
    is_lwrist, part_lwrist = include_part(parts, LWrist)

    if is_rwrist and is_lwrist:
        dist = math.sqrt((part_rwrist.x - part_lwrist.x)**2 + (part_rwrist.y - part_lwrist.y)**2)
        if dist < THRESHOLD_HAND_CLAPPING_DISTANCE:
            return True

    return False

C'est aussi très simple, il calcule la distance entre le poignet droit (part_rwrist) et le poignet gauche ( part_lwrist), et s'il est inférieur au seuil THRESHOLD_HAND_CLAPPING_DISTANCE, il le détecte comme un applaudissement. Donc, en réalité, tout ce que vous avez à faire est de rapprocher vos mains droite et gauche, mais tapoter dans vos mains se sent mieux et se sent mieux ☺️.

C'est le seul côté application de contrôle!

Application ChucK

ChucK vous permet de programmer de la musique dans un style de langage procédural comme C. Le code ci-dessous ajoute les morceaux de musique précédemment stockés en «battements» à chaque fois qu'un message est reçu. Au fait, lorsque j'ai fini d'ajouter toutes les pistes, j'essaie d'arrêter les pistes de musique une par une dans l'ordre inverse de l'ajout.

while (true) {
    // wait for event to arrive
    oe => now;

    // grab the next message from the queue.
    float msg;
    while (oe.nextMsg() != 0) {
        oe.getInt() => msg;
        <<< "Beats received: ", msg >>>;
        if (msg != 0) {
            if (flag == 1) {
                Machine.add(beats[i]) => beat_refs[i];
                if (i == 6) {
                    0 => flag;
                } else {
                    i + 1 => i;
                }
            } else {
                Machine.remove(beat_refs[i]);
                if (i == 0) {
                    1 => flag;
                } else {
                    i - 1 => i;
                }
            }
        }
    }
}

Échantillon de la musique finie

C'est embarrassant de télécharger une vidéo de la pose réelle, donc je vais coller une vidéo de démonstration du terminal où différents programmes sont en cours d'exécution et la musique terminée. En fait, un morceau de musique a été ajouté pour correspondre aux applaudissements: sueur:.

À propos, la piste musicale utilisée dans la vidéo est incluse dans les exemples de ChucK. [image.png] (https://player.vimeo.com/video/380290288)

Résumé

En combinant Chuck et OpenPose, j'ai créé un simple lecteur de musique interactif qui peut contrôler la synchronisation de lecture des morceaux de musique. Cette fois, c'est un système simple qui ajoute simplement de la musique en applaudissant des mains, mais le système réellement terminé est assez agréable et amusant. La prochaine fois, j'aimerais ajouter de l'animation, etc. pour améliorer l'interactivité!

Recommended Posts

Un simple lecteur de musique interactif fait avec Chuck et OpenPose
J'ai fait un circuit simple avec Python (AND, OR, NOR, etc.)
J'ai fait un simple blackjack avec Python
J'ai fait un simple portefeuille de Bitcoin avec pycoin
Essayez de créer un site Web simple avec responder et sqlite3
Créez un Slackbot simple avec un bouton interactif en python
Essayez de créer un jeu simple avec Python 3 et iPhone
J'ai essayé de faire LINE BOT avec Python et Heroku
J'ai fait un jeu de frappe simple avec tkinter de Python
J'ai créé une application de livre simple avec python + Flask ~ Introduction ~
J'ai créé une caméra réseau simple en combinant ESP32-CAM et RTSP.
Créez un simple OMR (lecteur de feuille de marque) avec Python et OpenCV
J'ai créé un formulaire de tweet Nyanko avec Python, Flask et Heroku
[Python] J'ai créé une visionneuse d'images avec une fonction de tri simple.
J'ai créé un chat chat bot avec Tensor2Tensor et cette fois cela a fonctionné
Visualisation interactive avec ipywidgets et Bokeh
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
J'ai créé un robot musical en utilisant discord.py et l'API Google Drive (testé avec Docker → déployé sur Heroku)
Créez un convertisseur Ethernet LAN sans fil et un routeur simple avec Raspberry Pi
Créez DNN-CRF avec Chainer et reconnaissez la progression des accords de la musique
Construisez un environnement de simulateur de drone et essayez un vol simple avec Mission Planner
Créer un fichier power simple avec Python
Créer un lecteur vidéo avec PySimpleGUI + OpenCV
Client API Slack simple réalisé avec Python
J'ai fait un compteur de caractères avec Python
Un mémo contenant Python2.7 et Python3 dans CentOS
Faisons un langage simple avec PLY 1
Créez une application Web simple avec Flask
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu de vie avec Numpy
J'ai fait un générateur Hanko avec GAN
Implémenter un modèle avec état et comportement
J'ai fait un jeu rogue-like avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait une application WEB avec Django
J'ai fait un simulateur de neurones avec Python
Mettez Docker dans Windows Home et exécutez un serveur Web simple avec Python
Créons un système de réception simple avec le framework sans serveur Python Chalice et Twilio
Je veux créer un lecteur de musique et enregistrer de la musique en même temps
Créez une application flask faite avec tensorflow et dlib pour travailler sur centos7
[Pour les débutants] J'ai fait un capteur humain avec Raspberry Pi et notifié LINE!
J'ai essayé de créer une API de reconnaissance d'image simple avec Fast API et Tensorflow