Відтворюйте аудіо за допомогою Python


107

Як я можу відтворювати аудіо (це було б як звук 1 секунди) із сценарію Python?

Було б найкраще, якби вона була незалежною від платформи, але, по-перше, вона повинна працювати на Mac.

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


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

Якщо вам потрібна портативна аудіобібліотека Python, спробуйте PyAudio . У ньому, безумовно, є порт Mac. Що стосується файлів mp3: це, безумовно, можливо в "сирому" Python, тільки я боюся, що вам доведеться все кодувати самостійно :). Якщо ви можете дозволити собі якусь зовнішню бібліотеку, я знайшов тут зразок PyAudio - PyLame .
Grzegorz Gacek

Відповіді:


17

Інформацію про звук Python можна знайти тут: http://wiki.python.org/moin/Audio/

Не схоже, що він може відтворювати .mp3 файли без зовнішніх бібліотек. Ви можете або перетворити .mp3-файл у формат .wav або інший формат, або використовувати бібліотеку типу PyMedia .


12
Але як я відтворюю .wavфайл?
theonlygusti

@theonlygusti Див тут , наприклад.
Андерсон Грін

42

Ваша найкраща ставка - це, ймовірно, використання pygame / SDL . Це зовнішня бібліотека, але вона має велику підтримку на всіх платформах.

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

Ви можете знайти більш конкретну документацію щодо підтримки звукового мікшера в документації на pygame.mixer.music


2
Для мене це не працювало. Я маю на увазі, це грало, але ніякого звуку. Я додав time.sleep(5)наприкінці, і це спрацювало. Python 3.6 на Windows 8.1
Nagabhushan SN

Пожежний пакет! Дякую!
Сергій Зеленчук

Він не працює на Fedora зі стандартними ".wav", ".mp3" та ".ogg" (Неможливо відкрити файл 'filename.format')
Calvin-Ruiz

1
@ Calvin-Ruiz Я щойно підтвердив, що я можу використовувати вищевказаний код у FC31 для відтворення файлів MP3 та Ogg. Я думаю, у вас є більша проблема, яка, ймовірно, потребує детального знання вашої платформи.
TML

18

Погляньте на 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

Спробуйте playound, який є Pure Python, крос-платформою, єдиним функціональним модулем без залежності для відтворення звуків.

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

$ pip install playsound

Після встановлення ви можете використовувати його так:

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

36
Читання цього зробило мене таким емоційним. Мої очі буквально сльозилися від щастя. Не очікував такої реакції від себе. (Вони зв'язали модуль, який я зробив.)
ArtOfWarfare

+1 для playsound. Я просто випробував тут пару рішень, і цей працював для мене найлегше. На жаль pygame, під час короткого тестування для мене рішення не вийшло.
Тревор Салліван

13

Нещодавно у 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, щоб уникнути недоліків, про які я згадував. Посилання вище показує та реалізація.


1
Pydub, схоже, має досить великий потенціал як бібліотека обгортки - я зараз його встановлюю.
Тінь

1
Чорт PyDub виглядає приємно, і він все ще дійсно активний.
corysimmons

13

Вибачте за пізню відповідь, але я думаю, що це гарне місце для реклами моєї бібліотеки ...

AFAIK, у стандартній бібліотеці є лише один модуль для відтворення аудіо: ossaudiodev . На жаль, це працює лише на Linux та FreeBSD.

ОНОВЛЕННЯ: Існує також winound , але очевидно, що це також залежить від платформи.

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

Моя рекомендація - модуль sounddevice (але будьте обережні, я автор).

У пакет входить попередньо складена бібліотека PortAudio для Mac OS X та Windows, і її можна легко встановити за допомогою:

pip install sounddevice --user

Він може відтворювати звук з масивів NumPy, але він також може використовувати прості буфери Python (якщо NumPy недоступний).

Для відтворення масиву NumPy це все, що вам потрібно (якщо припустити, що аудіодані мають частоту дискретизації 44100 Гц):

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

Більш детально ознайомтеся з документацією .

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


Чудово! Тільки те, що мені потрібно було скласти демонстраційну програму про хвилі.
Білл N


4

Відповідь Аарона видається приблизно в 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. Результат - чистий пітон, крос-платформний модуль без залежностей, який називається playound . Я завантажив його в pypi.

pip install playsound

Потім запустіть його так:

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

MP3-файли також працюють на OS X. WAV повинен працювати на всіх платформах. Я не знаю, які інші комбінації формату платформи / файлів працюють чи не працюють - я ще не пробував їх.


Я отримую таку помилку: "Неможливо перетворити об'єкт" байт "в str неявно" на Python 3.5 (Windows).
Ервін Майєр

@ErwinMayer - Ти говориш про playsoundмодуль, про який я написав? Я не перевіряв це на щось більш нове, ніж на Python 2.7.11 ... Я, безумовно, можу розібратися, як це виправити на 3.5 ...
ArtOfWarfare

Справді. Це повинно бути через відмінності Python 3.
Ервін Майєр

AppKit - це залежність.
Кріс Ларсон

2
@ArtOfWarfare Це просто НЕ так. Він встановлюється разом із системним python, але не з більшості дистрибутивів, включаючи офіційні дистрибутиви від python.org. Більшість людей, яких я знаю, хто використовують python, встановлюють один з дистрибутивів, щоб подолати обмеження SIP. Щоб отримати AppKit для більшості дистрибутивів, користувачеві потрібно встановити pyobjc. Що робить його найбільш виразною залежністю.
Кріс Ларсон

3

Це найпростіший та найкращий знайдений 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 про тони інших суперкорисних функцій.


Просто голова для тих, хто йде на це (як і я). Усі гігієни та їхні залежності залежать від того, щоб назавжди побудувати на Raspberry Pi 1B + - особливо нудно.
pojda

PS: це не працювало для малинового пі "NotImplementedError: SoundCard ще не підтримує linux2", і не вдалося розібратися з способом виправити це. Я йду з os.system ("mpg123 file.mp3")
pojda

Ах, це смокче. Я думаю, що малинове пі - це дещо особливе середовище. Можливо, якщо ви опублікували проблему на емітентному трекері, ви могли б її розібрати чи виправити.
n00p

Подальшу думку, можливо, проблема полягає в тому, що ви використовуєте старе ядро ​​або стару версію python. З новішими версіями python ця помилка не повинна виглядати так, як я думаю.
n00p

Він працює за Raspbian, який в основному є виделкою Debian Stretch. Я здався і пішов по os.system шляхом, який працює чудово атм. Дякуємо, що допомогли мені!
pojda

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

Це набагато складніше, ніж потрібно - вони запитували, як просто відтворити звук, а не як ним маніпулювати, а потім відтворювати. Моя відповідь обрізає непотрібні 90% з цієї відповіді і залишає саме те, що бажав запитувач - відтворення звуку з файлу в OS X за допомогою Python. stackoverflow.com/a/34984200/901641
ArtOfWarfare

2

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

Хоча цікаві, лише відповіді на посилання відмовляють. Як мінімум, слід включити у свою відповідь короткий приклад її використання. Це також захищає вашу відповідь від втрати всієї її вартості, якщо сховище буде перейменовано і посилання перестане звисати.
спектри

2

Також на OSX - від SO , використовуючи команду afplay OSX :

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

ОНОВЛЕННЯ: Все це вказує на те, як робити те, що в першу чергу хотів уникнути ОП. Я думаю, я розмістив це тут, тому що те, чого хотів уникнути, - це інформація, яку я шукав. Уопс.


Працює чудово, хоча робить паузу виконання під час відтворення. Можливо, є асинхронний спосіб викликати це?
Praxiteles

Хороші запитання @Praxiteles. Можливо, з різьбленням. дивіться тут. Повідомте про це, якщо у вас є можливість експериментувати з цим.
MikeiLL

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

ОП шукає альтернативу «виконувати команду afplay file.mp3 зсередини Python», і підпроробка все ще відбувається в Python, чи не так. Я стою виправлений. Але, мабуть, не завадить розмістити тут цей маленький пост, оскільки це може допомогти іншим.
MikeiLL

@ whitey04 Я (нарешті) бачу, що ти кажеш.
MikeiLL

1

У Pypi є список модулів для пітона в музиці. Моїм улюбленим був би 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!

1

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

1

Встановити playsoundпакет за допомогою:

pip install playsound

Використання:

from playsound import playsound
playsound("file location\audio.p3")

0
Поставте це вгорі вашого сценарію 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

0

Щоб відтворити звук сповіщення за допомогою python, зателефонуйте на музичний плеєр, наприклад vlc. VLC запропонував мені замість цього використовувати його версію командного рядка, cvlc.

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

Він вимагає попереднього встановлення vlc на пристрої. Тестовано на Linux (Ubuntu 16.04 LTS); Запуск Python 3.5.


0

Спробуйте звуковий пристрій

Якщо у вас немає модуля, введіть pip install sounddeviceу свій термінал.

Потім у вподобаний сценарій Python (я використовую Juypter) введіть

import sounddevice as sd

sd.play(audio, sr) буде грати те, що ви хочете через Python

Найкращий спосіб отримати потрібне аудіо та вибіркове зображення - за допомогою модуля лібрози. Введіть це в терміналі, якщо у вас немає модуля лібрози.

pip install librosa

audio, sr = librosa.load('wave_file.wav')

Який би файл WAV ви хочете відтворити, просто переконайтеся, що він знаходиться в тому ж каталозі, що і ваш сценарій Python. Це повинно дозволити вам відтворити бажаний WAV-файл через Python

Ура, Чарлі

PS

Після того, як аудіо є об'єктом даних "librosa", Python бачить це як масивний масив. В якості експерименту спробуйте розіграти довгу річ (спробуйте 20000 точок даних) випадкового масиву з нумером. Python повинен відтворювати його як білий шум. Модуль Sounddevice також відтворює масивні масиви та списки.


зробив це, але це нічого не грає. Це просто пропуск дзвінка sd.play
Тобіас Колб



-1

Якщо ви перебуваєте в OSX, ви можете використовувати модуль "os" або "підпроцес" тощо, щоб викликати команду "play" OSX. З оболонки OSX це виглядає так

грати "bah.wav"

Він починає грати приблизно на півсекунди на моїй машині.


1
Мені було б цікаво побачити синтаксис обох цих методів.
MikeiLL

-1

Просто ви можете це зробити за допомогою cvlc- я зробив це таким чином:

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

/home/maulo/selfProject/task.mp3. Тут знаходиться мій mp3-файл. за допомогою "--play-and-exit" ви зможете знову відтворювати звук, не закінчуючи процес vlc.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.