Spielen Sie eine Audiodatei von Python mit Interrupt ab

Ich habe ein Programm zum Abspielen von Audio mit Python auf Rasberry Pi erstellt. Ich hatte es schwer, also werde ich dir den Weg zeigen.

Wenn ein Ereignis eintritt, wird als Spezifikation der dem Ereignis entsprechende Ton abgespielt. Wenn während der Audiowiedergabe ein anderes Ereignis auftritt, wird die Audiowiedergabe gestoppt und die Audiowiedergabe des neuen Ereignisses abgespielt.

Dies wird später wirksam.

Zuallererst die königliche Straße PyAudio

Derzeit scheint PyAudio häufig verwendet zu werden, wenn Sie wie "Python Voice Playback" googeln, daher werde ich es ab diesem Zeitpunkt versuchen.

Installation nach offiziellen Angaben apt-get install python-pyaudio python3-pyaudio Da die Python-Version 2.7.9 ist, habe ich das Gefühl, dass ich python3-pyaudio nicht brauche.

Und [Referenzseite](https://fififactory.com/2015/04/29/python-python%E3%81%A7%E9%9F%B3%E6%A5%BD%E5%86%8D%E7% Lassen Sie uns eine Klasse für die Audiowiedergabe implementieren, während Sie 94% 9F-Wave-Pyaudio /) ansehen

audio_player.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pyaudio
import wave
from time import sleep

class AudioPlayer:
    """ A Class For Playing Audio """

    def __init__(self):
        self.audio_file = ""

    def setAudioFile(self, audio_file):
        self.audio_file = audio_file

    def playAudio(self):
        if(self.audio_file == ""):
            return
        self.wf = wave.open(self.audio_file, "rb")
        p = pyaudio.PyAudio()
        stream = p.open(format=p.get_format_from_width(self.wf.getsampwidth()),
                channels=self.wf.getnchannels(),
                rate=self.wf.getframerate(),
                output=True,
                stream_callback=self.callback)
        stream.start_stream()

        while stream.is_active():
            sleep(0.1)

        stream.stop_stream()
        stream.close()
        self.wf.close()

        p.terminate()


    def callback(self, in_data, frame_count, time_info, status):
        data = self.wf.readframes(frame_count)
        return (data, pyaudio.paContinue)
        

Ich kann nicht aufhören, ich kann nicht aufhören

Auf diese Weise wurde der Ton erfolgreich wiedergegeben, aber wie zu erwarten war, gab es ein Problem. ** Ich kann nicht aufhören ... ** Es mag nur mein Mangel an Fähigkeiten sein, aber ich wusste nicht, wie ich die Wiedergabe mit einem Interrupt stoppen sollte. Ist es möglich, einen Blick auf den Prozess zu werfen?

Lass es Linux machen

Hier habe ich meine Perspektive ein wenig geändert und darüber nachgedacht, einen Befehl für die Sprachwiedergabe von Python auszuführen und gegebenenfalls zu unterbrechen, anstatt die Stimme von Python abzuspielen.

aplay dich auch ...

Also werde ich als nächstes aplay versuchen. Es ist einfach, weil es mit aplay hoge.wav gespielt werden kann. Schreiben Sie die vorherige Klasse neu, um den Befehl aplay auszuführen.

audio_player.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess

class AudioPlayer:
    """ A Class For Playing Audio """

    def __init__(self):
        self.audio_file = ""
        self.is_playing = False

    def setAudioFile(self, audio_file):
        self.audio_file = audio_file

    def playAudio(self):
        if(self.audio_file == ""):
            return
        subprocess.call(["aplay", self.audio_file])

Das Befehlsmodul ist veraltet. Verwenden Sie daher das Unterprozessmodul. Okay, ich kann es damit spielen, und wenn ich mir "aplay --help" ansehe, frage ich mich, wie ich es unterbrechen kann ... so etwas gibt es nicht. Es scheint, dass die einzige Möglichkeit, die Wiedergabe eines Spiels zu stoppen, darin besteht, Ctl + C oder PID zu überprüfen und zu beenden. Das ist verrückt.

Und zu mpc ...

Nein, ich war der Meinung, dass die Richtung nicht falsch sein sollte, und als ich weiter nachforschte, kam ich zu mpc. Soweit der Inhalt am Ende dieser Seite (http://www.yam-web.net/raspberry-pi/music.html) angezeigt wird, gibt es auch einen Befehl zum Unterbrechen der Stimme. Ich kann gehen!

Also werde ich die Klasse wieder umschreiben. Die Verwendung von subprocess.call ist jedoch identisch.

audio_player.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess

class AudioPlayer:
    """ A Class For Playing Audio """

    def __init__(self):
        self.audio_file = ""
        self.is_playing = False

    def setAudioFile(self, audio_file):
        self.audio_file = audio_file

    def playAudio(self):
        if(self.audio_file == ""):
            return
        print 'play ' + self.audio_file
        subprocess.call(["mpc", "stop"])   #Sprachstopp
        subprocess.call(["mpc", "clear"])  #Wiedergabeliste löschen
        subprocess.call(["mpc", "update"]) #Audiodateien lesen
        subprocess.call(["mpc", "add", self.audio_file]) #Zur Wiedergabeliste hinzufügen
        subprocess.call(["mpc", "play"]) #Wiedergabe

Als ich es damit getestet habe ... wurde das Audio unterbrochen und ein neues Audio abgespielt! Das wird gewinnen!

Referenzseite

Recommended Posts

Spielen Sie eine Audiodatei von Python mit Interrupt ab
Spielen Sie Audiodateien mit Interrupts mit PyAudio ab
Spielen Sie mit 2016-Python
Mit openssl verschlüsselte Dateien werden mit openssl aus Python entschlüsselt
Bearbeiten Sie Excel-Dateien aus Python mit xlrd (persönliches Memo)
Sortieren von Bilddateien mit Python (2)
Sortieren Sie große Dateien mit Python
Sortieren von Bilddateien mit Python (3)
[Python] Spielen Sie mit Discords Webhook.
Bilddateien mit Python sortieren
Integrieren Sie PDF-Dateien in Python
TXT-Dateien mit Python lesen
Spielen Sie WAVE-Dateien von der WSL ab
Mit Skype benachrichtigen Sie mit Skype von Python!
Entfernen Sie Überschriften aus CSV-Dateien mit mehreren Formaten mit Python
Discord Bot mit Aufnahmefunktion ab Python: (4) Musikdateien abspielen
Rufen Sie C von Python mit DragonFFI auf
Extrahieren Sie Zip-Dateien rekursiv mit Python
Verwenden von Rstan aus Python mit PypeR
Bearbeiten von EAGLE .brd-Dateien mit Python
Installieren Sie Python von der Quelle mit Ansible
[Python] POST-WAV-Dateien mit Anforderungen [POST]
Lesen und verwenden Sie Python-Dateien aus Python
Mit OpenSSL mit Python 3 verschlüsselte Dateien entschlüsseln
Lass uns mit Python mit Python spielen [Anfänger]
Führen Sie Aprili von Python auf Orange aus
Behandeln Sie Excel-CSV-Dateien mit Python
Lesen Sie Dateien parallel zu Python
Rufen Sie Python von Nim mit Nimpy auf
Laden Sie fbx aus Python mitinema4d
Extrahieren Sie mit Python Zeichenfolgen aus Dateien
Sammeln von Informationen von Twitter mit Python (Twitter API)
Videowiedergabe mit Ton auf Python !! (tkinter / imageio)
[AWS] Verwenden von INI-Dateien mit Lambda [Python]
Empfangen Sie Textdaten von MySQL mit Python
Holen Sie sich HTML von Element mit Python-Selen
[Hinweis] Mit Python Daten von PostgreSQL abrufen
Erstellen Sie mit python3 eine Wortwolke aus Ihrem Tweet
Spielen Sie handschriftliche Zahlen mit Python Teil 2 (identifizieren)
Tweet von Python mit Twitter Developer + Tweepy
Fraktal zum Erstellen und Spielen mit Python
Geschäftseffizienz von Grund auf mit Python
Bearbeiten von Azure CosmosDB aus Python Part.2
Ich möchte mit aws mit Python spielen
Bildaufnahme von der Kamera mit Python + OpenCV
Lesen und Schreiben von JSON-Dateien mit Python
Laden Sie mit Python Dateien im Web herunter
[Easy Python] Lesen von Excel-Dateien mit openpyxl
Erste Schritte mit Dynamo von Python Boto
Versuchen Sie, Python von Ruby aus mit Sparsamkeit aufzurufen
Scraping von einer authentifizierten Site mit Python
[Easy Python] Lesen von Excel-Dateien mit Pandas
Verwenden von C ++ - Funktionen aus Python mit pybind11
Spiel mit dem Propheten
Sammeln von Informationen von Twitter mit Python (Umgebungskonstruktion)
Python-Handspiel (Beginnen wir mit AtCoder?)
FizzBuzz in Python3
CSV-Ausgabe der Google-Suche mit [Python]! 【Einfach】