Подтвердить что ты не робот

Воспроизведение аудио с помощью Python

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

AFAIK, стандартная библиотека имеет только один модуль для воспроизведения аудио: ossaudiodev. К сожалению, это работает только в Linux и FreeBSD.

UPDATE: существует также winsound, но, очевидно, это также зависит от платформы.

Для чего-то более независимого от платформы, вам нужно будет использовать внешнюю библиотеку.

Моя рекомендация - sounddevice модуль (но остерегайтесь, я автор).

В пакет входит предварительно скомпилированная библиотека PortAudio для Mac OS X и Windows и может быть легко установлена ​​с помощью

pip install sounddevice --user

Он может воспроизводить звук из массивов NumPy, но он также может использовать простые буферы Python (если NumPy недоступен).

Чтобы воспроизвести массив NumPy, все, что вам нужно (при условии, что аудиоданные имеют частоту дискретизации 44100 Гц):

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

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

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

Ответ 6

Если вам нужна портативная звуковая библиотека Python, попробуйте PyAudio. Он, конечно, имеет порт mac.

Что касается mp3 файлов: это, безусловно, возможно в "сыром" Python, только я боюсь, что вам придется все кодировать самостоятельно:). Если вы можете позволить себе какую-то внешнюю библиотеку, я нашел здесь PyAudio - PyLame sample.

Ответ 7

Pyglet имеет возможность воспроизводить звук через внешнюю библиотеку под названием AVbin. Pyglet - обертка ctypes вокруг собственных системных вызовов на каждой поддерживаемой платформе. К сожалению, я не думаю, что в стандартной библиотеке будет воспроизводиться звук.

Ответ 9

Также на OSX - от fooobar.com/questions/68649/..., используя OSX afplay команда

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

Ответ 10

Ответ Аарона кажется примерно в 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. Результатом является чистый python, кросс-платформенный модуль без зависимостей, называемый playsound. Я загрузил его на pypi.

pip install playsound

Затем запустите его следующим образом:

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

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

Ответ 11

Вы не можете сделать это без нестандартной библиотеки.

для пользователей Windows, которые попадают в этот поток, попробуйте pythonwin. PyGame имеет некоторую поддержку звука. Для аппаратного ускоренного игрового звука вам, вероятно, придется вызвать OpenAL или аналогичный с помощью ctypes.

Ответ 12

У VLC есть несколько хороших привязок python, для меня это работало лучше, чем pyglet, по крайней мере, в Mac OS:

https://wiki.videolan.org/Python_bindings

Но он полагается на приложение VLC, к сожалению

Ответ 13

Можно воспроизводить аудио в 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()

Ответ 14

Попробуйте 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()

Ответ 15

Если вы используете OSX, вы можете использовать модуль "os" или "подпроцесс" и т.д., чтобы вызвать команду "играть" OSX. Из оболочки OSX это выглядит как

играть "bah.wav"

Он начинает воспроизводиться примерно через полсекунды на моей машине.

Ответ 16

Просто вы можете сделать это с помощью cvlc- Я сделал это следующим образом:

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

/home/maulo/selfProject/task.mp3. Это местоположение моего mp3 файла. с помощью "--play-and-exit" вы сможете воспроизводить звук без завершения процесса vlc.

Ответ 17

Поместите это в начало своего питона script, который вы пишете:
import subprocess
Если wav файл IS находится в каталоге python script:
f = './mySound.wav'
subprocess.Popen(['aplay','-q',f)
Если wav файл НЕ находится в каталоге python script:
f = 'mySound.wav'
subprocess.Popen(['aplay','-q', 'wav/' + f)
Если вы хотите узнать больше об айпе:
man aplay

Ответ 18

Это самый легкий и лучший из найденных. Он поддерживает 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 для тонны других супер-полезных функций.

Ответ 19

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

Установить через pip:

$ pip install playsound

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

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