フォルダに音声や動画のファイルを入れておくと、すべての音声、動画ファイルを再生する Python のスクリプトについてまとめておきます。
以下の環境で動作確認をしています。
環境: Raspberry Pi(buster 他)
背景 ~ フォルダ内の音声・動画ファイルを再生したい
最近の Raspberry Pi (bullseye、buster など)には、音声や動画を再生できる「VLCメディアプレーヤー」が標準で入っています。
ユーザーインターフェース上の操作で、mp3 や wav、mp4 ファイルを再生することが可能です。
このソフトウェアをターミナルや Python から操作できれば、指定時刻に音楽や時報、お知らせを鳴らすなど、自由なカスタマイズや自動化が可能になります。
ところが、ラズパイで音声を再生する方法をネット検索で探すと、新たなソフトウェアをインストールするなどとしたものが多いです。すでに動くソフトウェアが入っているのであれば、標準機能だけで動かしたいところです。
そこで、いくらか試行錯誤してみたところ、ターミナルや Python から VLC メディアプレーヤーを用いてファイルを再生することができましたので、ポイントをまとめておきます。
VLC メディアプレーヤーや Python は、すでに、Raspberry Pi に標準で入っていますので、標準機能のみを用いて音声や動画ファイルを再生することが可能、ということになります。
当初、音声ファイルが再生できればよいと思っていたのですが、動画ファイルを入れてみたころ、とくに問題なく音声の再生ができました。スクリプトを修正すると、ランダム再生なども可能となります。
音声、動画ファイルを再生する手順
再生用のフォルダ、音声・動画ファイル、スクリプトを準備する
① 以下を参考に、Raspberry Pi にフォルダ(例:”sound1″)を作成してください。そのフォルダの中にさらに、音声ファイルを入れるフォルダ(例:”folder01″)を作成してください。
フォルダ: “/home/pi/sound1/folder01/”
② ①のフォルダ “folder01” に音声、動画ファイルを入れてください。音声や動画は複数でも動作します。
例: test1.mp3, test2.wav, test3.mp4
※ ファイル名は、半角英数字としてください。日本語は、(Windows からコピーしたときなどに)読み込まないことがあるようです。
※ なお、Windows のリモートデスクトップを使って Raspberry Pi にアクセスしている場合は、たとえば、Windows 側で音声ファイルをコピーして、Raspberry Pi のリモート画面のフォルダ(”folder01″)上で「貼り付け」を実行することで、Windows と Linux 間で簡単にデータを移行できます。
※ ファイルのフォーマットは、mp3、wav、mp4 ファイルについて動作確認をしています。複数のフォーマットに対応しています。
③ ①のフォルダ “sound1” 内でテキストファイルを作成して “sound1.py” 等のファイル名とし、以下のサンプルスクリプトをコピー&ペーストして保存してください。
もし、①、②で、フォルダの場所やフォルダ名を変更した場合は、スクリプト内のパス(path1)の記載を修正してください。
音声・動画を再生する手順
④ 事前に、Raspberry Pi にスピーカーを接続し、mp3 などの音声・動画が再生できることを確認してください。音量も調整しておきます。
⑤ スクリプトを実行する場合は、Raspberry Pi 上でターミナルを起動し、以下のコマンドを実行してください。
$ python /home/pi/sound1/sound1.py
→ 音声が鳴れば成功です。
★ なお、以前の Raspberry Pi では、3.5mm ステレオミニプラグでのスピーカー/ヘッドホンがデフォルトで動作すると思います。設定は、Raspberry Pi の画面右上のスピーカーのアイコンを右クリックし、チェックマークを切り替えることで設定を変更できると思います。HDMI モニターのスピーカーやUSB スピーカーでも動くと思います。
スクリプトの説明
・ import glob as gl1 は、フォルダ内の全ファイルを一括で取得するために使っています。
・ import shlex と subprocess とした部分は、コマンドプロンプトを実行するために使います。
・ 関数 play_vlc1() は、Raspberry Pi の「VLCメディアプレーヤー」を実行するための関数です。
・ path1 とした行で、音声ファイルが入っているフォルダを指定しています。
音声フォルダを変更する場合は修正してください。
・ ”a1 = …” としたところで、指定したフォルダ(path1)内のすべてのファイルを取得しています。
フォルダ内にテキストファイルなどを入れてしまうと、エラーとなると思いますので、用途に応じて、”*.*” とした部分を “*.mp3” 等に限定するなど修正をしてください。
・ 取得したすべての音声ファイルを再生するため、for ループで繰り返し実行します。
for ループを外して書き換えることで、たとえば指定したひとつの音声ファイルのみを実行するなど、自由にカスタマイズすることが可能です。
・ for ループの中で、音声ファイルのフルパス file1 を取得します。このパスを play_vlc1( file1 ) に渡すことで、音声・動画を再生します。
・ 冒頭の def play_vlc1( file1 ) で、音声・動画の再生を実行しています。cmd1 とした行で、実行するコマンドの文字列を作っています。具体的には、”cvlc – -play-and-exit [ファイルのパス]”の文字列を作っています。
この “cvlc … ” は、VLCメディアプレーヤーを実行するコマンドです。
同コマンドをターミナル上で実行すると、Python を使わなくても音声ファイルを個別で再生することが可能です。
・ arg1, ret1 とした行で、コマンドを実行しています。この記載は、Linux のターミナルでのコマンドを Python 側から実行する際のお約束という理解でよいです。
・ tm1.sleep( 3 ) としたところで、複数の音声ファイルを再生する間に、3秒の待ち時間を入れています。
音声が連続で再生されると違和感があるため、典型例として待ち時間を入れています。数値自体は、使いたい状況に応じて微調整をしてください。
うまく動いたら & 発展編
・ うまく動いたら、フォルダに音声や動画を追加して、1つの/複数の/すべてのファイルが再生できるか確認してみてください。
・ このスクリプトを corntab -e で登録しておけば、指定時刻にフォルダ内の音声・動画を自動再生することが可能となります。
・ また、folder01, folder02 など、音声を入れるフォルダをたくさん作っておけば、スクリプト上からフォルダを切り替えて再生するなど、カスタマイズも容易です。
・ また、今回のスクリプトでは、個々のファイルに対して再生コマンドを実行しています。for ループの部分を外して、フォルダに対して同コマンドを実行してみたところ(play_vlc1() 関数の引数に、mp3 ファイル等のフルパスではなく、フォルダを入力する)、フォルダ内のファイルを一括で再生できました。
さらに、コマンドに – -random というオプションを加えると(”cvlc – -play-and-exit – -random [フォルダのパス]” とすると)、フォルダ内の複数のファイルに対し、ランダム再生が可能となりました。
(”- -” としたところは、サイトの表示の都合でこのように記載しています。実際はスペースを入れずにマイナス記号を2つ続けて記載してください。)
・ cvlc のコマンドの詳細については、ターミナルで “cvlc –help” を実行し、ヘルプを参照してみてください。手元の Raspberry Pi で確認する限りでは、動くオプションと、動かないオプションがあるようです。
・ 音声ファイルによっては、ダウンロード先によって音量がバラバラだったりします。音量のレベル合わせの方法については、下記の関連リンクにまとめています。
・ また、cron と USB スピーカーの組み合わせで音声や動画ファイルの再生を自動化しようとすると、多少設定が必要となりました。これについても下記の関連リンクを参照してみてください。
まとめ
フォルダに音声や動画ファイルを入れておくと、すべてのファイルを再生するスクリプトについてまとめました。
新たなソフトウェアのインストールは極力避け、Raspberry Pi の標準機能だけで動くよう意図しています。
なお、音声の再生ができたら、指定時刻に時報を鳴らす方法などについてもまとめています。もし関心があるようでしたら、以下のリンクも参照してみてください。
関連リンク
・ Raspberry Pi で時報を鳴らす 【Python】
・ Raspberry Pi を自動で起動、シャットダウンする
・ 指定範囲を繰り返し再生する音楽プレーヤー【Python】
・ ブラウザで動く音楽プレーヤー 【JavaScript & Python】
サンプルスクリプト sound1.py
import glob as gl1
import shlex as sl1
import subprocess as sp1
import time as tm1
def play_vlc1( file1 ):
cmd1 = "cvlc --play-and-exit " + file1
print( cmd1 )
arg1 = sl1.split( cmd1 )
ret1 = sp1.call( arg1 )
tm1.sleep( 3 )
path1 = "/home/pi/sound1/folder01/"
a1 = gl1.glob( path1 + "*.*" )
print( a1 )
for i1 in range( len( a1 ) ):
file1 = a1[i1]
play_vlc1( file1 )