Как я могу воспроизвести звук (это будет как звук длительностью в 1 секунду) из скрипта Python?
Было бы лучше, если бы он не зависел от платформы, но сначала он должен работать на Mac.
Я знаю, что могу просто выполнить команду afplay file.mp3 из Python, но можно ли сделать это в чистом Python? Мне также было бы лучше, если бы он не полагался на внешние библиотеки.
попробуйте just_playback. Это оболочка вокруг pyaudio, которая может читать файлы нескольких форматов, включая mp3, и предоставляет функции управления воспроизведением, такие как приостановка, возобновление, поиск и установка громкости воспроизведения.






Вы можете найти информацию об аудио Python здесь: http://wiki.python.org/moin/Audio/
Не похоже, что он может воспроизводить файлы .mp3 без внешних библиотек. Вы можете либо преобразовать файл .mp3 в .wav или другой формат, либо использовать такую библиотеку, как PyMedia.
Но как мне воспроизвести файл .wav?
@theonlygusti См., например, здесь.
Между тем PyMedia сильно устарела.
Лучше всего, вероятно, использовать pygame / SDL. Это внешняя библиотека, но она имеет отличную поддержку на разных платформах.
pygame.mixer.init()
pygame.mixer.music.load("file.mp3")
pygame.mixer.music.play()
Вы можете найти более конкретную документацию о поддержке аудиомикшера в pygame.mixer.music документация
Для меня это не сработало. Я имею в виду, что он играл, но без звука. Я добавил time.sleep(5) в конце, и это сработало. Python 3.6 в Windows 8.1
Огненный пакет! Спасибо!
Не работает на Fedora со стандартными форматами ".wav", ".mp3" и ".ogg" (невозможно открыть файл "filename.format")
@ Calvin-Ruiz Я только что подтвердил, что могу использовать приведенный выше код в FC31 для воспроизведения файлов MP3 и Ogg. Я думаю, что у вас есть более серьезная проблема, для решения которой, вероятно, необходимо детальное знание вашей платформы.
Похоже, это не работает в ubuntu 20.10
Вы можете увидеть это: http://www.speech.kth.se/snack/
s = Sound()
s.read('sound.wav')
s.play()
Выглядит так чисто, я бы хотел, чтобы для этого был пакет pip. Простота установки - ключ к успеху
В 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 выйти и вернуть код состояния, когда аудиофайл будет воспроизведен.
редактировать: pydub теперь использует pyaudio для воспроизведения, когда он установлен, и возвращается к ffplay, чтобы избежать упомянутых мною недостатков. Ссылка выше также показывает эту реализацию.
Pydub выглядит так, как будто у него довольно большой потенциал в качестве библиотеки-оболочки - я устанавливаю его сейчас.
Проклятье, PyDub выглядит неплохо и по-прежнему очень активен.
Если вы работаете в OSX, вы можете использовать модуль «os» или «подпроцесс» и т. д. Для вызова команды OSX «play». Из оболочки OSX это выглядит как
играть "bah.wav"
На моей машине он начинает играть примерно через полсекунды.
Мне было бы интересно увидеть синтаксис обоих этих методов.
Также в OSX - из ТАК, используя команду OSX afplay:
import subprocess
subprocess.call(["afplay", "path/to/audio/file"])
ОБНОВЛЕНИЕ: все, что это делает, это указывает как, чтобы делать то, чего OP хотел избежать в первую очередь. Думаю, я разместил это здесь, потому что OP хотел избежать именно той информации, которую я искал. Ой.
Отлично работает, хотя приостанавливает выполнение во время воспроизведения. Возможно, есть способ вызвать это асинхронно?
Хорошие вопросы @Praxiteles. Возможно с резьбой. глянь сюда Пожалуйста, сообщите, если у вас есть возможность поэкспериментировать с этим.
ОП явно попросил альтернативы этому.
OP искал / искал альтернативу «выполнению команды afplay file.mp3 из Python», а подпроцессинг по-прежнему происходит в Python, не так ли. Я исправился. Но, вероятно, этот небольшой пост здесь не повредит, так как он может помочь другим.
@ whitey04 Я (наконец) понял, о чем вы говорите.
Извините за поздний ответ, но я думаю, что это хорошее место для рекламы моей библиотеки ...
AFAIK, в стандартной библиотеке есть только один модуль для воспроизведения аудио: оссаудиодев. К сожалению, это работает только в Linux и FreeBSD.
ОБНОВЛЕНИЕ: есть также победа, но, очевидно, это также зависит от платформы.
Для чего-то более независимого от платформы вам понадобится внешняя библиотека.
Моя рекомендация - модуль звуковое устройство (но будьте осторожны, я автор).
Пакет включает предварительно скомпилированную библиотеку ПортАудио для Mac OS X и Windows, и ее можно легко установить с помощью:
pip install sounddevice --user
Он может воспроизводить звук из массивов NumPy, но также может использовать простые буферы Python (если NumPy недоступен).
Это все, что вам нужно для воспроизведения массива NumPy (при условии, что аудиоданные имеют частоту дискретизации 44100 Гц):
import sounddevice as sd
sd.play(myarray, 44100)
Для получения дополнительных сведений см. документация.
Он не может читать / записывать звуковые файлы, для этого вам понадобится отдельная библиотека.
Большой! Как раз то, что мне нужно, чтобы сделать классную демонстрационную программу о волнах.
Можно воспроизводить звук в 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()
Это намного сложнее, чем необходимо - они спрашивали, как просто воспроизвести звук, а не как им управлять, а затем воспроизводить. Мой ответ обрезает ненужные 90% из этого ответа и оставляет именно то, что хотел спрашивающий - воспроизведение звука из файла в OS X с использованием Python. stackoverflow.com/a/34984200/901641
Ответ Аарона кажется примерно в 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 без зависимостей под названием звук. Я загрузил его на pypi.
pip install playsound
Затем запустите его так:
from playsound import playsound
playsound('/path/to/file.wav', block = False)
Файлы MP3 также работают в OS X. WAV должен работать на всех платформах. Я не знаю, какие другие комбинации платформы / формата файла работают или не работают - я их еще не пробовал.
Я получаю следующую ошибку: «Не могу неявно преобразовать объект 'bytes' в str» в Python 3.5 (Windows).
@ErwinMayer - Вы говорите о модуле playsound, который я написал? Я не тестировал его ни на чем новее, чем Python 2.7.11 ... Я определенно могу исправить это на 3.5 ...
Верно. Это должно быть связано с различиями в Python 3.
AppKit является зависимость.
@ChrisLarson - AppKit включен в большинство дистрибутивов Python для Mac ... если вы не получаете Python из странного источника или не собираете его без стандартных библиотек или чего-то еще, это не должно быть обременительной зависимостью.
@ArtOfWarfare Это просто нет правда. Он устанавливается вместе с системным python, но не с большинством дистрибутивов, включая официальные дистрибутивы с python.org. Большинство знакомых мне людей, использующих python, устанавливают один из дистрибутивов, чтобы обойти ограничения SIP. Чтобы получить AppKit для большинства дистрибутивов, пользователю необходимо установить pyobjc. Что делает его самой зависимостью определенно.
@ArtOfWarfare Я готов исправить это, но поскольку я использую python.org dist, а AppKit отсутствует, я вполне уверен в этом.
Привет, спасибо за прослушивание. Моя проблема в том, что я не могу остановить воспроизведение аудиофайла после его запуска. Как я могу вручную остановить файл? Тем более, что я хочу поиграть с параметрами True и False (в том числе асинхронно). Когда я это сделаю, программа завершит выполнение, но звук все еще будет воспроизводиться. Какие-нибудь советы по прекращению воспроизведения звука? Как через код, так и вручную.
@JamesCarter - Вы можете изменить playsound.py. Если у вас Mac, вам стоит взглянуть на nssound, я полагаю, у него есть метод stop(), который вы можете использовать. Если вы используете Windows, вам, вероятно, понадобится winCommand('pause', alias). Полные предположения с моей стороны. Я не смотрел на это более двух лет. Я помню, что имел в виду звуковые эффекты и не хотел усложнять их.
Я на окнах. Я постараюсь изменить это. Я не эксперт в питоне, но я над этим поработаю.
Просто вы можете сделать это с помощью cvlc- Я сделал это так:
import os
os.popen2("cvlc /home/maulo/selfProject/task.mp3 --play-and-exit")
/home/maulo/selfProject/task.mp3. Здесь находится мой mp3-файл. с помощью "--play-and-exit" вы сможете снова воспроизвести звук, не завершая процесс vlc.
Взгляните на 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.
Отлично, спасибо - полезно для игр, в которых нужно воспроизводить короткие звуковые эффекты, и поддерживает Python 3.
Попробуйте 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()
Хотя это интересно, ответы только по ссылкам не приветствуются. Как минимум, вы должны включить в свой ответ краткий пример его использования. Это также защищает ваш ответ от потери всей его ценности, если репозиторий будет переименован, а ссылка будет зависать.
Поместите это в начало вашего скрипта Python, который вы пишете:
import subprocess
If the wav file IS in the directory of the python script:
f = './mySound.wav'
subprocess.Popen(['aplay','-q',f)
If the wav file IS NOT in the directory of the python script:
f = 'mySound.wav'
subprocess.Popen(['aplay','-q', 'wav/' + f)
If you want to learn more about aplay:
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 для множества других суперполезных функций.
Предупреждаем всех, кто идет на это (как и я). Все библиотеки и их зависимости требуют вечности, чтобы построить на Raspberry Pi 1B + - особенно numpy.
PS: это не сработало для raspberry pi "NotImplementedError: SoundCard еще не поддерживает linux2" и не смог найти способ исправить это. Я использую os.system ("mpg123 file.mp3")
Ах, это отстой. Я полагаю, что Raspberry Pi - это особенная среда. Возможно, если вы разместите проблему в системе отслеживания ошибок, вы сможете решить ее или исправить.
Если подумать, возможно, проблема в том, что вы используете старое ядро или старую версию Python. Я думаю, что с более новыми версиями Python эта ошибка не должна выглядеть так.
Он работает под управлением Raspbian, который по сути является форком Debian Stretch. Я сдался и пошел путем os.system, который отлично работает. Спасибо, что помогли мне!
Попробуйте звук, который представляет собой кроссплатформенный однофункциональный модуль на чистом Python без каких-либо зависимостей для воспроизведения звуков.
Установить через pip:
$ pip install playsound
После того, как вы установили, вы можете использовать его следующим образом:
from playsound import playsound
playsound('/path/to/a/sound/file/you/want/to/play.mp3')
Это чтение меня так взволновало. Мои глаза буквально слезились от счастья. Не ожидал от себя такой реакции. (Они связаны с созданным мной модулем.)
+1 для playsound. Я только что протестировал здесь пару решений, и это сработало для меня проще всего. К сожалению, решение pygame у меня не сработало во время короткого теста.
@ArtOfWarfare Они ходят стадами.
Мне нравится, насколько прост и вероятностный этот модуль (:
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!
Чтобы воспроизвести звук уведомления с помощью Python, вызовите музыкальный проигрыватель, например vlc. VLC побудил меня использовать его версию командной строки, cvlc, вместо этого.
from subprocess import call
call(["cvlc", "--play-and-exit", "myNotificationTone.mp3"])
Для этого требуется, чтобы на устройстве был предварительно установлен vlc. Протестировано в Linux (Ubuntu 16.04 LTS); Запуск Python 3.5.
Mac OS Я перепробовал много кодов, но у меня это работает
import pygame
import time
pygame.mixer.init()
pygame.init()
pygame.mixer.music.load('fire alarm sound.mp3') *On my project folder*
i = 0
while i<10:
pygame.mixer.music.play(loops=10, start=0.0)
time.sleep(10)*to protect from closing*
pygame.mixer.music.set_volume(10)
i = i + 1
Установите пакет playsound, используя:
pip install playsound
Использование:
from playsound import playsound
playsound("file location\audio.p3")
Попробуйте звуковое устройство
Если у вас нет модуля, введите
pip install sounddevice в вашем терминале.
Затем в предпочитаемом вами скрипте Python (я использую Juypter) введите
import sounddevice as sd
sd.play(audio, sr) будет воспроизводить то, что вы хотите, через Python
Лучший способ получить нужный звук и частоту дискретизации - использовать модуль librosa. Введите это в терминал, если у вас нет модуля librosa.
pip install librosa
audio, sr = librosa.load('wave_file.wav')
Независимо от того, какой файл wav вы хотите воспроизвести, просто убедитесь, что он находится в том же каталоге, что и ваш скрипт Python. Это должно позволить вам воспроизводить желаемый файл WAV через Python.
Ваше здоровье, Чарли
P.S.
Как только аудио является объектом данных "librosa", Python видит его как массив numpy. В качестве эксперимента попробуйте воспроизвести длинный (попробуйте 20000 точек данных) случайный массив numpy. Python должен воспроизводить это как белый шум. Модуль звукового устройства также воспроизводит множество массивов и списков.
сделал это, но ничего не воспроизводит. Это просто пропуск вызова sd.play
В записной книжке Colab вы можете:
from IPython.display import Audio
Audio(waveform, Rate=16000)
Недавно я заставил свой музыкальный проигрыватель поддерживать все аудиофайлы локально. Я сделал это, выяснив способ использования модуля vlc python, а также файлов dll VLC. Вы можете это проверить: https://github.com/elibroftw/music-caster/blob/master/audio_player.py
Это просто. Я так и сделал.
Для файла wav
from IPython.display import Audio
from scipy.io.wavfile import read
fs, data = read('StarWars60.wav', mmap=True) # fs - sampling frequency
data = data.reshape(-1, 1)
Audio(data = data[:, 0], rate = fs)
Для mp3 файла
import IPython.display import Audio
Audio('audio_file_name.mp3')
Для тех, кто использует Linux, а другие пакеты не работают с файлами MP3, audioplayer отлично работал у меня:
https://pypi.org/project/audioplayer/
from audioplayer import AudioPlayer<br>
AudioPlayer("path/to/somemusic.mp3").play(block=True)
Если вам нужна портативная звуковая библиотека Python, попробуйте PyAudio. У него, безусловно, есть порт для Mac. Что касается mp3 файлов: это, конечно, выполнимо на "сыром" Python, только боюсь, что вам придется все кодировать самостоятельно :). Если вы можете позволить себе какую-то внешнюю библиотеку, я нашел здесь PyAudio - образец PyLame.