Lire un fichier audio à partir de Python avec interruption

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.

Tout d'abord, la route royale PyAudio

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)
        

Je ne peux pas m'arrêter, je ne peux pas m'arrêter

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?

Laissez Linux le faire

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.

jouez-vous aussi ...

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.

Et à mpc ...

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!

Page de référence

Recommended Posts

Lire un fichier audio à partir de Python avec interruption
Lire des fichiers audio avec des interruptions à l'aide de PyAudio
Jouez avec 2016-Python
Décrypter les fichiers cryptés avec openssl depuis python avec openssl
Manipuler des fichiers Excel à partir de python avec xlrd (mémo personnel)
Tri des fichiers image avec Python (2)
Trier de gros fichiers avec python
Tri des fichiers image avec Python (3)
[Python] Jouez avec le Webhook de Discord.
Tri des fichiers image avec Python
Intégrez des fichiers PDF avec Python
Lire des fichiers .txt avec Python
Lire des fichiers WAVE à partir de WSL
Avec skype, notifiez avec skype de python!
Supprimer les en-têtes de fichiers CSV à plusieurs formats avec python
Discord Bot avec fonction d'enregistrement commençant par Python: (4) Lire des fichiers musicaux
Appeler C depuis Python avec DragonFFI
Extraire récursivement des fichiers zip avec python
Utilisation de Rstan de Python avec PypeR
Manipulation des fichiers EAGLE .brd avec Python
Installez Python à partir des sources avec Ansible
[Python] Fichiers wav POST avec requêtes [POST]
Lire et utiliser des fichiers Python à partir de Python
Décrypter les fichiers cryptés avec OpenSSL avec Python 3
Jouons avec Excel avec Python [Débutant]
Exécutez Aprili depuis Python sur Orange
Gérer les fichiers Excel CSV avec Python
Lire des fichiers en parallèle avec Python
Appelez python de nim avec Nimpy
Charger fbx depuis python avec cinema4d
Extraire des chaînes de fichiers avec Python
Collecter des informations sur Twitter avec Python (API Twitter)
Lecture vidéo avec son sur python !! (tkinter / imageio)
[AWS] Utilisation de fichiers ini avec Lambda [Python]
Recevoir des données textuelles de mysql avec python
Obtenir le code HTML de l'élément avec du sélénium Python
[Note] Obtenir des données de PostgreSQL avec Python
Créez wordcloud à partir de votre tweet avec python3
Jouez des nombres manuscrits avec python, partie 2 (identifier)
Tweet de python avec Twitter Developer + Tweepy
Fractal pour faire et jouer avec Python
Efficacité commerciale à partir de zéro avec Python
Manipulation d'Azure CosmosDB à partir de Python Part.2
Je veux jouer avec aws avec python
Acquisition d'images depuis une caméra avec Python + OpenCV
Lire et écrire des fichiers JSON avec Python
Télécharger des fichiers sur le Web avec Python
[Easy Python] Lecture de fichiers Excel avec openpyxl
Premiers pas avec Dynamo de Python boto
Essayez d'appeler Python depuis Ruby avec une économie
Scraping depuis un site authentifié avec python
[Easy Python] Lecture de fichiers Excel avec des pandas
Utilisation des fonctions C ++ de python avec pybind11
Jouez avec Prophet
Collecter des informations depuis Twitter avec Python (construction de l'environnement)
Jeu à la main en Python (commençons avec AtCoder?)
FizzBuzz en Python3
Sortie CSV de la recherche Google avec [Python]! 【Facile】