Воспроизведение аудио с Python - PullRequest
97 голосов
/ 04 ноября 2008

Как я могу воспроизвести аудио (это будет похоже на 1-секундный звук) из скрипта Python?

Было бы лучше, если бы он был независимым от платформы, но сначала он должен работать на Mac.

Я знаю, что мог просто выполнить команду afplay file.mp3 из Python, но возможно ли это сделать в сыром Python? Мне также было бы лучше, если бы он не полагался на внешние библиотеки.

Ответы [ 18 ]

38 голосов
/ 04 ноября 2008

Лучше всего использовать pygame / SDL . Это внешняя библиотека, но она отлично поддерживается на разных платформах.

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

Более подробную документацию о поддержке аудиомикшера можно найти в документации pygame.mixer.music

18 голосов
/ 04 ноября 2008

Вы можете найти информацию об аудио Python здесь: http://wiki.python.org/moin/Audio/

Не похоже, что он может воспроизводить файлы .mp3 без внешних библиотек. Вы можете преобразовать файл .mp3 в формат .wav или другой, либо использовать библиотеку типа PyMedia .

.
15 голосов
/ 29 марта 2016

Взгляните на 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.

13 голосов
/ 27 ноября 2017

Попробуйте playsound , который представляет собой Pure Python, кроссплатформенный, однофункциональный модуль без каких-либо зависимостей для воспроизведения звуков.

Установка через пипс:

$ pip install playsound

После установки вы можете использовать его так:

from playsound import playsound
playsound('/path/to/a/sound/file/you/want/to/play.mp3')
13 голосов
/ 23 декабря 2013

В 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, чтобы избежать недостатков, о которых я говорил. Ссылка выше показывает и эту реализацию.

11 голосов
/ 09 декабря 2015

Извините за поздний ответ, но я думаю, что это хорошее место для рекламы моей библиотеки ...

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)

Подробнее см. В документации .

Он не может читать / записывать звуковые файлы, для этого вам понадобится отдельная библиотека.

5 голосов
/ 24 декабря 2012

Вы можете видеть это: http://www.speech.kth.se/snack/

s = Sound() 
s.read('sound.wav') 
s.play()
3 голосов
/ 25 января 2016

Ответ Аарона выглядит примерно в 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())

Редактировать: я взял эту функцию и объединил ее с вариантами для Windows и Linux. В результате получается кросс-платформенный модуль на чистом питоне без зависимостей, который называется playsound . Я загрузил его в pypi.

pip install playsound

Затем запустите его так:

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

Файлы MP3 также работают на OS X. WAV должен работать на всех платформах. Я не знаю, какие другие комбинации формата платформа / файл работают или не работают - я еще не пробовал их.

3 голосов
/ 31 января 2015

Также в OSX - с SO , с использованием команды OSX afplay :

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

ОБНОВЛЕНИЕ: Все, что нужно сделать, это указать как сделать то, что ОП хотел бы избежать в первую очередь. Я предполагаю, что разместил это здесь, потому что OP хотел избежать информации, которую я искал. Упс.

2 голосов
/ 28 мая 2016

Попробуйте 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...