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

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

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

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

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

Grzegorz Gacek 03.02.2009 18:08
Пиглет имеет возможность воспроизводить звук через внешнюю библиотеку под названием AVbin. Pyglet - это оболочка ctypes для собственных системных вызовов на каждой поддерживаемой платформе. К сожалению, я не думаю, что что-либо в стандартной библиотеке будет воспроизводить звук.
technomalogical 04.11.2008 17:37

попробуйте just_playback. Это оболочка вокруг pyaudio, которая может читать файлы нескольких форматов, включая mp3, и предоставляет функции управления воспроизведением, такие как приостановка, возобновление, поиск и установка громкости воспроизведения.

droptop 12.03.2021 13:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
111
3
225 447
24
Перейти к ответу Данный вопрос помечен как решенный

Ответы 24

Ответ принят как подходящий

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

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

Но как мне воспроизвести файл .wav?

theonlygusti 27.12.2016 21:27

@theonlygusti См., например, здесь.

Anderson Green 04.12.2017 22:35

Между тем PyMedia сильно устарела.

k_o_ 29.11.2020 18:36

Лучше всего, вероятно, использовать 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

Nagabhushan S N 22.11.2018 09:15

Огненный пакет! Спасибо!

Сергей Зеленчук 11.09.2019 18:04

Не работает на Fedora со стандартными форматами ".wav", ".mp3" и ".ogg" (невозможно открыть файл "filename.format")

Calvin-Ruiz 17.11.2019 12:06

@ Calvin-Ruiz Я только что подтвердил, что могу использовать приведенный выше код в FC31 для воспроизведения файлов MP3 и Ogg. Я думаю, что у вас есть более серьезная проблема, для решения которой, вероятно, необходимо детальное знание вашей платформы.

TML 19.11.2019 21:16

Похоже, это не работает в ubuntu 20.10

Justin Furuness 13.02.2021 00:15

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

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

Выглядит так чисто, я бы хотел, чтобы для этого был пакет pip. Простота установки - ключ к успеху

Jonathan 02.07.2015 11:32

В 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 выглядит так, как будто у него довольно большой потенциал в качестве библиотеки-оболочки - я устанавливаю его сейчас.

Shadow 08.06.2015 08:49

Проклятье, PyDub выглядит неплохо и по-прежнему очень активен.

corysimmons 05.01.2016 06:33

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

играть "bah.wav"

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

Мне было бы интересно увидеть синтаксис обоих этих методов.

MikeiLL 31.01.2015 08:41

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

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

ОБНОВЛЕНИЕ: все, что это делает, это указывает как, чтобы делать то, чего OP хотел избежать в первую очередь. Думаю, я разместил это здесь, потому что OP хотел избежать именно той информации, которую я искал. Ой.

Отлично работает, хотя приостанавливает выполнение во время воспроизведения. Возможно, есть способ вызвать это асинхронно?

Praxiteles 04.02.2016 09:49

Хорошие вопросы @Praxiteles. Возможно с резьбой. глянь сюда Пожалуйста, сообщите, если у вас есть возможность поэкспериментировать с этим.

MikeiLL 05.02.2016 18:51

ОП явно попросил альтернативы этому.

whitey04 19.05.2016 23:14

OP искал / искал альтернативу «выполнению команды afplay file.mp3 из Python», а подпроцессинг по-прежнему происходит в Python, не так ли. Я исправился. Но, вероятно, этот небольшой пост здесь не повредит, так как он может помочь другим.

MikeiLL 19.05.2016 23:23

@ whitey04 Я (наконец) понял, о чем вы говорите.

MikeiLL 16.02.2018 19:50

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

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

ОБНОВЛЕНИЕ: есть также победа, но, очевидно, это также зависит от платформы.

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

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

Пакет включает предварительно скомпилированную библиотеку ПортАудио для Mac OS X и Windows, и ее можно легко установить с помощью:

pip install sounddevice --user

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

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

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

Для получения дополнительных сведений см. документация.

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

Большой! Как раз то, что мне нужно, чтобы сделать классную демонстрационную программу о волнах.

Bill N 01.10.2018 23:59

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

ArtOfWarfare 25.01.2016 05:26

Ответ Аарона кажется примерно в 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).

Erwin Mayer 29.03.2016 15:24

@ErwinMayer - Вы говорите о модуле playsound, который я написал? Я не тестировал его ни на чем новее, чем Python 2.7.11 ... Я определенно могу исправить это на 3.5 ...

ArtOfWarfare 29.03.2016 16:30

Верно. Это должно быть связано с различиями в Python 3.

Erwin Mayer 29.03.2016 18:20

AppKit является зависимость.

Chris Larson 30.12.2016 22:08

@ChrisLarson - AppKit включен в большинство дистрибутивов Python для Mac ... если вы не получаете Python из странного источника или не собираете его без стандартных библиотек или чего-то еще, это не должно быть обременительной зависимостью.

ArtOfWarfare 31.12.2016 01:24

@ArtOfWarfare Это просто нет правда. Он устанавливается вместе с системным python, но не с большинством дистрибутивов, включая официальные дистрибутивы с python.org. Большинство знакомых мне людей, использующих python, устанавливают один из дистрибутивов, чтобы обойти ограничения SIP. Чтобы получить AppKit для большинства дистрибутивов, пользователю необходимо установить pyobjc. Что делает его самой зависимостью определенно.

Chris Larson 31.12.2016 02:25

@ArtOfWarfare Я готов исправить это, но поскольку я использую python.org dist, а AppKit отсутствует, я вполне уверен в этом.

Chris Larson 31.12.2016 02:26

Привет, спасибо за прослушивание. Моя проблема в том, что я не могу остановить воспроизведение аудиофайла после его запуска. Как я могу вручную остановить файл? Тем более, что я хочу поиграть с параметрами True и False (в том числе асинхронно). Когда я это сделаю, программа завершит выполнение, но звук все еще будет воспроизводиться. Какие-нибудь советы по прекращению воспроизведения звука? Как через код, так и вручную.

James Carter 21.08.2018 05:54

@JamesCarter - Вы можете изменить playsound.py. Если у вас Mac, вам стоит взглянуть на nssound, я полагаю, у него есть метод stop(), который вы можете использовать. Если вы используете Windows, вам, вероятно, понадобится winCommand('pause', alias). Полные предположения с моей стороны. Я не смотрел на это более двух лет. Я помню, что имел в виду звуковые эффекты и не хотел усложнять их.

ArtOfWarfare 21.08.2018 20:52

Я на окнах. Я постараюсь изменить это. Я не эксперт в питоне, но я над этим поработаю.

James Carter 21.08.2018 21:22

Просто вы можете сделать это с помощью 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.

Thomas Perl 18.12.2016 18:31

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

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

spectras 29.05.2016 14:04

Поместите это в начало вашего скрипта 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.

pojda 14.10.2017 04:16

PS: это не сработало для raspberry pi "NotImplementedError: SoundCard еще не поддерживает linux2" и не смог найти способ исправить это. Я использую os.system ("mpg123 file.mp3")

pojda 14.10.2017 05:42

Ах, это отстой. Я полагаю, что Raspberry Pi - это особенная среда. Возможно, если вы разместите проблему в системе отслеживания ошибок, вы сможете решить ее или исправить.

n00p 14.10.2017 16:28

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

n00p 15.10.2017 18:35

Он работает под управлением Raspbian, который по сути является форком Debian Stretch. Я сдался и пошел путем os.system, который отлично работает. Спасибо, что помогли мне!

pojda 17.10.2017 22:00

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

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

$ pip install playsound

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

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

Это чтение меня так взволновало. Мои глаза буквально слезились от счастья. Не ожидал от себя такой реакции. (Они связаны с созданным мной модулем.)

ArtOfWarfare 24.01.2018 17:51

+1 для playsound. Я только что протестировал здесь пару решений, и это сработало для меня проще всего. К сожалению, решение pygame у меня не сработало во время короткого теста.

Trevor Sullivan 24.11.2019 22:18

@ArtOfWarfare Они ходят стадами.

Lmn 18.10.2020 10:49

Мне нравится, насколько прост и вероятностный этот модуль (:

Walter 11.01.2021 19:53

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

blkpingu 23.06.2020 22:55

В записной книжке 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)

Другие вопросы по теме