[PYTHON] Ein einfacher interaktiver Musikplayer mit Chuck und OpenPose

Es ist der 18. Tag von ABEJA Adventskalender 2019.

Einführung

Dies sind Imais, die im Oktober dieses Jahres zu ABEJA gekommen sind. In meiner täglichen Arbeit ist das Entwicklungsteam von ABEJA Insight for Retail für die Entwicklung einer Flusslinienanalyse verantwortlich, die die Bewegung der Kunden im Geschäft analysiert. ..

In diesem Artikel OpenPose, der die Haltung aus zweidimensionalen Bildern schätzt, und [ChucK](https: // chuck), eine Programmiersprache für Musik, Einführung in die Systemübersicht und den Entwicklungsinhalt eines einfachen interaktiven Musik-Players, der durch Kombinieren von .cs.princeton.edu /) erstellt wurde.

Systemübersicht

** "Wenn ein Mensch klatscht, werden Musiktitel einzeln hinzugefügt" ** Erstellen Sie das folgende System auf dem MacBook Pro.

image.png

Das System arbeitet in den folgenden Schritten.

  1. Die Kontrollanwendung verwendet die von OpenPose geschätzten Informationen zur menschlichen Körperhaltung, um zu überprüfen, ob eine bestimmte Pose (in diesem Fall Klatschen) eingenommen wurde.
  2. Sobald diese Pose eingenommen ist, sendet die Steueranwendung zusätzliche Befehle für den Musiktitel an die Chuck-Anwendung.
  3. Die Chuck-Anwendung fügt nacheinander vorbereitete Musiktitel hinzu.
  4. Der hinzugefügte Musiktitel wird über jack auf dem Lautsprecher abgespielt, wodurch die Audioverbindung gesteuert wird.

Aufbau einer Entwicklungsumgebung

OpenPose-Entwicklungsumgebung

Dieses Mal haben wir beschlossen, tf-Pose-Schätzung, die TensorFlow-Version der OpenPose-Anwendungsimplementierung von Mr. ildoonet, zu ändern, um eine Steuerungsanwendung zu entwickeln. Hat.

Folgen Sie dem Tutorial von mdo4nt6n [TensorFlow-Version] OpenPose (kompatibel mit osx Mojave) auf dem MacBook, um die Betriebsumgebung für die tf-Pose-Schätzung zu erstellen.

Nur TensorFlow funktionierte nicht, als die neueste Version installiert wurde, daher habe ich diesmal die alte Version wie folgt installiert.

$ pip install tensorflow=1.14

Wie Sie im obigen Tutorial-Artikel sehen können, verwenden Sie den folgenden Befehl, um zu überprüfen, ob die Positionsschätzung von OpenPose auf der in das MacBook integrierten Kamera in Echtzeit funktioniert.

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

ChucK Entwicklungsumgebung

ChucK

Laden Sie das Installationsprogramm für Mac OS X von ChucK herunter und installieren Sie die neueste Version, v1.4.0.

Jack Installieren Sie das von Homebrew bereitgestellte Paket mit dem folgenden Befehl.

$ brew install jack

Funktionsprüfung

Starten Sie Jack zunächst wie folgt an einem Terminal.

$ jackd -d coreaudio

Nachdem bestätigt wurde, dass Jack auf einem anderen Terminal anhand der in [ChucK-Quellcode] enthaltenen Beispiele gestartet wurde (https://chuck.cs.princeton.edu/release/files/chuck-1.4.0.0.tgz) Wählen Sie eine Datei aus und spielen Sie die Musik ab.

$ chuck examples/rhodey.ck

Wenn die Musik spielt, sind Sie erfolgreich!

Steueranwendung

In run_webcam.py handelt es sich um eine Demo-App zum Schätzen der Haltung der in die tf-Pose-Schätzung enthaltenen integrierten Kamera des MacBook. Fügen Sie den folgenden Code hinzu.

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])

Was Sie tun, ist einfach: Wenn mehr als eine Person erkannt wird, überprüfen Sie, ob die erste Person mit "hand_clapped" klatscht, und wenn das Klatschen erkannt wird, befehlen Sie ChucK (steuern Sie einfach das Timing). Also sende ich nur die Nummer 1). ChucK unterstützt das Senden und Empfangen von Daten über Open Sound Control (OSC), das oben Befehle über den OSC-Kanal / sndbuf / beats sendet.

Um zu verhindern, dass die Befehle zu kontinuierlich gesendet werden, werden die Befehle nach dem Senden der Befehle nicht gesendet, selbst wenn das Klatschen nur für "HAND_CLAPPING_MASK_DURATION_SEC" Sekunden erkannt wird.

Das hand_clapped, das das Klatschen erkennt, ist wie folgt.

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

Dies ist auch sehr einfach, es berechnet den Abstand zwischen dem rechten Handgelenk (part_rwrist) und dem linken Handgelenk ( part_lwrist) und wenn es unter dem Schwellenwert THRESHOLD_HAND_CLAPPING_DISTANCE liegt, erkennt es es als Klatschen. In Wirklichkeit müssen Sie also nur Ihre rechte und linke Hand näher zusammenbringen, aber das Klatschen in die Hände fühlt sich besser an und fühlt sich besser an ☺️.

Dies ist die einzige Steuerungsanwendungsseite!

ChucK-Anwendung

Mit ChucK können Sie Musik in einem prozeduralen Sprachstil wie C programmieren. Der folgende Code fügt die Musiktitel hinzu, die zuvor bei jedem Empfang einer Nachricht in "Beats" gespeichert wurden. Übrigens, wenn ich alle Titel hinzugefügt habe, versuche ich, die Musiktitel nacheinander in umgekehrter Reihenfolge anzuhalten.

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;
                }
            }
        }
    }
}

Beispiel der fertigen Musik

Es ist peinlich, ein Video der tatsächlichen Pose hochzuladen, daher füge ich ein Demo-Video des Terminals ein, auf dem verschiedene Programme ausgeführt werden, und die fertige Musik. Tatsächlich wurde ein Musiktitel hinzugefügt, der zum Klatschen passt: Schweiß :.

Der im Video verwendete Musiktitel ist übrigens in den Beispielen von ChucK enthalten. [image.png] (https://player.vimeo.com/video/380290288)

Zusammenfassung

Durch die Kombination von Chuck und OpenPose habe ich einen einfachen interaktiven Musikplayer erstellt, der das Wiedergabe-Timing von Musiktiteln steuern kann. Dieses Mal ist es ein einfaches System, das nur Musik durch Händeklatschen hinzufügt, aber das tatsächlich fertiggestellte System ist sehr schön und macht Spaß. Nächstes Mal möchte ich Animation usw. hinzufügen, um die Interaktivität zu verbessern!

Recommended Posts

Ein einfacher interaktiver Musikplayer mit Chuck und OpenPose
Ich habe eine einfache Schaltung mit Python gemacht (AND, OR, NOR, etc.)
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe eine einfache Brieftasche aus Bitcoin mit Pycoin gemacht
Versuchen Sie, eine einfache Website mit Responder und sqlite3 zu erstellen
Erstellen Sie einen einfachen Slackbot mit einer interaktiven Schaltfläche in Python
Versuchen Sie, ein einfaches Spiel mit Python 3 und iPhone zu erstellen
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht
Ich habe eine einfache Buch-App mit Python + Flask ~ Introduction ~ erstellt
Ich habe eine einfache Netzwerkkamera hergestellt, indem ich ESP32-CAM und RTSP kombiniert habe.
Erstellen Sie mit Python und OpenCV ein einfaches OMR (Mark Sheet Reader)
Ich habe mit Python, Flask und Heroku ein Nyanko-Tweet-Formular erstellt
[Python] Ich habe einen Bildbetrachter mit einer einfachen Sortierfunktion erstellt.
Ich habe einen Chat-Chat-Bot mit Tensor2Tensor erstellt und diesmal hat es funktioniert
Interaktive Visualisierung mit ipywidgets und Bokeh
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python einen Daemon erstellt
Ich habe einen Musik-Bot mit discord.py und der Google Drive-API erstellt (getestet mit Docker → bereitgestellt für Heroku).
Erstellen Sie mit Raspberry Pi einen WLAN-Ethernet-Konverter und einen einfachen Router
Erstellen Sie DNN-CRF mit Chainer und erkennen Sie den Akkordfortschritt der Musik
Erstellen Sie eine Drohnen-Simulator-Umgebung und versuchen Sie einen einfachen Flug mit Mission Planner
Erstellen einer einfachen Power-Datei mit Python
Erstellen Sie einen Videoplayer mit PySimpleGUI + OpenCV
Einfacher Slack API-Client mit Python
Ich habe mit Python einen Zeichenzähler erstellt
Ein Memo mit Python2.7 und Python3 in CentOS
Lassen Sie uns mit PLY 1 eine einfache Sprache erstellen
Erstellen Sie eine einfache Web-App mit Flasche
Ich habe mit Python eine Hex-Map erstellt
Ich habe ein Lebensspiel mit Numpy gemacht
Ich habe einen Hanko-Generator mit GAN gemacht
Implementieren Sie ein Modell mit Status und Verhalten
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe eine WEB-Bewerbung bei Django gemacht
Ich habe mit Python einen Neuronensimulator erstellt
Stellen Sie Docker in Windows Home und führen Sie einen einfachen Webserver mit Python aus
Erstellen wir ein einfaches Empfangssystem mit dem serverlosen Python-Framework Chalice und Twilio
Ich möchte gleichzeitig einen Musik-Player erstellen und Musik ablegen
Erstellen Sie eine Kolben-App mit Tensorflow und Dlib für Centos7
[Für Anfänger] Ich habe mit Raspberry Pi einen menschlichen Sensor erstellt und LINE benachrichtigt!
Ich habe versucht, eine einfache Bilderkennungs-API mit Fast API und Tensorflow zu erstellen