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.
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)
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?
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.
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.
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!
Recommended Posts