J'ai créé un programme pour lire de l'audio en utilisant Python sur Rasberry Pi. J'ai eu du mal, alors je vais vous montrer le chemin.
A titre de spécification, lorsqu'un événement survient, le son correspondant à l'événement est joué, Si un autre événement se produit pendant la lecture audio, c'est comme arrêter la lecture audio et lire l'audio du nouvel événement.
Cela entrera en vigueur plus tard.
Pour le moment, il semble que PyAudio soit souvent utilisé si vous le recherchez sur Google comme "Lecture vocale Python", je vais donc l'essayer à partir de ce moment.
Installation selon le fonctionnaire
apt-get install python-pyaudio python3-pyaudio
Puisque la version Python est 2.7.9, j'ai l'impression que je n'ai pas besoin de python3-pyaudio.
Et [site de référence](https://fififactory.com/2015/04/29/python-python%E3%81%A7%E9%9F%B3%E6%A5%BD%E5%86%8D%E7% Implémentons une classe pour la lecture audio tout en regardant 94% 9F-wave-pyaudio /)
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)
De cette façon, le son a été reproduit avec succès, mais comme vous vous en doutez, il y avait un problème. ** Je ne peux pas m'arrêter ... ** C'est peut-être purement mon manque de compétence, mais je ne savais pas comment arrêter la lecture avec une interruption. Est-il possible d'examiner le processus?
Ici, j'ai un peu changé ma perspective et j'ai pensé à exécuter une commande de lecture vocale à partir de Python et à l'interrompre le cas échéant, au lieu de jouer la voix à partir de Python.
Alors je vais ensuite essayer de jouer. C'est facile car il peut être joué avec ʻa play hoge.wav`. Réécrivez la classe précédente pour exécuter la commande aplay.
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])
Le module de commande est obsolète, utilisez donc le module de sous-processus. D'accord, vous pouvez jouer avec ça, et si vous regardez ʻaplay --help`, comment pouvez-vous l'interrompre? Il semble que la seule façon d'arrêter la lecture de aplay est de vérifier Ctl + C ou PID et de le tuer. C'est fou.
Non, je pensais que la direction ne devait pas être erronée, et lorsque j'ai enquêté plus avant, je suis arrivé à mpc. En ce qui concerne le contenu écrit en bas de cette page, il y a aussi une commande pour interrompre la voix. Je peux y aller!
Je vais donc réécrire la classe à nouveau. Cependant, l'utilisation de subprocess.call est identique.
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"]) #Arrêt de la voix
subprocess.call(["mpc", "clear"]) #Effacer la playlist
subprocess.call(["mpc", "update"]) #Lire des fichiers audio
subprocess.call(["mpc", "add", self.audio_file]) #Ajouter à la playlist
subprocess.call(["mpc", "play"]) #Régénération
Quand je l'ai testé avec ça ... je l'ai fait, l'audio a été interrompu et un nouvel audio a été joué! Gagnez avec ça!
Recommended Posts