2008-11-04 4 views
79

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

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

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

ответ

14

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

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

+4

Но как я могу воспроизвести файл `.wav`? – theonlygusti 2016-12-27 18:27:13

+0

@theonlygusti См. [Здесь] (https://stackoverflow.com/a/17657304/975097), например. – 2017-12-04 19:35:42

30

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

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

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

+13

Пожалуйста, разместите образец того, как это сделать. – 2015-07-02 08:33:18

+2

Вы также должны инициализировать смеситель pygame. Перед этими командами используйте pygame.mixer.init(). – aquaman 2016-08-31 10:59:44

+0

@ aquaman fair point :) – TML 2016-09-01 01:00:44

1

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

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

5

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

6

Если вам нужна портативная аудио-библиотека Python, попробуйте PyAudio. У него, конечно, есть порт mac.

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

4

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

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

Выглядит так чисто, мне жаль, что для этого не было пакета пипсов. Простота установки - это ключ – 2015-07-02 08:32:24

10

В pydub мы недавно opted to use ffplay (via subprocess) из FFmpeg набора инструментов, который внутренне использует SDL.

Он работает для наших целей - в основном просто упрощает тестирование результатов pydub-кода в интерактивном режиме, но имеет свои недостатки, например, вызывать появление новой программы в доке на Mac.

я связан реализация выше, но упрощенная версия следующим образом:

import subprocess 

def play(audio_file_path): 
    subprocess.call(["ffplay", "-nodisp", "-autoexit", audio_file_path]) 

Флаг -nodisp останавливает ffplay показ нового окна, а -autoexit флаг причины ffplay для выхода и возврата кода состояния, когда звуковой файл воспроизводится.

Редактировать: pydub теперь использует pyaudio для воспроизведения, когда он установлен, и возвращается к ffplay, чтобы избежать упомянутых ниже минусов. Вышеупомянутая ссылка также показывает, что реализация.

+1

Pydub выглядит так, что у него есть немного возможностей в качестве библиотеки обертки - я устанавливаю его сейчас. – Shadow 2015-06-08 05:49:34

+0

Damn PyDub выглядит красиво, и он по-прежнему очень активен. – corysimmons 2016-01-05 03:33:19

0

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

игры «bah.wav»

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

+1

Мне было бы интересно увидеть синтаксис обоих этих методов. – MikeiLL 2015-01-31 05:41:56

1

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

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

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

+0

Отлично работает, хотя и приостанавливает исполнение во время воспроизведения. Возможно, существует асинхронный способ назвать это? – Praxiteles 2016-02-04 06:49:24

+0

Хорошие вопросы @Praxiteles. Возможно с резьбой. [см. здесь] (http://stackoverflow.com/questions/984941/python-subprocess-popen-from-a-thread) Пожалуйста, сообщите об этом, если у вас есть шанс поэкспериментировать с ним. – MikeiLL 2016-02-05 15:51:35

+0

OP явно попросил альтернативы этому. – whitey04 2016-05-19 20:14:56

1

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

https://wiki.videolan.org/Python_bindings

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

7

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

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) 

Для получения более подробной информации, смотрите на documentation.

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

2

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

Aaron's answer по-видимому, примерно в 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 должны работать на все платформы. Я не знаю, какие другие комбинации форматов платформы/файла работают или не работают - я еще не пробовал их.

0

Просто Вы можете сделать это с помощью cvlc- я сделал это таким образом:

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

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

10

Посмотрите на 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.

1

Попробуйте 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() 
0
Надень это в верхней части вашего питона скрипт вы пишете:
import subprocess 
Если файл WAV находится в директории скрипта Python:
f = './mySound.wav' 
subprocess.Popen(['aplay','-q',f) 
Если файл WAV не в каталоге питона сценария:
f = 'mySound.wav' 
subprocess.Popen(['aplay','-q', 'wav/' + f) 
I f Вы хотите узнать больше об айпе:
man aplay 
0

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

2

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

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

$ pip install playsound 

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

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

Pypi имеет список модулей для питона в музыке. Мой любимый был бы jython, потому что у него больше ресурсов и библиотек для музыки. Как пример кода, чтобы играть одну ноту от textbook:

# 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! 
0

Для воспроизведения звука уведомлений с помощью питона, вызовите музыкальный проигрыватель, например VLC. VLC попросил меня вместо этого использовать его версию командной строки cvlc.

from subprocess import call 
call(["cvlc", "--play-and-exit", "myNotificationTone.mp3"]) 

Это требует VLC быть предустановлена ​​на устройстве. Протестировано на Linux (Ubuntu 16.04 LTS); Запуск Python 3.5.