Pythonでオーディオを再生する


107

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

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

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


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

ポータブルPythonオーディオライブラリが必要な場合は、PyAudioを試してください。それは確かにマックポートを持っています。mp3ファイルについては、「未加工の」Pythonで確実に実行できます。自分ですべてをコーディングする必要があるのは私だけです。外部ライブラリを購入できる場合は、PyAudio-PyLameサンプルをこちらで見つけました。
Grzegorz Gacek 2009

回答:


17

ここでPythonオーディオに関する情報を見つけることができます:http : //wiki.python.org/moin/Audio/

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


12
しかし、どうすれば.wavファイルを再生できますか?
theonlygusti 2016

@theonlygusti たとえば、こちらをご覧ください。
アンダーソングリーン

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

ファイアーパッケージ!ありがとう!
СергейЗеленчук

標準の ".wav"、 "。mp3"、および ".ogg"を使用するfedoraでは機能しません(ファイル 'filename.format'を開けません)
Calvin-Ruiz

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


ニース、おかげで-ゲームのために便利な短いサウンドエフェクトを再生する必要性、およびサポートされていることをPythonの3
トーマスPerlの

18

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

ピップ経由でインストール:

$ pip install playsound

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

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

36
これを読んで私はとても感情的になりました。私の目は文字通り幸せで泣きました。そのような反応を自分から期待していませんでした。(これらは私が作成したモジュールにリンクされています。)
ArtOfWarfare 2018年

の+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はラッパーライブラリとしてかなりの可能性を秘めているようです。今インストールしています。
シャドウ

1
くそーPyDubは見栄えが良く、まだアクティブです。
corysimmons

13

返信が遅れて申し訳ありませんが、ここは私のライブラリを宣伝するのに適した場所だと思います...

AFAIK、標準ライブラリには、オーディオを再生するためのモジュールossaudiodevが 1つだけあります。残念ながら、これは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)

詳細については、ドキュメントをご覧ください。

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


すごい!waveに関するクラスのデモプログラムを作成するために必要なものだけです。
Bill N


4

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

pip install playsound

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

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

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


Python 3.5(Windows)で「バイトオブジェクトをstrに暗黙的に変換できません」というエラーが表示されます。
Erwin Mayer

@ErwinMayer- playsound私が書いたモジュールについて話していますか?私はそれをPython 2.7.11より新しいものでテストしていません...私は確かにこれを3.5で修正することを検討できます...
ArtOfWarfare

確かに。Python 3の違いが原因です。
Erwin Mayer

AppKit 依存関係です。
Chris Larson

2
@ArtOfWarfareそれは単に真実ではありません。システムpythonとともにインストールされますが、python.orgの公式ディストリビューションを含むほとんどのディストリビューションではインストールされません。Pythonを使用しているほとんどの人は、SIPの制限を回避するためにディストリビューションの1つをインストールします。ほとんどのディストリビューションでAppKitを入手するには、ユーザーはpyobjcをpip installする必要があります。これは、間違いなく依存関係になります。
Chris Larson、2016

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/PySoundFileおよびhttps://github.com/bastibe/SoundCardご覧ください


(私がそうであるように)これに行く人のためのただのヘッドサップ。すべてのライブラリとその依存関係は、Raspberry Pi 1B +(特に数が多い)上に構築するのに永遠にかかります。
pojda 2017年

PS:これはraspberry piでは機能しませんでした。「NotImplementedError:SoundCardはまだlinux2をサポートしていません。私はos.system( "mpg123のをfile.mp3")で行くよ
pojda

ああ、それは最低だ。ラズベリーパイはちょっと特別な環境だと思います。おそらく、Issuetrackerに問題を投稿した場合、それを整理または修正できます。
n00p

さらに考えると、おそらく問題は、古いカーネルまたは古いpythonバージョンを使用していることです。新しいpythonバージョンでは、そのエラーは私が考えるようなものではないはずです。
n00p

基本的にDebian StretchフォークであるRaspbianを実行しています。私はあきらめて、正常に動作しているos.systemの方法を使用しました。助けてくれてありがとう!
pojda 2017年

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 2016年

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()

興味深いですが、リンクのみの回答はお勧めしません。少なくとも、それを使用する短い例を回答に含める必要があります。また、リポジトリの名前が変更されてリンクがぶら下がった場合でも、回答の価値がすべて失われるのを防ぐことができます。
16年

2

また、OSX- SOから、OSXのafplayコマンドを使用:

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

更新:これが行うことは、OPが最初に実行したくないことを実行する方法を指定することです。OPが避けたかったのは探していた情報だったので、ここに投稿したと思います。おっと。


再生中は実行を一時停止しますが、うまく機能します。おそらくこれを呼び出す非同期の方法はありますか?
Praxiteles

良い質問@Praxiteles。おそらくスレッディングで。ここを参照してください試す機会がありましたら、ご報告ください。
MikeiLL 2016

OPは、これの代替案を明示的に求めました。
whitey04 2016年

OPは、「Python内からafplay file.mp3コマンドを実行する」代わりの方法を探しています/探していましたが、サブ処理はPython内で行われますが、そうではありません。私は修正された立場です。しかし、他の人を助けるかもしれないので、この小さな投稿がここにあることはおそらく害にはなりません。
MikeiLL 2016年

@ whitey04私は(ついに)あなたの言っていることがわかります。
MikeiLL 2018

1

Pypiには、音楽用のpython用のモジュールのリストがあります。音楽用のリソースとライブラリが多いので、私のお気に入りはjythonです教科書から単音を演奏するコードの例として:

# 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
あなたが書いているあなたのPythonスクリプトの一番上にこれを置いてください:
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

サウンドデバイスを試す

モジュールがない場合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ファイルを再生できるようになります。

乾杯、チャーリー

PS

オーディオが「librosa」データオブジェクトになると、Pythonはそれをnumpy配列として認識します。実験として、ランダムなnumpy配列の長い(20,000データポイントを試す)ものを再生してみてください。Pythonはホワイトノイズとして再生する必要があります。sounddeviceモジュールは、数の多い配列とリストも再生します。


これを行いましたが、何も再生していません。sd.play呼び出しをスキップしています
Tobias Kolb



-1

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

「bah.wav」を再生して

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


1
これらのメソッドの両方の構文を確認したいと思います。
MikeiLL 2015年

-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.