pythonで音楽再生する方法
主な方法として以下の5つが挙げられます。
本投稿では、
- モジュールのインストール方法
- 各方法を使用するための簡易なコード
- エラー時の挙動、原因
- 音楽再生時のRaspberry Piの設定等(後述のおまけ参照)
を主に記していきます。
また、3.~5.はpythonからでなくともただRaspberry Piで音楽を再生したい場合によく使用されます。
4.のaplayはデフォルトで入っていますが、vlcあたりはインストールしておくとGUIベースで音楽再生・簡単な編集が行えるので、便利かと思います。
1.pygame
Raspberry Piのpythonパッケージにはpygameというモジュールがデフォルトでインストールされているそうです。
以下コード。
#!/usr/bin/env python
#-*- cording: utf-8 -*-
import pygame.mixer
import time
# mixerモジュールの初期化
pygame.mixer.init()
# 音楽ファイルの読み込み
pygame.mixer.music.load("ファイル名.mp3")
# 音楽再生、および再生回数の設定(-1はループ再生)
pygame.mixer.music.play(-1)
time.sleep(60)
# 再生の終了
pygame.mixer.music.stop()
mixer.musicは音楽再生用のモジュールです。mp3ファイルとoggファイルを読み込むことが出来ます。
※ 2017年2月12日 追記
pygame.mixer.musicはwavファイル再生に対応していませんでした!
効果音などの短い音を鳴らすにはmixer.Soundモジュールを使うと良いです。
Soundモジュールならwavファイルを再生できますが、500kB以下という制限があります。
詳しくは以下の日本語リファレンスをご参考ください。
pygame.mixer全般
pygame.mixer.music
2.PyAudio
まずはインストール方法。
LXTerminal(コマンドライン)でapt-get installします。
$ sudo apt-get install python-pyaudio python3-pyaudio
参考:PyAudio
コードは以下の通り。
#-*- cording: utf-8 -*-
import wave
import pyaudio
# チャンク数を指定
CHUNK = 1024
filename = "ファイル名.wav"
wf = wave.open(filename, 'rb')
# PyAudioのインスタンスを生成
p = pyaudio.PyAudio()
# Streamを生成
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
"""
format: ストリームを読み書きする際のデータ型
channels: モノラルだと1、ステレオだと2、それ以外の数字は入らない
rate: サンプル周波数
output: 出力モード
"""
# データを1度に1024個読み取る
data = wf.readframes(CHUNK)
# 実行
while data != '':
# ストリームへの書き込み
stream.write(data)
# 再度1024個読み取る
data = wf.readframes(CHUNK)
# ファイルが終わったら終了処理
stream.stop_stream()
stream.close()
p.terminate()
参考:たけし備忘録 様
色々とググってみましたが、PyAudioでmp3ファイルを再生している例がありませんでした。
みなwavファイルです。
↑のプログラムから分かる通り、常時ストリーミングでデータの読み込みを行いながら音楽を再生します。
また、音が途切れ途切れに再生されることがあります。
Stack overflowにも報告例がありましたが、根本的な解決はなされていないようです。
※ 2017年2月12日 追記
途切れ途切れに再生される原因は、音楽ファイルのサンプルサイズ・サンプルレート・チャンネル数にあることが分かりました。
以下のようなwavファイルの再生を確認しました。特にサンプルサイズは、これ以上大きいと上手く再生ができません。
- サンプルサイズ: 16bit
- サンプルレート: 44100Hz
- チャンネル数: 2
3.vlc
以下からはsubprocessを使用したコマンド実行になります。
※ 2017年2月12日 追記
multiprocessing等でマルチスレッドを立てることで、suborocessを用いて音楽再生しながらpython上で別の処理を行うことができました。
まずはvlcをインストール。
$ sudo apt-get install vlc
すると以下のようにメニューにVLCメディアプレイヤーが追加されます。
開くとこんな感じ。
これでGUIベースで音楽・ビデオ再生や編集ができるようになりました。
(vlcではwavファイルをmp3ファイルに変換することもできます。
参考:ブログというより備忘録様)
さて、vlcをコマンドライン上で操作するには2つの方法があります。
- cvlcコマンドの利用
- vlc -I rcコマンドの利用
今回は2.の方法で進めていきます。
#-*- cording: utf-8 -*-
import subprocess
subprocess.call("vlc -I rc --play-and-stop ファイル名.wav", shell=True)
再生を終わらせるためにはコマンドラインで
> stop
と打つ必要があります。もちろんCtrl+Cでも大丈夫ですが。
vlcはroot権限で再生ができません。
ので、プログラムの他のライブラリの関係でsudo実行しなければならない等の場合、vlcは使用できません。
vlcのコマンドは野利庵日録様に一通り書いてあります。helpコマンドでも確認できます。
vlcには公式Wikiが存在するので、そちらで探すのも良いでしょう。
そして、vlcはwavもmp3も再生可能です。ファイルサイズの上限等も無いようです。
今回はコマンドライン上での実行を紹介しましたが、python-vlcなるライブラリも存在するようです。
ネット上にはこのpython-vlc情報がとても少ないので、使用するにはexamplesのpyファイルを読み込むしか無さそうですね。
また、subprocessが初出なのでその話も少々。
os.system等のosモジュールは古いとして、公式で使用が推奨されていないようです。
なのでos.systemの代わりにsubprocess.callを使うのがこれからのナウでヤングなやり方だそうな。
4.aplay
aplayはLinuxにおける代表的な音楽再生コマンドです。
これもvlcと同じくsubprocessから呼び出します。
#-*- cording: utf-8 -*-
import subprocess
subprocess.call("aplay ファイル名.wav", shell=True)
サンプルサイズの大きさによって、以下のようなERRORが出ます。
aplay: set_params:1233: サンプルフォーマットが使用不可能
Available formats:
- U8
- S16_LE
pyAudioのときにもサンプルサイズの話は出ましたが、aplayでもサンプルサイズは16bitにしなければなりません。
aplayはvlcと違い、root権限で再生が行えます。なのでsudoでの処理が必要なときはこちらを用いると良いでしょう。
また、aplayはmp3ファイルを再生できません。wavのみです。
試しにmp3ファイルを再生してみたところ、ひたすらノイズが流れ続けました。
参考:IT女子のラズベリーパイ入門奮闘記様
5.mpg321
mp3ファイルを再生するためにmpg321というモジュールがあるそうです。
(正直、vlcさえインストールしてしまえば何でも出来てしまうのですが…)
まずはインストール。
$ sudo apt-get install mpg321
これらも3.や4.と同様にsubprocessでコマンド実行します。
#-*- cording: utf-8 -*-
import subprocess
subprocess.call("mpg321 ファイル名.mp3", shell=True)
mpg321での動画再生等は上記のIT女子ラスパイ奮闘記様に詳細が記してあります。
おまけ1:音楽出力先の指定
HDMIかイヤホンジャックかどちらから音楽出力するかを指定する方法として、
- コマンドラインでの指定
- raspi-configでの操作
の2種類があります。
1. コマンドラインでの操作
$ amixer cset numid=3 <1>
<>の部分が1でイヤホンジャック、2でHDMIでの出力になります。
0だと自動判別です。
参考:Nosの日記様
Raspberry Pi公式ドキュメントを日本語訳様
2.raspi-configでの操作
まずConfigration Toolを開きます。
$ sudo raspi-config
その後 7.Advanced Option → A9 Audio から出力先を選択します。
完了。
おまけ2:音質
どの方法を使用したにせよ、イヤホンジャックからそのまま出力させるとノイズが乗ります。
解決方法としては、
- DACを使用する
- USBスピーカー、ヘッドフォンを使用する
- HDMI端子から何とかして音楽を引き出す
という3つがありそうです。(もしかしたら他にもあるかもしれませんが…)
試しにUSB-イヤフォンジャック変換器を用いてUSBから音楽を出力させてみましたが、ノイズが乗らなくなりました。
USBからの音楽出力にはこのような準備が必要になります。
まとめ
pythonで音楽再生をしようとした際、ERRORばかり吐かれて発狂したのでまとめ記事を書きました。
お役立ていただければ幸いです。