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



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



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



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

1567   21  

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 здесь.

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

вы можете видеть это: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, который вы пишете:

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.

Comments

    Ничего не найдено.