Python 스크립트에서 오디오 (1 초 사운드)를 재생하려면 어떻게해야합니까?
플랫폼 독립적 인 것이 가장 좋지만 먼저 Mac에서 작동해야합니다.
afplay file.mp3
Python 내 에서 명령을 실행할 수 있다는 것을 알고 있지만 원시 Python에서 수행 할 수 있습니까? 외부 라이브러리에 의존하지 않으면 더 좋을 것입니다.
Python 스크립트에서 오디오 (1 초 사운드)를 재생하려면 어떻게해야합니까?
플랫폼 독립적 인 것이 가장 좋지만 먼저 Mac에서 작동해야합니다.
afplay file.mp3
Python 내 에서 명령을 실행할 수 있다는 것을 알고 있지만 원시 Python에서 수행 할 수 있습니까? 외부 라이브러리에 의존하지 않으면 더 좋을 것입니다.
답변:
Python 오디오에 대한 정보는 http://wiki.python.org/moin/Audio/ 에서 찾을 수 있습니다 .
외부 라이브러리 없이는 .mp3 파일을 재생할 수없는 것 같습니다. .mp3 파일을 .wav 또는 다른 형식으로 변환하거나 PyMedia 와 같은 라이브러리를 사용할 수 있습니다 .
.wav
파일을 어떻게 재생 합니까?
가장 좋은 방법은 아마도 pygame / SDL 을 사용하는 것입니다 . 외부 라이브러리이지만 플랫폼 전반에 걸쳐 큰 지원을 제공합니다.
pygame.mixer.init()
pygame.mixer.music.load("file.mp3")
pygame.mixer.music.play()
pygame.mixer.music 문서 에서 오디오 믹서 지원에 대한보다 구체적인 문서를 찾을 수 있습니다.
time.sleep(5)
끝에 추가 했고 그것은 작동했습니다. Windows 8.1의 Python 3.6
이를 위해 비교적 최근의 경량 라이브러리 인 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 파일을 사용해야합니다.
Pure Python, 크로스 플랫폼, 사운드 재생에 대한 종속성이없는 단일 함수 모듈 인 playsound 를 사용해보십시오 .
pip를 통해 설치 :
$ pip install playsound
설치가 완료되면 다음과 같이 사용할 수 있습니다.
from playsound import playsound
playsound('/path/to/a/sound/file/you/want/to/play.mp3')
playsound
. 방금 여기에서 몇 가지 솔루션을 테스트했는데이 솔루션이 가장 쉽게 작동했습니다. 불행히도 pygame
간단한 테스트 동안 솔루션이 작동하지 않았습니다.
에서 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로 돌아갑니다. 위의 링크는 해당 구현도 보여줍니다.
늦게 답장을 드려 죄송 합니다만, 제 도서관을 광고하기에 좋은 곳이라고 생각합니다 ...
표준 라이브러리 인 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)
자세한 내용은 설명서 를 참조하십시오 .
사운드 파일을 읽거나 쓸 수 없으므로 별도의 라이브러리가 필요합니다.
이것을 볼 수 있습니다 : http://www.speech.kth.se/snack/
s = Sound()
s.read('sound.wav')
s.play()
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는 모든 플랫폼에서 작동합니다. 플랫폼 / 파일 형식의 다른 조합이 무엇을하는지, 작동하지 않는지 모르겠습니다. 아직 시도하지 않았습니다.
playsound
내가 작성한 모듈 에 대해 이야기하고 있습니까? Python 2.7.11보다 새로운 버전에서는 테스트하지 않았습니다 ... 3.5에서 수정하는 방법을 확실히 살펴볼 수 있습니다 ...
이것은 가장 쉽고 최고의 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 를 참조 하십시오 .
다음 코드의 아날로그를 사용하여 타사 라이브러리없이 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()
여러 플랫폼에서 사용할 수있는 재생을 위해 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()
또한 OSX에서 -OSX 의 afplay 명령을 사용하여 SO 에서 :
import subprocess
subprocess.call(["afplay", "path/to/audio/file"])
업데이트 :이 모든 작업은 OP가 처음에하지 않으려는 작업을 수행하는 방법 을 지정 하는 것입니다. OP가 피하고 싶었던 것이 내가 찾고 있던 정보이기 때문에 여기에 게시 한 것 같습니다. 이런.
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
Python을 사용하여 알림 소리를 재생하려면 vlc와 같은 음악 플레이어를 호출하십시오. VLC는 대신 명령 줄 버전 인 cvlc를 사용하도록 요청했습니다.
from subprocess import call
call(["cvlc", "--play-and-exit", "myNotificationTone.mp3"])
장치에 vlc가 사전 설치되어 있어야합니다. Linux (Ubuntu 16.04 LTS)에서 테스트되었습니다. Python 3.5를 실행합니다.
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 배열과 목록도 재생합니다.
Colab 노트북에서 다음을 수행 할 수 있습니다.
from IPython.display import Audio
Audio(waveform, Rate=16000)
최근에 내 뮤직 플레이어가 모든 오디오 파일을 로컬에서 지원하도록했습니다. vlc python 모듈과 VLC dll 파일을 사용하는 방법을 알아 내서 이렇게했습니다. https://github.com/elibroftw/music-caster/blob/master/audio_player.py에서 확인할 수 있습니다.