web-dev-qa-db-fra.com

Jouer de l'audio avec Python

Comment puis-je lire de l'audio (ce serait comme un son d'une seconde) à partir d'un script Python?

Ce serait mieux si elle était indépendante de la plate-forme, mais tout d’abord, elle doit fonctionner sur un Mac.

Je sais que je pourrais simplement exécuter la commande afplay file.mp3 à partir de Python, mais est-il possible de le faire en Python brut? Je serais également mieux s'il ne s'appuyait pas sur des bibliothèques externes.

94
Josh Hunt

Vous pouvez trouver des informations sur l'audio Python ici: http://wiki.python.org/moin/Audio/

Il ne semble pas qu'il puisse lire les fichiers .mp3 sans bibliothèques externes. Vous pouvez convertir votre fichier .mp3 en un format .wav ou autre, ou utiliser une bibliothèque telle que PyMedia .

19
Jeremy Ruten

Votre meilleur choix est probablement d’utiliser pygame/SDL . C'est une bibliothèque externe, mais elle est très bien supportée sur toutes les plateformes.

pygame.mixer.init()
pygame.mixer.music.load("file.mp3")
pygame.mixer.music.play()

Vous trouverez une documentation plus spécifique sur le support du mélangeur audio dans la documentation pygame.mixer.music

38
TML

Jetez un coup d’œil à Simpleaudio , qui est une bibliothèque relativement récente et légère à cet effet:

> pip install simpleaudio

Ensuite:

import simpleaudio as sa

wave_obj = sa.WaveObject.from_wave_file("path/to/file.wav")
play_obj = wave_obj.play()
play_obj.wait_done()

Veillez à utiliser des fichiers PCM 16 bits non compressés.

14
Erwin Mayer

Dans pydub nous avons récemment choisi d'utiliser ffplay (via un sous-processus) depuis la suite d'outils ffmpeg, qui utilise SDL en interne.

Cela fonctionne pour nos besoins - en facilitant principalement le test des résultats du code pydub en mode interactif - mais il a ses inconvénients, comme le fait de faire apparaître un nouveau programme dans le dock sur mac.

J'ai lié l'implémentation ci-dessus, mais une version simplifiée suit:

import subprocess

def play(audio_file_path):
    subprocess.call(["ffplay", "-nodisp", "-autoexit", audio_file_path])

L'indicateur -nodisp empêche ffplay d'afficher une nouvelle fenêtre et l'indicateur -autoexit force ffplay à quitter et à renvoyer un code de statut lorsque la lecture du fichier audio est terminée.

edit: pydub utilise maintenant pyaudio pour la lecture une fois installé et retourne à l'affichage pour éviter les inconvénients que j'ai mentionnés. Le lien ci-dessus montre également cette mise en œuvre.

13
Jiaaro

Désolé pour la réponse tardive, mais je pense que c'est un bon endroit pour annoncer ma bibliothèque ...

Autant que je sache, la bibliothèque standard ne dispose que d’un module de lecture audio: ossaudiodev . Malheureusement, cela ne fonctionne que sous Linux et FreeBSD.

UPDATE: Il y a aussi winsound , mais cela dépend aussi de la plate-forme.

Pour quelque chose de plus indépendant de la plate-forme, vous devrez utiliser une bibliothèque externe.

Ma recommandation est le module sounddevice (mais méfiez-vous, je suis l'auteur).

Le paquet inclut la bibliothèque pré-compilée PortAudio pour Mac OS X et Windows, et peut être facilement installé avec:

pip install sounddevice --user

Il peut reproduire le son des tableaux NumPy, mais il peut également utiliser des tampons Python simples (si NumPy n’est pas disponible).

Pour lire un tableau NumPy, c'est tout ce dont vous avez besoin (en supposant que les données audio ont une fréquence d'échantillonnage de 44100 Hz):

import sounddevice as sd
sd.play(myarray, 44100)

Pour plus de détails, jetez un œil à la documentation .

Il ne peut pas lire/écrire des fichiers audio, vous aurez besoin d’une bibliothèque séparée pour cela.

9
Matthias

Try playsound qui est un module simple fonction, en Python pur, sans aucune dépendance pour la reproduction des sons.

Installer via pip:

$ pip install playsound

Une fois que vous avez installé, vous pouvez l'utiliser comme ceci:

from playsound import playsound
playsound('/path/to/a/sound/file/you/want/to/play.mp3')
8
yehan jaya

Si vous avez besoin d'une bibliothèque audio portable Python, essayez PyAudio . Il a certainement un port mac.

En ce qui concerne les fichiers mp3: c'est certainement faisable en Python "brut", seulement je crains que vous n'ayez à tout coder vous-même :). Si vous pouvez vous permettre une bibliothèque externe, j’ai trouvé quelques PyAudio - exemple PyLame ici.

6
Grzegorz Gacek

Vous pouvez voir ceci: http://www.speech.kth.se/snack/

s = Sound() 
s.read('sound.wav') 
s.play()
5
user1926182

Pyglet a la capacité de lire de l’audio via une bibliothèque externe appelée AVbin . Pyglet est un wrapper ctypes entourant les appels système natifs sur chaque plate-forme prise en charge. Malheureusement, je ne pense pas que quoi que ce soit dans la bibliothèque standard puisse lire de l'audio.

5
technomalogical

La réponse d'Aaron semble être environ 10 fois plus compliquée que nécessaire. Faites cela si vous n’avez besoin que d’une réponse fonctionnant sous OS X:

from AppKit import NSSound

sound = NSSound.alloc()
sound.initWithContentsOfFile_byReference_('/path/to/file.wav', True)
sound.play()

Une chose ... ça revient tout de suite. Donc, vous voudrez peut-être aussi le faire si vous voulez que l'appel soit bloqué jusqu'à la fin du son.

from time import sleep

sleep(sound.duration())

Edit: J'ai pris cette fonction et l'ai combinée avec des variantes pour Windows et Linux. Le résultat est un module multi-plateforme pur en python, dépourvu de dépendances, appelé playsound . Je l'ai téléchargé sur Pypi.

pip install playsound

Puis lancez ça comme ça:

from playsound import playsound
playsound('/path/to/file.wav', block = False)

Les fichiers MP3 fonctionnent également sur OS X. WAV devrait fonctionner sur toutes les plateformes. Je ne sais pas quelles combinaisons de formats de plate-forme/fichier fonctionnent ou ne fonctionnent pas - je ne les ai pas encore essayées.

3
ArtOfWarfare

Également sous OSX - depuis SO , en utilisant la commande afplay de OSX:

import subprocess
subprocess.call(["afplay", "path/to/audio/file"])

UPDATE: Tout ce que cela fait est de spécifier comment faire ce que le PO voulait éviter de faire en premier lieu. Je suppose que j'ai posté ceci ici parce que ce que OP voulait éviter, c'était l'information que je cherchais. Oups.

2
MikeiLL

Il est possible de lire de l’audio sous OS X sans bibliothèque tierce en utilisant un code analogue au code suivant. Les données audio brutes peuvent être entrées avec wave_wave.writeframes. Ce code extrait 4 secondes d'audio du fichier d'entrée.

import wave
import io
from AppKit import NSSound


wave_output = io.BytesIO()
wave_Shell = wave.open(wave_output, mode="wb")
file_path = 'SINE.WAV'
input_audio = wave.open(file_path)
input_audio_frames = input_audio.readframes(input_audio.getnframes())

wave_Shell.setnchannels(input_audio.getnchannels())
wave_Shell.setsampwidth(input_audio.getsampwidth())
wave_Shell.setframerate(input_audio.getframerate())

seconds_multiplier = input_audio.getnchannels() * input_audio.getsampwidth() * input_audio.getframerate()

wave_Shell.writeframes(input_audio_frames[second_multiplier:second_multiplier*5])

wave_Shell.close()

wave_output.seek(0)
wave_data = wave_output.read()
audio_stream = NSSound.alloc()
audio_stream.initWithData_(wave_data)
audio_stream.play()
2
Aaron

Vous ne pouvez pas faire cela sans une bibliothèque non standard.

pour les utilisateurs de Windows qui se retrouvent dans ce fil, essayez pythonwin . PyGame a un support sonore. Pour l’audio de jeu avec accélération matérielle, vous devrez probablement appeler OpenAL ou un appareil similaire via des ctypes.

1
Dustin Getz

VLC propose quelques jolies liaisons python. Pour moi, cela fonctionnait mieux que pyglet, du moins sous Mac OS:

https://wiki.videolan.org/Python_bindings

Mais il s’appuie sur l’application VLC, malheureusement

1
alexvicegrab

Pypi a une liste de modules pour python en musique. Mon préféré serait jython car il contient plus de ressources et de bibliothèques pour la musique. Comme exemple de code pour jouer une seule note à partir du textbook :

# playNote.py 
# Demonstrates how to play a single note.

from music import *   # import music library
note = Note(C4, HN)   # create a middle C half note 
Play.midi(note)       # and play it!
1
Kardi Teknomo

Essayez PySoundCard qui utilise PortAudio pour la lecture disponible sur de nombreuses plateformes ..__ De plus, il reconnaît les périphériques audio "professionnels" avec de nombreux canaux.

Voici un petit exemple tiré du Readme:

from pysoundcard import Stream

"""Loop back five seconds of audio data."""

fs = 44100
blocksize = 16
s = Stream(samplerate=fs, blocksize=blocksize)
s.start()
for n in range(int(fs*5/blocksize)):
    s.write(s.read(blocksize))
s.stop()
1
Stefan Balke
import subprocess
f = './mySound.wav'
subprocess.Popen(['aplay','-q',f)
f = 'mySound.wav'
subprocess.Popen(['aplay','-q', 'wav/' + f)
man aplay
0
Crawsome

Pour lire un son de notification à l’aide de python, appelez un lecteur de musique, tel que vlc. VLC m'a invité à utiliser sa version en ligne de commande, cvlc, à la place.

from subprocess import call
call(["cvlc", "--play-and-exit", "myNotificationTone.mp3"])

Il faut que vlc soit préinstallé sur le périphérique. Testé sur Linux (Ubuntu 16.04 LTS); Exécuter Python 3.5.

0
amarVashishth

Mac OS, j'ai essayé beaucoup de codes mais ça marche pour moi 

import pygame
import time
pygame.mixer.init()
pygame.init()
pygame.mixer.music.load('fire alarm sound.mp3') *On my project folder*
i = 0
while i<10:
    pygame.mixer.music.play(loops=10, start=0.0)
    time.sleep(10)*to protect from closing*
    pygame.mixer.music.set_volume(10)
    i = i + 1
0
Captain Django

Ceci est le plus facile et le meilleur iv'e trouvé. Il prend en charge Linux/pulseaudio, Mac/coreaudio et Windows/WASAPI.

import soundfile as sf
import soundcard as sc

default_speaker = sc.default_speaker()
samples, samplerate = sf.read('bell.wav')

default_speaker.play(samples, samplerate=samplerate)

Voir https://github.com/bastibe/PySoundFile et https://github.com/bastibe/SoundCard pour des tonnes d'autres fonctionnalités super utiles.

0
n00p

Vous pouvez le faire simplement avec l’aide de cvlc - Je l’ai fait de cette façon:

import os
os.popen2("cvlc /home/maulo/selfProject/task.mp3 --play-and-exit")

/home/maulo/selfProject/task.mp3. C’est l’emplacement de mon fichier mp3 . À l’aide de "--play-and-exit", vous pourrez rejouer le son sans mettre fin au processus vlc.

0
pyAddict

Si vous êtes sur OSX, vous pouvez utiliser le module "os" ou "sous-processus" etc. pour appeler la commande OSX "play". Depuis le shell OSX, cela ressemble à 

jouer "bah.wav"

Il commence à jouer dans environ une demi-seconde sur ma machine.

0
Moondoggy