Python スクリプトからオーディオ (1 秒のサウンドのようなもの) を再生するにはどうすればよいですか?
プラットフォームに依存しないのが一番ですが、まずは Mac で動作する必要があります。
Python内からコマンドを実行できることは知ってafplay file.mp3
いますが、生のPythonで実行することは可能ですか? また、外部ライブラリに依存しない方がよいでしょう。
あなたの最善の策は、おそらくpygame/SDLを使用することです。これは外部ライブラリですが、プラットフォーム間で優れたサポートを提供します。
pygame.mixer.init()
pygame.mixer.music.load("file.mp3")
pygame.mixer.music.play()
pygame.mixer.music のドキュメントで、オーディオ ミキサーのサポートに関するより具体的なドキュメントを見つけることができます。
この目的のための比較的最近の軽量ライブラリである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 オーディオに関する情報は、http ://wiki.python.org/moin/Audio/ にあります。
外部ライブラリなしで .mp3 ファイルを再生できるようには見えません。.mp3 ファイルを .wav または他の形式に変換するか、PyMediaなどのライブラリを使用できます。
pydub では、最近、内部で SDL を使用する ffmpeg スイートのツールからffplay を (サブプロセス経由で) 使用することを選択しました。
これは私たちの目的のために機能します - 主に対話モードで 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 にフォールバックして、前述の欠点を回避します。上記のリンクは、その実装も示しています。
あなたはこれを見ることができます:http ://www.speech.kth.se/snack/
s = Sound()
s.read('sound.wav')
s.play()
アーロンの答えは、必要以上に約 10 倍複雑なようです。OS X で動作する回答のみが必要な場合は、次のようにします。
from AppKit import NSSound
sound = NSSound.alloc()
sound.initWithContentsOfFile_byReference_('/path/to/file.wav', True)
sound.play()
1 つ... これはすぐに返されます。したがって、サウンドの再生が終了するまで呼び出しをブロックする場合は、これも実行する必要があります。
from time import sleep
sleep(sound.duration())
編集:私はこの機能を採用し、Windows と Linux のバリアントと組み合わせました。その結果、依存関係のない純粋な Python のクロス プラットフォーム モジュール、Playsoundが作成されます。pypiにアップロードしました。
pip install playsound
次に、次のように実行します。
from playsound import playsound
playsound('/path/to/file.wav', block = False)
MP3 ファイルは OS X でも動作します。WAV はすべてのプラットフォームで動作するはずです。プラットフォーム/ファイル形式の他の組み合わせが機能するか機能しないかはわかりません。まだ試していません。
多くのプラットフォームで利用可能な再生に 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()
このライブラリは、シンプルでクロスプラットフォームであり、多くの機能を備えていることを目指しています: https://github.com/libwinmedia/libwinmedia-py
[リリース] タブでダウンロードできるlibwinmedia共有ライブラリが必要です。
を使用してインストールできますpip install libwinmedia
例:
import libwinmedia
player = libwinmedia.Player(True)
player.set_position_callback(lambda position: print(f"{position} ms."))
media = libwinmedia.Media("test.mp3")
player.open(media)
Linuxを使用していて、他のパッケージがMP3ファイルで機能していない人audioplayer
にとっては、私にとってはうまくいきました:
https://pypi.org/project/audioplayer/
from audioplayer import AudioPlayer
AudioPlayer("path/to/somemusic.mp3").play(block=True)
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
OSX を使用している場合は、「os」モジュールまたは「subprocess」などを使用して、OSX の「play」コマンドを呼び出すことができます。OSXシェルからは、次のようになります
「bah.wav」を再生
私のマシンでは約0.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 プロセスを終了せずにサウンドを再生できます。