web-dev-qa-db-ja.com

Pythonでオーディオを再生します

Pythonスクリプトからオーディオ(1秒のサウンドのようになります)を再生するにはどうすればよいですか?

プラットフォームに依存していなければ最適ですが、まずMacで動作する必要があります。

Python内からafplay file.mp3コマンドを実行できることはわかっていますが、生のPythonで実行することは可能ですか?また、外部ライブラリに依存していなかった方が良いでしょう。

97
Josh Hunt

Pythonオーディオに関する情報は、次の場所にあります。 http://wiki.python.org/moin/Audio/

外部ライブラリなしで.mp3ファイルを再生できるようには見えません。 .mp3ファイルを.wavまたは他の形式に変換するか、 PyMedia などのライブラリを使用できます。

18
Jeremy Ruten

最善の策は、おそらく pygame/SDL を使用することです。これは外部ライブラリですが、プラットフォーム間で優れたサポートがあります。

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

pygame.mixer.music documentation で、オーディオミキサーのサポートに関するより具体的なドキュメントを見つけることができます。

38
TML

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ファイルを使用してください。

16
Erwin Mayer

playsound を試してください。これは、サウンドを再生するための依存関係のない、純粋なPython、クロスプラットフォーム、単一機能モジュールです。

Pip経由でインストールします。

$ pip install playsound

インストールしたら、次のように使用できます。

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

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を終了し、オーディオファイルの再生が終了したときにステータスコードを返します。

edit:pydubはインストール時にpyaudioを使用して再生し、ffplayにフォールバックして、私が言及した欠点を回避します。上記のリンクは、その実装も示しています。

13
Jiaaro

返信が遅くなってすみませんが、これは私のライブラリを宣伝するのに良い場所だと思います...

私の知る限り、標準ライブラリにはオーディオを再生するためのモジュールが1つしかありません: ossaudiodev 。悲しいことに、これはLinuxとFreeBSDでのみ動作します。

更新: winsound もありますが、これは明らかにプラットフォーム固有です。

プラットフォームに依存しないものを作成するには、外部ライブラリを使用する必要があります。

私の推奨事項は sounddevice モジュールです(ただし、私は著者です)。

パッケージには、Mac OS XおよびWindows用のプリコンパイルされた PortAudio ライブラリが含まれており、次のコマンドで簡単にインストールできます。

pip install sounddevice --user

NumPy配列からサウンドを再生できますが、プレーンなPythonバッファーも使用できます(NumPyが利用できない場合)。

NumPy配列を再生するために必要なのはそれだけです(オーディオデータのサンプリング周波数が44100 Hzであると仮定):

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

詳細については、 documentation をご覧ください。

サウンドファイルの読み取り/書き込みはできません。そのためには別のライブラリが必要です。

11
Matthias

ポータブルPythonオーディオライブラリが必要な場合は、 PyAudio を試してください。確かにmacポートがあります。

Mp3ファイルに関しては、「生の」Pythonでも確かに実行可能ですが、自分ですべてをコーディングする必要があるのではないかと心配しています。外部ライブラリに余裕があるなら、私はいくつかの PyAudio-PyLameサンプル を見つけました。

6
Grzegorz Gacek

これを見ることができます: http://www.speech.kth.se/snack/

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

Pyglet には、 AVbin と呼ばれる外部ライブラリを介してオーディオを再生する機能があります。 Pygletは、サポートする各プラットフォーム上のネイティブシステムコールのctypesラッパーです。残念ながら、標準ライブラリにはオーディオが再生されるとは思わない。

5
technomalogical

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のバリアントと組み合わせました。結果は、 playsound と呼ばれる依存関係のない、純粋なPython、クロスプラットフォームモジュールです。 pypiにアップロードしました。

pip install playsound

次に、次のように実行します。

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

MP3ファイルはOS Xでも動作します。WAVはすべてのプラットフォームで動作するはずです。プラットフォーム/ファイル形式の他の組み合わせがどのように機能するか、または機能しないのかわかりません-まだ試していません。

3
ArtOfWarfare

OSXでも- SO から、OSXの afplay コマンドを使用して:

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

更新:これは、OPがそもそも実行しないようにするためにhowを指定するだけです。 OPが避けたいのは探していた情報だったので、ここに投稿したと思います。おっと。

3
MikeiLL

次のコードのアナログを使用すると、サードパーティのライブラリなしで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()
2
Aaron

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
Stefan Balke

これは、非標準ライブラリなしでは実行できません。

このスレッドで終わるWindowsユーザーの場合、 pythonwin を試してください。 PyGame はいくつかのサウンドをサポートしています。ハードウェアアクセラレーションゲームオーディオの場合は、おそらくctypesを介してOpenALなどを呼び出す必要があります。

1
Dustin Getz

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
Captain Django

VLCには素敵なpythonバインディングがいくつかあります。私にとっては、少なくともMac OSではpygletよりもうまく機能しました。

https://wiki.videolan.org/Python_bindings

しかし、残念ながらVLCアプリケーションに依存しています

1
alexvicegrab

これは最も簡単で最高の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 をご覧ください。

1
n00p

Pypi には、音楽のpythonのモジュールのリストがあります。私のお気に入りは jython です。なぜなら、音楽用のリソースとライブラリがもっとあるからです。 textbook から単一のノートを再生するコードの例として:

# 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
Kardi Teknomo
import subprocess
f = './mySound.wav'
subprocess.Popen(['aplay','-q',f)
f = 'mySound.wav'
subprocess.Popen(['aplay','-q', 'wav/' + f)
man aplay
0
Crawsome

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
amarVashishth

単にcvlcの助けを借りてそれを行うことができます-私はこの方法でそれをやった:

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

/home/maulo/selfProject/task.mp3。これは私のmp3ファイルの場所です。 「--play-and-exit」を使用すると、vlcプロセスを終了せずにサウンドを再度再生できます。

0
pyAddict

OSXを使用している場合は、「os」モジュールまたは「サブプロセス」などを使用して、OSXの「play」コマンドを呼び出すことができます。 OSXシェルからは、次のようになります

「bah.wav」を再生します

私のマシンでは約0.5秒で再生が開始されます。

0
Moondoggy