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

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

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

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

  • Откладывание функций в python
  • Kivy: получать идентификаторы виджетов и получать доступ к виджетам по уникальному свойству
  • Как отправить электронное письмо с вложением .csv с помощью Python
  • Как получить доступ к улью через Python?
  • Как найти скрытые файлы внутри файлов изображений (Jpg / Gif / Png)
  • Перевести таблицу в иерархический словарь?
  • Хорошо ли иметь синтаксический сахар для работы композиции в Python?
  • urllib.request для python 3.3 не работает для загрузки файла
  • 17 Solutions collect form web for “Воспроизведение аудио с помощью Python”

    Вы можете найти информацию о звуке Python здесь: 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() 

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

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

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

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

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

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

    Моя рекомендация – модуль звукоизвлечения (но будьте осторожны, я автор).

    Пакет включает в себя предварительно скомпилированную библиотеку 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 .

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

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

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

     s = Sound() s.read('sound.wav') s.play() 

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

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

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

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

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

    https://wiki.videolan.org/Python_bindings

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

    Воспроизведение аудио в 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() 

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

     pip install playsound 

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

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

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

    Бросание в другую библиотеку в ведро:

    https://github.com/bastibe/PySoundCard

    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() 

    Если вы используете OSX, вы можете использовать модуль «os» или «subprocess» и т. Д., Чтобы вызвать команду «play» OSX. Из оболочки OSX это выглядит так:

    игра "bah.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-файл IS находится в каталоге скрипта python:

     f = './mySound.wav' subprocess.Popen(['aplay','-q',f) 

    Если wav-файл НЕ находится в каталоге скрипта python:

     f = 'mySound.wav' subprocess.Popen(['aplay','-q', 'wav/' + f) 

    Если вы хотите узнать больше об айпе:

     man aplay 
    Python - лучший язык программирования в мире.