2008-11-04 149 views
79

¿Cómo puedo reproducir audio (sería como un sonido de 1 segundo) de un script de Python?Reproducir audio con Python

Sería mejor si fuera plataforma independiente, pero primero tiene que funcionar en una Mac.

Sé que podría simplemente ejecutar el comando afplay file.mp3 desde dentro de Python, pero ¿es posible hacerlo en Python sin formato? También sería mejor si no dependiera de bibliotecas externas.

Respuesta

14

Puede encontrar información sobre Python de audio aquí: http://wiki.python.org/moin/Audio/

no se ve como que puede jugar archivos .mp3 sin librerías externas. Puede convertir su archivo .mp3 a .wav u otro formato, o usar una biblioteca como PyMedia.

+4

Pero, ¿cómo reproduzco un archivo '.wav'? – theonlygusti

+0

@theonlygusti Ver [aquí] (https://stackoverflow.com/a/17657304/975097), por ejemplo. –

30

Su mejor opción es probablemente usar pygame/SDL. Es una biblioteca externa, pero tiene un gran soporte en todas las plataformas.

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

Puede encontrar documentación más específica sobre el apoyo mezclador de audio en el pygame.mixer.music documentation

+13

Por favor, publique una muestra de cómo hacerlo –

+2

También debe inicializar el mezclador de pygame. Utilice pygame.mixer.init() antes de estos comandos. – aquaman

+0

@aquaman fair point :) – TML

1

No se puede hacer esto sin una biblioteca no estándar.

para usuarios de Windows que terminan en este hilo, intente pythonwin. PyGame tiene algo de soporte de sonido. Para audio de juegos acelerado por hardware, probablemente necesite llamar a OpenAL o similar a través de ctypes.

5

Pyglet tiene la capacidad de reproducir audio a través de una biblioteca externa llamada AVbin. Pyglet es un contenedor de tipos de llamadas de sistema nativas en cada plataforma que admite. Desafortunadamente, no creo que nada en la biblioteca estándar reproduzca el audio.

6

Si necesita una biblioteca de audio portátil de Python, intente PyAudio. Ciertamente tiene un puerto mac.

En cuanto a los archivos mp3: es ciertamente factible en Python "en bruto", solo me temo que tendrías que codificar todo tú mismo :). Si puede pagar una biblioteca externa, he encontrado algunos PyAudio - PyLame sample aquí.

4

Se puede ver esto: http://www.speech.kth.se/snack/

s = Sound() 
s.read('sound.wav') 
s.play() 
+2

Parece tan limpio, ojalá hubiera un paquete de pip para esto. La facilidad de instalación es la clave –

10

En pydub Hemos recientemente opted to use ffplay (via subprocess) de la suite de herramientas de FFmpeg, que utiliza internamente SDL.

Funciona para nuestros propósitos, principalmente para facilitar la prueba de los resultados del código pydub en modo interactivo, pero tiene sus desventajas, como hacer que aparezca un nuevo programa en el dock en mac.

me he vinculado a la aplicación anterior, pero una versión simplificada siguiente manera:

import subprocess 

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

La bandera -nodisp detiene ffplay de mostrar una nueva ventana, y las causas -autoexit bandera ffplay para salir y devolver un código de estado cuando el archivo de audio se termina de reproducir.

edit: pydub ahora usa pyaudio para la reproducción cuando está instalado y vuelve a ffplay para evitar los inconvenientes que mencioné. El enlace de arriba muestra esa implementación también.

+1

Parece que Pydub tiene bastante potencial como una biblioteca contenedora, la estoy instalando ahora. – Shadow

+0

Damn PyDub se ve bien y todavía está muy activo. – corysimmons

0

Si está en OSX, puede usar el módulo "os" o "subproceso", etc. para llamar al comando OSX "play". Desde el shell de OSX, parece que

obra "bah.wav"

Comienza a jugar en aproximadamente medio segundo en mi máquina.

+1

Me interesaría ver la sintaxis de estos dos métodos. – MikeiLL

1

también en OSX - desde SO, utilizando comandos de afplay OSX:

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

ACTUALIZACIÓN: Todo esto hace es especificar cómo a hacer lo que el PO quería evitar hacer en el primer lugar. Supongo que publiqué esto aquí porque lo que OP quería evitar era la información que estaba buscando. Whoops.

+0

Funciona muy bien, aunque detiene la ejecución mientras se reproduce. Tal vez hay una manera asincrónica de llamar esto? – Praxiteles

+0

Buenas preguntas @Praxiteles. Posiblemente con enhebrar. [ver aquí] (http://stackoverflow.com/questions/984941/python-subprocess-popen-from-a-thread) Informe por favor si tiene la oportunidad de experimentar con él. – MikeiLL

+0

El OP explícitamente pidió alternativas a esto. – whitey04

7

este momento para la respuesta tardía, pero creo que este es un buen lugar para anunciar mi biblioteca ...

AFAIK, la biblioteca estándar tiene solo un módulo para reproducir audio: ossaudiodev. Lamentablemente, esto solo funciona en Linux y FreeBSD.

ACTUALIZACIÓN: También existe winsound, pero obviamente también es específico de la plataforma.

Para algo más independiente de la plataforma, necesitarás usar una biblioteca externa.

Mi recomendación es el módulo sounddevice (pero cuidado, soy el autor).

El paquete incluye la pre-compilados PortAudio biblioteca para Mac OS X y Windows, y se puede instalar fácilmente con:

pip install sounddevice --user 

Se puede reproducir el sonido de las matrices NumPy, pero también puede usar Python llanura búferes (si NumPy no está disponible).

Para reproducir una gama NumPy, eso es todo lo que necesita (suponiendo que los datos de audio tiene una frecuencia de muestreo de 44100 Hz):

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

Para más detalles, echar un vistazo a la documentation.

No puede leer/escribir archivos de sonido, necesitará una biblioteca separada para eso.

2

Es posible reproducir audio en OS X sin bibliotecas de terceros utilizando un análogo del siguiente código. Los datos de audio sin formato se pueden ingresar con wave_wave.writeframes. Este código extrae 4 segundos de audio del archivo de entrada.

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() 
+0

Esto es mucho más complicado de lo necesario: preguntaron cómo reproducir simplemente un sonido, no cómo manipularlo y luego reproducirlo. Mi respuesta recorta el innecesario 90% de esta respuesta y deja exactamente lo que el asker quería: reproducir un sonido de un archivo en OS X usando Python. http://stackoverflow.com/a/34984200/901641 – ArtOfWarfare

3

Aaron's answer parece ser aproximadamente 10 veces más complicado de lo necesario. Haga esto solo si solo necesita una respuesta que funcione en OS X:

from AppKit import NSSound 

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

Una cosa ... esto regresa inmediatamente. Por lo tanto, es posible que también desee hacer esto, si desea que la llamada se bloquee hasta que el sonido termine de reproducirse.

from time import sleep 

sleep(sound.duration()) 

Editar: Tomé esta función y la combiné con variantes para Windows y Linux. El resultado es un módulo python, multiplataforma puro sin dependencias llamado playsound. Lo he subido a pypi.

pip install playsound 

A continuación, ejecute la siguiente manera:

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

archivos MP3 también funcionan en OS X. WAV debería funcionar en todas las plataformas. No sé qué otras combinaciones de plataforma/formato de archivo funcionan o no, todavía no las he probado.

+0

Aparece el siguiente error: "No se puede convertir el objeto 'bytes' a str implícitamente" en Python 3.5 (Windows). –

+0

@ErwinMayer - ¿Estás hablando con el módulo 'playsound' que escribí? No lo he probado en nada más nuevo que Python 2.7.11 ... Definitivamente puedo considerar arreglar esto en 3.5 ... – ArtOfWarfare

+0

De hecho. Debe ser debido a las diferencias de Python 3. –

0

Simplemente usted puede hacerlo con la ayuda de cvlc- lo hice de esta manera:

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

/home/maulo/selfProject/task.mp3. Esta es la ubicación de mi archivo mp3. con la ayuda de "--play-and-exit" podrá reproducir nuevamente el sonido sin finalizar el proceso de vlc.

10

Tome un vistazo a Simpleaudio, que es una biblioteca relativamente reciente y ligero para este propósito:

> pip install simpleaudio 

continuación:

import simpleaudio as sa 

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

Asegúrese de utilizar archivos sin comprimir PCM de 16 bits.

+0

Agradable, gracias: útil para juegos que necesitan efectos de sonido cortos, y es compatible con Python 3. –

+0

Solución más simple hasta el momento :-) – lapisdecor

1

Pruebe PySoundCard que utiliza PortAudio para la reproducción que está disponible en muchas plataformas. Además, reconoce dispositivos de sonido "profesionales" con muchos canales.

Aquí un pequeño ejemplo de la Léame:

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() 
+0

Aunque es interesante, se desaconsejan las respuestas de solo enlace. Como mínimo, debe incluir en su respuesta un breve ejemplo de cómo usarlo. Eso también protege su respuesta de perder todo su valor, en caso de renombrar el repositorio y dejar el enlace colgando. – spectras

0
poner esto en la parte superior de su script en Python que está escribiendo:
import subprocess 
Si el archivo WAV es en el directorio del script en Python:
f = './mySound.wav' 
subprocess.Popen(['aplay','-q',f) 
Si el archivo WAV no está en el directorio del script en Python:
f = 'mySound.wav' 
subprocess.Popen(['aplay','-q', 'wav/' + f) 
I Si desea obtener más información acerca de la función:
man aplay 
0

Esta es la forma más fácil de encontrar &. Admite Linux/pulseaudio, Mac/coreaudio y 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) 

Ver https://github.com/bastibe/PySoundFile y https://github.com/bastibe/SoundCard para las toneladas de otras características super-útil.

+0

Solo un aviso para cualquiera que vaya por esto (como yo). Todas las libs y sus dependencias tardan una eternidad en construir una Raspberry Pi 1B +, ​​especialmente numpy. – pojda

+0

PD: esto no funcionó para raspberry pi "NotImplementedError: SoundCard aún no es compatible con linux2", y no se pudo encontrar la forma de solucionarlo. Voy con os.system ("mpg123 file.mp3") – pojda

+0

Ah, eso es una mierda. Supongo que Raspberry Pi es un ambiente un tanto especial. Quizás si publicaste un problema en el emisor de problemas, podrías solucionarlo o solucionarlo. – n00p

2

Pruebe playsound que es un módulo de función única Pure Python, multiplataforma, sin dependencias para reproducir sonidos.

Instalar a través de pepita:

$ pip install playsound 

Una vez que haya instalado, puede utilizar de esta manera:

from playsound import playsound 
playsound('/path/to/a/sound/file/you/want/to/play.mp3') 
+1

Leer esto me hizo tan emocional. Mis ojos literalmente se llenaron de felicidad. No esperaba ese tipo de reacción de mí mismo. (Se vincularon a un módulo que hice). – ArtOfWarfare

0

Pypi tiene una lista de módulos de Python en la música. Mi favorito sería jython porque tiene más recursos y bibliotecas para música. Como ejemplo de código de jugar una sola nota de la 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! 
0

Para reproducir un sonido de notificación usando Python, invoca un reproductor de música, tales como VLC. VLC me incitó a usar su versión de línea de comandos, cvlc, en su lugar.

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

Requiere VLC para ser preinstalados en el dispositivo. Probado en Linux (Ubuntu 16.04 LTS); Ejecutando Python 3.5.

Cuestiones relacionadas