Python으로 오디오 재생


107

Python 스크립트에서 오디오 (1 초 사운드)를 재생하려면 어떻게해야합니까?

플랫폼 독립적 인 것이 가장 좋지만 먼저 Mac에서 작동해야합니다.

afplay file.mp3Python 내 에서 명령을 실행할 수 있다는 것을 알고 있지만 원시 Python에서 수행 할 수 있습니까? 외부 라이브러리에 의존하지 않으면 더 좋을 것입니다.


Pyglet는 라는 외부 라이브러리를 통해 다시 오디오를 재생할 수있는 기능이있다 AVbin을 . Pyglet은 지원하는 각 플랫폼의 기본 시스템 호출을 둘러싼 ctypes 래퍼입니다. 불행히도 표준 라이브러리의 어떤 것도 오디오를 재생하지 않을 것이라고 생각합니다.
기술적 인 기술

휴대용 Python 오디오 라이브러리가 필요한 경우 PyAudio를 사용해보십시오 . 확실히 맥 포트가 있습니다. mp3 파일의 경우 : "raw"Python에서 확실히 가능합니다. 모든 것을 직접 코딩해야합니다. :). 외부 라이브러리를 사용할 수 있다면 여기에서 PyAudio-PyLame 샘플을 찾았 습니다.
Grzegorz Gacek

답변:


17

Python 오디오에 대한 정보는 http://wiki.python.org/moin/Audio/ 에서 찾을 수 있습니다 .

외부 라이브러리 없이는 .mp3 파일을 재생할 수없는 것 같습니다. .mp3 파일을 .wav 또는 다른 형식으로 변환하거나 PyMedia 와 같은 라이브러리를 사용할 수 있습니다 .


12
하지만 .wav파일을 어떻게 재생 합니까?
theonlygusti

@theonlygusti 예를 들어 여기를 참조 하십시오 .
Anderson Green

42

가장 좋은 방법은 아마도 pygame / SDL 을 사용하는 것입니다 . 외부 라이브러리이지만 플랫폼 전반에 걸쳐 큰 지원을 제공합니다.

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

pygame.mixer.music 문서 에서 오디오 믹서 지원에 대한보다 구체적인 문서를 찾을 수 있습니다.


2
나를 위해 이것은 작동하지 않았습니다. 내 말은, 재생되었지만 소리가 나지 않았습니다. 나는 time.sleep(5)끝에 추가 했고 그것은 작동했습니다. Windows 8.1의 Python 3.6
Nagabhushan SN 2018

파이어 패키지! 감사!
Сергей Зеленчук

그것은 (파일 열기 'filename.format'할 수 없음), 표준 ".WAV"와 페도라에 ".MP3"와 "오그"을하지 작업을 수행
캘빈 - 루이즈에게

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 파일을 사용해야합니다.


니스, 감사 - 필요가 짧은 음향 효과를 재생하는 것을 게임, 지원 파이썬 3 유용
토마스 펄

18

Pure Python, 크로스 플랫폼, 사운드 재생에 대한 종속성이없는 단일 함수 모듈 인 playsound 를 사용해보십시오 .

pip를 통해 설치 :

$ pip install playsound

설치가 완료되면 다음과 같이 사용할 수 있습니다.

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

36
이것을 읽는 것은 나를 너무 감정적으로 만들었습니다. 내 눈은 말 그대로 행복으로 눈물을 흘렸다. 그런 반응을 기대하지 않았습니다. (내가 만든 모듈에 링크되었습니다.)
ArtOfWarfare

에 대한 +1 playsound. 방금 여기에서 몇 가지 솔루션을 테스트했는데이 솔루션이 가장 쉽게 작동했습니다. 불행히도 pygame간단한 테스트 동안 솔루션이 작동하지 않았습니다.
Trevor Sullivan

13

에서 pydub 우리는 최근 한 (하위 프로세스를 통해) ffplay 사용하기로 선택 내부적으로 SDL을 사용하는 도구는 FFmpeg 스위트에서.

그것은 우리의 목적을 위해 작동합니다 – 주로 대화 형 모드에서 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

1
Damn PyDub는 멋져 보이고 여전히 정말 활동적입니다.
corysimmons

13

늦게 답장을 드려 죄송 합니다만, 제 도서관을 광고하기에 좋은 곳이라고 생각합니다 ...

표준 라이브러리 인 AFAIK에는 오디오 재생을위한 하나의 모듈 ( ossaudiodev) 만 있습니다. 슬프게도 이것은 Linux와 FreeBSD에서만 작동합니다.

업데이트 : winsound 도 있지만 분명히 이것은 플랫폼에 따라 다릅니다.

보다 플랫폼 독립적 인 경우 외부 라이브러리를 사용해야합니다.

내 추천은 sounddevice 모듈입니다 (하지만 제가 저자라는 점에 유의하세요).

이 패키지에는 Mac OS X 및 Windows 용으로 미리 컴파일 된 PortAudio 라이브러리가 포함 되어 있으며 다음을 사용하여 쉽게 설치할 수 있습니다.

pip install sounddevice --user

NumPy 배열에서 사운드를 재생할 수 있지만 일반 Python 버퍼를 사용할 수도 있습니다 (NumPy를 사용할 수없는 경우).

NumPy 배열을 재생하려면 그게 전부입니다 (오디오 데이터의 샘플링 주파수가 44100Hz라고 가정).

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

자세한 내용은 설명서 를 참조하십시오 .

사운드 파일을 읽거나 쓸 수 없으므로 별도의 라이브러리가 필요합니다.


큰! 웨이브에 대한 수업 데모 프로그램을 만드는 데 필요한 것입니다.
Bill N


4

Aaron의 대답 은 필요한 것보다 약 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는 모든 플랫폼에서 작동합니다. 플랫폼 / 파일 형식의 다른 조합이 무엇을하는지, 작동하지 않는지 모르겠습니다. 아직 시도하지 않았습니다.


Python 3.5 (Windows)에서 "Ca n't convert 'bytes'object to str implicitly"라는 오류가 발생합니다.
Erwin Mayer

@ErwinMayer- playsound내가 작성한 모듈 에 대해 이야기하고 있습니까? Python 2.7.11보다 새로운 버전에서는 테스트하지 않았습니다 ... 3.5에서 수정하는 방법을 확실히 살펴볼 수 있습니다 ...
ArtOfWarfare

과연. Python 3 차이 때문이어야합니다.
Erwin Mayer

AppKit 종속성입니다.
Chris Larson

2
@ArtOfWarfare 그건 사실이 아닙니다 . 시스템 python과 함께 설치되지만 python.org의 공식 배포판을 포함하여 대부분의 배포판에는 설치되지 않습니다. 파이썬을 사용하는 대부분의 사람들은 SIP 제한을 극복하기 위해 배포판 중 하나를 설치합니다. 대부분의 배포판에서 AppKit을 얻으려면 사용자가 pyobjc를 pip 설치해야합니다. 이것이 가장 확실한 의존성을 만듭니다.
Chris Larson

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/PySoundFilehttps://github.com/bastibe/SoundCard 를 참조 하십시오 .


(내가 그렇듯이) 이것을 위해가는 사람을위한 단지주의. 모든 libs와 그 종속성은 Raspberry Pi 1B +, ​​특히 numpy를 기반으로 구축하는 데 영원히 걸립니다.
pojda

추신 : 이것은 라즈베리 파이 "NotImplementedError : SoundCard가 아직 linux2를 지원하지 않습니다"에서 작동하지 않았고, 그것을 고칠 방법을 찾을 수 없었습니다. 나는 os.system을 ( "mpg123의 file.mp3")로 갈거야
pojda

아, 그거 안돼. 나는 라즈베리 파이가 다소 특별한 환경이라고 생각합니다. 이슈 트래커에 이슈를 게시했다면 분류하거나 수정할 수있을 것입니다.
n00p

더 생각해 보면 아마도 문제는 오래된 커널이나 오래된 파이썬 버전을 사용하고 있다는 것입니다. 최신 파이썬 버전에서는 오류가 내가 생각하는 것처럼 보이지 않아야합니다.
n00p

기본적으로 Debian Stretch 포크 인 Raspbian을 실행하고 있습니다. 나는 포기하고 제대로 작동하는 os.system 방식으로 갔다. 도와 주셔서 감사합니다!
pojda

2

다음 코드의 아날로그를 사용하여 타사 라이브러리없이 OS X에서 오디오를 재생할 수 있습니다. raw 오디오 데이터는 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 %를 제거하고 질문자가 원하는 것을 그대로 남겨 둡니다. Python을 사용하여 OS X의 파일에서 사운드를 재생합니다. stackoverflow.com/a/34984200/901641
ArtOfWarfare

2

여러 플랫폼에서 사용할 수있는 재생을 위해 PortAudio 를 사용하는 PySoundCard를 사용해보십시오 . 또한 채널이 많은 "전문"사운드 장치를 인식합니다.

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에서 -OSXafplay 명령을 사용하여 SO 에서 :

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

업데이트 :이 모든 작업은 OP가 처음에하지 않으려는 작업을 수행하는 방법 을 지정 하는 것입니다. OP가 피하고 싶었던 것이 내가 찾고 있던 정보이기 때문에 여기에 게시 한 것 같습니다. 이런.


재생하는 동안 실행을 일시 중지하지만 훌륭하게 작동합니다. 아마도 이것을 호출하는 비동기 방법이 있습니까?
Praxiteles

@Praxiteles에서 좋은 질문입니다. 스레딩으로 가능합니다. 여기를 참조하십시오 실험 할 기회가 있으면 다시보고하십시오.
MikeiLL

OP는 이에 대한 대안을 명시 적으로 요청했습니다.
whitey04

OP는 "파이썬 내에서 afplay file.mp3 명령 실행"에 대한 대안을 찾고 있었으며 하위 처리는 여전히 파이썬 내에서 발생합니다. 나는 바로 잡았다. 그러나 다른 사람들에게 도움이 될 수 있으므로 여기에이 작은 게시물이 있어도 아프지 않을 것입니다.
MikeiLL

@ whitey04 나는 (마침내) 당신이 말하는 것을 봅니다.
MikeiLL

1

Pypi 에는 음악에서 파이썬을위한 모듈 목록이 있습니다. 음악을위한 더 많은 리소스와 라이브러리가 있기 때문에 제가 가장 좋아하는 것은 자이 썬 입니다. 교과서 에서 단일 음표를 재생하는 코드의 예 :

# 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
작성중인 파이썬 스크립트의 맨 위에 이것을 넣으십시오.
import subprocess
wav 파일이 python 스크립트의 디렉토리에있는 경우 :
f = './mySound.wav'
subprocess.Popen(['aplay','-q',f)
wav 파일이 python 스크립트의 디렉토리에없는 경우 :
f = 'mySound.wav'
subprocess.Popen(['aplay','-q', 'wav/' + f)
aplay에 대해 자세히 알아 보려면 :
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

sounddevice 사용해보기

모듈이없는 경우 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 스크립트와 동일한 디렉토리에 있는지 확인하십시오. 이렇게하면 Python을 통해 원하는 wav 파일을 재생할 수 있습니다.

건배, 찰리

추신

오디오가 "librosa"데이터 객체이면 Python은이를 numpy 배열로 인식합니다. 실험으로 임의의 numpy 배열의 긴 (20,000 데이터 포인트 시도)을 시도해보십시오. 파이썬은이를 백색 잡음으로 재생해야합니다. sounddevice 모듈은 numpy 배열과 목록도 재생합니다.


하지만 아무것도 재생하지 않습니다. sd.play 호출을 건너 뛰는 것뿐입니다
Tobias Kolb

0

Colab 노트북에서 다음을 수행 할 수 있습니다.

from IPython.display import Audio
Audio(waveform, Rate=16000)


-1

OSX를 사용하는 경우 "os"모듈 또는 "subprocess"등을 사용하여 OSX "play"명령을 호출 할 수 있습니다. OSX 셸에서 다음과 같이 보입니다.

"bah.wav"재생

내 컴퓨터에서 약 0.5 초 후에 재생되기 시작합니다.


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 프로세스를 종료하지 않고 사운드를 다시 재생할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.