Воспроизведение аудио с помощью Python
Как я могу воспроизводить аудио (это было бы похоже на 1 второй звук) из скрипта Python?
было бы лучше, если бы он был независимым от платформы, но сначала он должен работать на Mac.
Я знаю, что могу просто выполнить afplay file.mp3
команда изнутри Python, но возможно ли это сделать в raw Python? Я также был бы лучше, если бы он не полагался на внешние библиотеки.
21 ответов
вы можете найти информацию о Python audio здесь:http://wiki.python.org/moin/Audio/
не похоже, что он может играть .mp3 файлы без внешних библиотек. Вы можете либо преобразовать .mp3 файл на .wav или другой формат, или использовать библиотеку, как PyMedia.
ваш лучший выбор, вероятно, чтобы использовать pygame / SDL. Это внешняя библиотека, но она имеет большую поддержку на различных платформах.
pygame.mixer.init()
pygame.mixer.music.load("file.mp3")
pygame.mixer.music.play()
вы можете найти более подробную документацию о поддержке audio mixer в , С которым Pygame.смеситель.музыкальная документация
на pydub мы недавно решил использовать ffplay (через подпроцесс) из набора инструментов ffmpeg, который внутренне использует SDL.
он работает для наших целей-в основном просто упрощает тестирование результатов кода pydub в интерактивном режиме – но у него есть свои недостатки, например, появление новой программы в доке на mac.
я связал реализацию выше, но упрощенная версия следует:
import subprocess
def play(audio_file_path):
subprocess.call(["ffplay", "-nodisp", "-autoexit", audio_file_path])
В -nodisp
флаг останавливает ffplay от отображения нового окна, а -autoexit
флаг заставляет ffplay выходить и возвращать код состояния, когда аудиофайл закончен.
редактировать: pydub теперь использует pyaudio для воспроизведения, когда он установлен, и возвращается к ffplay, чтобы избежать недостатков, о которых я упоминал. Ссылка выше показывает, что реализация также.
посмотри Simpleaudio, которая является относительно недавней и легкой библиотекой для этой цели:
> pip install simpleaudio
затем:
import simpleaudio as sa
wave_obj = sa.WaveObject.from_wave_file("path/to/file.wav")
play_obj = wave_obj.play()
play_obj.wait_done()
обязательно используйте несжатые 16-битные файлы PCM.
извините за поздний ответ, но я думаю, что это хорошее место для рекламы моей библиотеке ...
AFAIK, стандартная библиотека имеет только один модуль для воспроизведения аудио:ossaudiodev. К сожалению, это работает только на Linux и FreeBSD.
обновление: есть также winsound, но, очевидно, это также платформы.
для чего-то более независимого от платформы, вам нужно будет использовать внешнюю библиотеку.
моя рекомендация это sounddevice модуль (но будьте осторожны, я автор).
пакет включает в себя предварительно скомпилированный PortAudio библиотека для Mac OS X и Windows, и может быть легко установлен с:
pip install sounddevice --user
Он может воспроизводить звук из массивов NumPy, но также может использовать простые буферы Python (если NumPy недоступен).
чтобы воспроизвести массив NumPy, это все, что вам нужно (при условии, что звуковые данные имеют частоту дискретизации 44100 Hz):
import sounddevice as sd
sd.play(myarray, 44100)
для более подробной информации, посмотрите на документация.
он не может читать / записывать звуковые файлы, для этого вам понадобится отдельная библиотека.
Если вам нужна портативная аудиотека Python, попробуйте PyAudio. Он, безусловно, имеет MAC-порт.
Что касается mp3-файлов: это, безусловно, выполнимо в "сыром" Python, только я боюсь, что вам придется все кодировать самостоятельно :). Если вы можете позволить себе некоторую внешнюю библиотеку, я нашел некоторые PyAudio - PyLame образец здесь.
вы можете видеть это:http://www.speech.kth.se/snack/
s = Sound()
s.read('sound.wav')
s.play()
Аарон кажется, около 10x сложнее, чем необходимо. Просто сделайте это, если вам нужен только ответ, который работает на OS X:
from AppKit import NSSound
sound = NSSound.alloc()
sound.initWithContentsOfFile_byReference_('/path/to/file.wav', True)
sound.play()
одно дело... это немедленно возвращается. Поэтому вы можете также сделать это, если хотите, чтобы вызов блокировался до тех пор, пока звук не закончится.
from time import sleep
sleep(sound.duration())
Edit: я взял эту функцию и объединил ее с вариантами для Windows и Linux. Результатом является чистый python, кросс-платформенный модуль без зависимости называются playsound. Я загрузил его в pypi.
pip install playsound
затем запустите его так:
from playsound import playsound
playsound('/path/to/file.wav', block = False)
MP3 файлы также работают на OS X. WAV должен работать на всех платформах. Я не знаю, какие другие комбинации формата платформы/файла работают или не работают - я еще не пробовал их.
можно воспроизводить аудио в OS X без каких-либо сторонних библиотек, используя аналог следующего кода. Необработанные аудиоданные можно вводить с помощью wave_wave.writeframes. Этот код извлекает 4 секунды аудио из входного файла.
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()
попробовать playsound который представляет собой чистый Python, кросс-платформенный, одиночный функциональный модуль без зависимостей для воспроизведения звуков.
установить через pip:
$ pip install playsound
после установки, вы можете использовать его как это:
from playsound import playsound
playsound('/path/to/a/sound/file/you/want/to/play.mp3')
вы не можете сделать это без нестандартного библиотека.
для пользователей windows, которые попадают в этот поток, попробуйте pythonwin. , С которым Pygame имеет некоторую звуковую поддержку. Для аппаратного ускорения звука игры вам, вероятно, нужно будет вызвать OpenAL или аналогичный через ctypes.
VLC имеет некоторые хорошие привязки python здесь, для меня это работало лучше, чем pyglet, по крайней мере, на Mac OS:
https://wiki.videolan.org/Python_bindings
но он полагается на приложение VLC, к сожалению
попробовать PySoundCard который использует PortAudio для воспроизведения, который доступен на многих платформах. Кроме того, он распознает "профессиональные" звуковые устройства с большим количеством каналов.
вот небольшой пример из 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()
Pypi список модулей для Python в музыке. Моим любимым было бы языка Jython потому что у него больше ресурсов и библиотек для музыки. В качестве примера кода для воспроизведения одной ноты из учебник:
# 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!
также на OSX-from так, используя OSX afplay:
import subprocess
subprocess.call(["afplay", "path/to/audio/file"])
UPDATE: Все это делает, это указывает как делать то, чего ОП хотел избежать в первую очередь. Думаю, я разместил это здесь, потому что ОП хотел избежать информации, которую я искал. Выкрикивает.
Если вы находитесь на OSX, вы можете использовать модуль "os" или "подпроцесс" и т. д. вызвать команду OSX "play". Из оболочки OSX это выглядит как
играть " bah.WAV и"
Он начинает играть примерно полсекунды на моей машине.
просто вы можете сделать это с помощью cvlc- Я сделал это так:
import os
os.popen2("cvlc /home/maulo/selfProject/task.mp3 --play-and-exit")
/ home/maulo/selfProject / задача.mp3. Это расположение моего mp3-файла. с помощью "--play-and-exit" вы сможете воспроизводить звук снова, не завершая процесс vlc.
Поместите это в верхнюю часть вашего скрипта python, который вы пишете:
import subprocess
Если wav-файл находится в каталоге скрипта python:
f = './mySound.wav'
subprocess.Popen(['aplay','-q',f)
Если wav-файл не находится в каталоге скрипта python:
f = 'mySound.wav'
subprocess.Popen(['aplay','-q', 'wav/' + f)
Если вы хотите узнать больше об игре:
man aplay
Это самый простой и лучший ИЖ е нашли. Он поддерживает Linux / pulseaudio, Mac / coreaudio и 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)
см.https://github.com/bastibe/PySoundFile и https://github.com/bastibe/SoundCard Для тонн других супер-полезных особенностей.
чтобы воспроизвести звук уведомления с помощью python, вызовите музыкальный плеер, например vlc. VLC предложил мне использовать его версию командной строки, cvlc, вместо этого.
from subprocess import call
call(["cvlc", "--play-and-exit", "myNotificationTone.mp3"])
требуется предустановка vlc на устройстве. Протестировано на Linux (Ubuntu 16.04 LTS); работает Python 3.5.