play - reproduce audio python
Reproduce audio con Python (19)
Tu 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 soporte del mezclador de audio en la documentación de pygame.mixer.music
¿Cómo puedo reproducir audio (sería como un sonido de 1 segundo) de un script de Python?
Sería mejor si fuera independiente de la plataforma, pero primero debe funcionar en una Mac.
Sé que podría ejecutar el comando afplay file.mp3
desde Python, pero ¿es posible hacerlo en Python sin formato? También sería mejor si no dependiera de bibliotecas externas.
Puede encontrar información sobre audio Python aquí: http://wiki.python.org/moin/Audio/
No parece que pueda reproducir archivos .mp3 sin bibliotecas externas. Puede convertir su archivo .mp3 a .wav u otro formato, o usar una biblioteca como PyMedia .
Si necesita una biblioteca de audio portátil de Python, pruebe PyAudio . Ciertamente tiene un puerto mac.
En cuanto a los archivos mp3: ciertamente es posible en Python "en bruto", solo me temo que tendrías que codificar todo tú mismo :). Si puede permitirse una biblioteca externa, he encontrado una muestra de PyAudio - PyLame aquí.
Puedes ver esto: http://www.speech.kth.se/snack/
s = Sound()
s.read(''sound.wav'')
s.play()
Si está en OSX, puede usar el módulo "os" o "subproceso", etc. para llamar al comando OSX "play". Desde el shell OSX, parece que
jugar "bah.wav"
Comienza a jugar en aproximadamente medio segundo en mi máquina.
VLC tiene algunas buenas conexiones de python aquí, para mí esto funcionó mejor que pyglet, al menos en Mac OS:
https://wiki.videolan.org/Python_bindings
Pero sí confía en la aplicación VLC, desafortunadamente
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()
En pydub recientemente hemos optado por usar ffplay (a través de subproceso) desde el conjunto de herramientas ffmpeg, que internamente usa 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 de mac.
He vinculado la implementación anterior, pero sigue una versión simplificada:
import subprocess
def play(audio_file_path):
subprocess.call(["ffplay", "-nodisp", "-autoexit", audio_file_path])
El -nodisp
evita que ffplay muestre una nueva ventana, y el indicador -autoexit hace que ffplay salga y devuelva un código de estado cuando el archivo de audio se termina de reproducir.
editar : pydub ahora usa pyaudio para la reproducción cuando está instalado y regresa a ffplay para evitar los inconvenientes que mencioné. El enlace de arriba muestra esa implementación también.
Simplemente 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á volver a reproducir el sonido sin finalizar el proceso de vlc.
Eche un vistazo a Simpleaudio , que es una biblioteca relativamente reciente y liviana para este propósito:
> pip install simpleaudio
Entonces:
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 PCM de 16 bits sin comprimir.
import subprocess
Si el archivo wav se encuentra en el directorio de la secuencia de comandos python:
f = ''./mySound.wav''
subprocess.Popen([''aplay'',''-q'',f)
Si el archivo wav NO se encuentra en el directorio de la secuencia de comandos python:
f = ''mySound.wav''
subprocess.Popen([''aplay'',''-q'', ''wav/'' + f)
Si quieres aprender más acerca de aplay:
man aplay
Perdón por 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 hay winsound , pero obviamente esto 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 de dispositivo de sonido (pero cuidado, soy el autor).
El paquete incluye la biblioteca de PortAudio precompilada para Mac OS X y Windows, y se puede instalar fácilmente con:
pip install sounddevice --user
Puede reproducir el sonido de las matrices NumPy, pero también puede usar memorias intermedias simples de Python (si NumPy no está disponible).
Para reproducir una matriz NumPy, eso es todo lo que necesita (suponiendo que los datos de audio tengan una frecuencia de muestreo de 44100 Hz):
import sounddevice as sd
sd.play(myarray, 44100)
Para más detalles, eche un vistazo a la documentación .
No puede leer / escribir archivos de sonido, necesitará una biblioteca separada para eso.
La respuesta de Aaron parece ser aproximadamente 10 veces más complicada de lo necesario. Simplemente hazlo si solo necesitas 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
Entonces ejecútelo así:
from playsound import playsound
playsound(''/path/to/file.wav'', block = False)
Los 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.
Este es el mejor y más fácil que he encontrado. 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)
Consulte https://github.com/bastibe/PySoundFile y https://github.com/bastibe/SoundCard para ver muchas otras características útiles.
Pruebe PySoundCard que usa 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 del archivo 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()
Pruebe playsound, que es un módulo de función única de Pure Python, multiplataforma, sin dependencias para reproducir sonidos.
Instalar a través de pip:
$ pip install playsound
Una vez que haya instalado, puede usarlo así:
from playsound import playsound
playsound(''/path/to/a/sound/file/you/want/to/play.mp3'')