Воспроизведение аудио с помощью Python
Как я могу воспроизводить аудио (это будет похоже на 1-секундный звук) из скрипта Python?
было бы лучше, если бы он был независимым от платформы, но сначала он должен работать на Mac.
Я знаю, что могу просто выполнить afplay file.mp3 команда изнутри Python, но можно ли это сделать в raw Python? Я также был бы лучше, если бы он не полагался на внешние библиотеки.
21 ответов:
вы можете найти информацию о Python audio здесь:http://wiki.python.org/moin/Audio/
не похоже, что он может воспроизводить файлы .mp3 без внешних библиотек. Вы можете либо конвертировать. mp3 файл в a .wav или другой формат, или использовать библиотеку, как PyMedia.
ваш лучший выбор, вероятно, чтобы использовать pygame / SDL. Это внешняя библиотека, но она имеет большую поддержку на различных платформах.
pygame.mixer.init() pygame.mixer.music.load("file.mp3") pygame.mixer.music.play()вы можете найти более подробную документацию о поддержке аудиомикшера в , С которым 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 выходить и возвращать код состояния, когда аудиофайл будет воспроизводиться.edit: 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 Гц):
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()
Аарон кажется, примерно в 10 раз сложнее, чем необходимо. Просто сделайте это, если вам нужен только ответ, который работает на 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"])обновление: все это указывает как чтобы сделать то, что ОП хотел избежать делать в первую очередь. Я думаю, я разместил это здесь, потому что то, что OP хотел избежать, было информацией, которую я искал. Выкрикивает.
Если вы находитесь на OSX, вы можете использовать модуль "os" или "подпроцесс" и т. д. для вызова команды OSX "play". Из оболочки OSX это выглядит как
спектакль "ба.wav"
Он начинает играть примерно полсекунды на моей машине.
просто вы можете сделать это с помощью cvlc- Я сделал это таким образом:
import os os.popen2("cvlc /home/maulo/selfProject/task.mp3 --play-and-exit")/home/maulo/selfProject / task.mp3. это расположение моего mp3-файла. с помощью "--play-and-exit" вы сможете снова воспроизводить звук, не завершая процесс vlc.
Поместите это в верхней части вашего скрипта python, который вы пишете:
Если wav-файл находится в каталоге скрипта python:import subprocessЕсли wav-файл не находится в каталоге скрипта python:f = './mySound.wav' subprocess.Popen(['aplay','-q',f)Если вы хотите узнать больше об игре: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.
Comments