Pythonスクリプトからオーディオ(1秒のサウンドのようになります)を再生するにはどうすればよいですか?
プラットフォームに依存していなければ最適ですが、まずMacで動作する必要があります。
Python内からafplay file.mp3
コマンドを実行できることはわかっていますが、生のPythonで実行することは可能ですか?また、外部ライブラリに依存していなかった方が良いでしょう。
Pythonオーディオに関する情報は、次の場所にあります。 http://wiki.python.org/moin/Audio/
外部ライブラリなしで.mp3ファイルを再生できるようには見えません。 .mp3ファイルを.wavまたは他の形式に変換するか、 PyMedia などのライブラリを使用できます。
最善の策は、おそらく pygame/SDL を使用することです。これは外部ライブラリですが、プラットフォーム間で優れたサポートがあります。
pygame.mixer.init()
pygame.mixer.music.load("file.mp3")
pygame.mixer.music.play()
pygame.mixer.music documentation で、オーディオミキサーのサポートに関するより具体的なドキュメントを見つけることができます。
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ファイルを使用してください。
playsound を試してください。これは、サウンドを再生するための依存関係のない、純粋なPython、クロスプラットフォーム、単一機能モジュールです。
Pip経由でインストールします。
$ pip install playsound
インストールしたら、次のように使用できます。
from playsound import playsound
playsound('/path/to/a/sound/file/you/want/to/play.mp3')
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にフォールバックして、私が言及した欠点を回避します。上記のリンクは、その実装も示しています。
返信が遅くなってすみませんが、これは私のライブラリを宣伝するのに良い場所だと思います...
私の知る限り、標準ライブラリにはオーディオを再生するためのモジュールが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 をご覧ください。
サウンドファイルの読み取り/書き込みはできません。そのためには別のライブラリが必要です。
ポータブルPythonオーディオライブラリが必要な場合は、 PyAudio を試してください。確かにmacポートがあります。
Mp3ファイルに関しては、「生の」Pythonでも確かに実行可能ですが、自分ですべてをコーディングする必要があるのではないかと心配しています。外部ライブラリに余裕があるなら、私はいくつかの PyAudio-PyLameサンプル を見つけました。
これを見ることができます: 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のバリアントと組み合わせました。結果は、 playsound と呼ばれる依存関係のない、純粋なPython、クロスプラットフォームモジュールです。 pypiにアップロードしました。
pip install playsound
次に、次のように実行します。
from playsound import playsound
playsound('/path/to/file.wav', block = False)
MP3ファイルはOS Xでも動作します。WAVはすべてのプラットフォームで動作するはずです。プラットフォーム/ファイル形式の他の組み合わせがどのように機能するか、または機能しないのかわかりません-まだ試していません。
次のコードのアナログを使用すると、サードパーティのライブラリなしで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()
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()
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
VLCには素敵なpythonバインディングがいくつかあります。私にとっては、少なくともMac OSではpygletよりもうまく機能しました。
https://wiki.videolan.org/Python_bindings
しかし、残念ながらVLCアプリケーションに依存しています
これは最も簡単で最高の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 をご覧ください。
import subprocess
f = './mySound.wav'
subprocess.Popen(['aplay','-q',f)
f = 'mySound.wav'
subprocess.Popen(['aplay','-q', 'wav/' + f)
man aplay
Pythonを使用して通知音を再生するには、vlcなどの音楽プレーヤーを呼び出します。 VLCは代わりにコマンドラインバージョンcvlcを使用するように促しました
from subprocess import call
call(["cvlc", "--play-and-exit", "myNotificationTone.mp3"])
デバイスにvlcがプレインストールされている必要があります。 Linux(Ubuntu 16.04 LTS)でテスト済み。 Python 3.5を実行しています。
単にcvlcの助けを借りてそれを行うことができます-私はこの方法でそれをやった:
import os
os.popen2("cvlc /home/maulo/selfProject/task.mp3 --play-and-exit")
/home/maulo/selfProject/task.mp3。これは私のmp3ファイルの場所です。 「--play-and-exit」を使用すると、vlcプロセスを終了せずにサウンドを再度再生できます。
OSXを使用している場合は、「os」モジュールまたは「サブプロセス」などを使用して、OSXの「play」コマンドを呼び出すことができます。 OSXシェルからは、次のようになります
「bah.wav」を再生します
私のマシンでは約0.5秒で再生が開始されます。