2022年11月11日金曜日

音声ファイルを再生するPythonコードをcron実行する

Raspberry Piで音声ファイルを再生するPythonコードを作成したが、それをcron実行しても音声が再生されなかった。調べたところ、環境変数を設定する必要があった。cronでPythonスクリプトを実行して音声を再生させる手順をまとめておく。


環境

Raspberry Pi OS。

$ lsb_release -dr
Description:    Raspbian GNU/Linux 11 (bullseye)
Release:        11
$ python3 -V
Python 3.9.2


Pythonで音声ファイルを再生する

まずは音声ファイルをPythonで再生してみる。ここではPythonからVLCを使って再生する。そのために、PythonでVLCを制御するモジュールをインストールする。

$ pip3 install python-vlc

インストールされたバージョン。

$ pip3 show python-vlc
Name: python-vlc
Version: 3.0.16120
...

以下のコードでスクリプトファイルと同じディレクトリにあるtest.mp3を再生できる。

import os
import time
import vlc

script_dir = os.path.dirname(os.path.realpath(__file__))
media_path = os.path.join(script_dir, 'test.mp3')
p = vlc.MediaPlayer(media_path)
p.play()

# 再生が終わるまで実行を継続する
time.sleep(10)


cronでPythonコードを実行する

作成したスクリプトファイルtest.pyを~/appディレクトリ配下に配置して、cronで実行してみる。

$ crontab -e

ここでは以下のようにcronに設定を追加する。動作確認のために1分ごとに実行させて、ログファイル(test.log)を出力する。

* * * * *  python3 ~/app/test.py > ~/app/test.log 2>&1

ただし、上記のようにcronで実行させても音声ファイルを再生できない。以下のエラーメッセージが出力される。

vlcpulse audio output error: PulseAudio server connection failure: Connection refused


cronで音声ファイルを再生する

cronで音声ファイルを再生できるようにするには、サウンドサーバであるpulseaudioが使用するディレクトリを環境変数PULSE_RUNTIME_PATHに設定する。今回は以下のようなシェルスクリプトのファイル(test.sh)をPythonスクリプトと同じディレクトリに作成し、cronで実行する。

#!/bin/sh

export PULSE_RUNTIME_PATH="/run/user/$(id -u)/pulse"
python3 ~/app/test.py

作成したスクリプトファイルに実行権限を付与しておく。

$ chmod u+x test.sh

このスクリプトファイルをcronで実行すると音声ファイルを再生できる。

$ crontab -e 

動作確認のために以下のような設定をcronに追加する。こうすると1分ごとにPythonスクリプトが実行されて、音声ファイルが再生される。

* * * * *  ~/app/test.sh


0 件のコメント:

コメントを投稿