Raspberry Pi で時報を鳴らす 【Python】

Raspberry Pi

Raspberry Pi を使って、できるだけ簡単に時報を鳴らす手順とスクリプトについてまとめておきます。

以下の環境で動作確認をしています。
環境:
・ Raspberry Pi (bullseye)、スピーカー
・ Windows パソコン(Raspberry Pi の設定用、リモートデスクトップの設定済み。)
※ あらかじめ、Raspberry Pi と Windows パソコンは、Wi-Fi でローカルネットワークに接続済み。
※ また、Raspberry Pi には、RTC(リアルタイムクロック)の設定済み。(設定をする場合は、下記の関連リンクを参照してください。)

背景 ~ ラズパイで時報を鳴らす!

日頃、Raspberry Pi で時報を流して活用しています。

具体的には、Raspberry Pi を自動で起動、シャットダウンするよう設定しておきます。
そして、7:30、8:00、12:00 など、設定した時刻になると時報を自動で鳴らすようにしています。
音声で自動で時報を流すようにすると、離れた場所で別の作業をしていても時刻が把握できるため、とても便利です。

ということで、Raspberry Pi で時報を流すための手順と Python のスクリプトについてまとめ、公開しておくことにします。

なお、ネット検索をすると、検索結果の上位に音声合成ソフトウェアを使って時報を鳴らす事例が出てきます。
しかしながら、時報を鳴らすたび、同じ音声の合成を毎日のように実行するのでは、無駄な処理が増えてしまいます。本来、音声ファイルの生成と再生はわけるべきです。また、Raspberry Pi での処理はできるだけ、軽くしたいところです。
そこで、時報で使用する音声(mp3ファイル)自体は、事前に別途、作成しておくことにします。
また、音声の再生は、Raspberry Pi に標準で入っている「VLC メディアプレーヤー」を使うことにします。
このような構成にすると、Raspberry Pi に新たなソフトウェアなどをインストールすることなく、時報の再生が可能となり、とても便利です。
また、同様の手順で、インターネットから得た天気予報を音声で流すようにするなど、応用範囲も広がります。

設定手順

音声データの入手・作成

① 時報として鳴らす音声データ(mp3 ファイル)を作成/入手します。

たとえば、下記のリンク(いずれか)にアクセスします。テキストボックスに「時刻は7時半です」等の文字列を入力し、ボタンをクリックすると、音声データが生成されます。生成したデータは mp3 形式等でダウンロードできます。
・ 日本語 音声読み上げソフト|音読さん (ondoku3.com)
・ テキスト→音声 変換(読み上げ)【無料】 (cman.jp)

※ また、音声を自力で合成するのであれば、Raspberry Pi に音声合成のソフトウェアをインストールして生成しても問題ありません。おそらく上記のリンクとほぼ同様の音声が生成できると思います。
※ 音声データや関連ファイルをサイトからダウンロードして使用する場合は、各サイトのライセンス条件、制限事項に従ってください。

② 一例として、以下の内容で音声データを作成し、mp3 形式でダウンロードしてください。

時刻は7時半です   T07_30.mp3
時刻は8時です    T08_00.mp3
時刻は8時半です   T08_30.mp3
時刻は9時です    T09_00.mp3
時刻は12時半です  T12_30.mp3
時刻は13時です   T13_00.mp3
時刻は14時半です  T14_30.mp3
時刻は15時です   T15_00.mp3

※ 時報を追加したい場合は、同等の要領で音声データを追加してください。
忙しい時間帯などは5分おきでファイルを作成しておき、5分おきで時刻を再生する、などが可能です。
※ 「時刻は」の音声を入れているのは、いきなり数字をいうようにすると、他ごとをしている際に聞き逃すことがあるためです。

③ ダウンロードした mp3 ファイルについては、ファイル名が上記となるよう修正してください。
ファイル名は、すべて半角英数字とし、”T” + “時” + “_” + “分” + “.mp3” の形式とします。
“時”、”分” はそれぞれ半角数字2桁で指定します。また、”分” は、5の倍数(5分刻み)とします。
音声の内容とファイル名がかならず1:1で対応するファイル名としています。

※ 以下のサンプルスクリプトでは、スクリプトを実行すると、実行直後の5分刻みのファイル名を生成し、対応するファイルを探して自動で再生するようにしています。
※ mp3 ファイルの作成は Windows パソコンなどで行って、作成後、リモートデスクトップで Raspberry Pi にコピー&ペーストで移植すると作業が楽です。

Python のスクリプトと音声データの設定

④ あらかじめ、Raspberry Pi にスピーカーを接続し、音声が再生できるようにしておきます。
音量も調整しておきます。
⑤ 以下を参考にして、Raspberry Pi にフォルダ(sound_clock1)を作成します。
例: /home/pi/sound_clock1/
⑥ ⑤のフォルダの中に、テキストファイル sound_clock1.py を作成し、下記のスクリプトを貼りつけて保存します。
⑦ ⑤のフォルダの中に、さらにフォルダ sound1 を作成します。
例: /home/pi/sound_clock1/sound1/
⑧ ⑦のフォルダに、②~③で作成・入手した音声ファイルを入れます。
例: /home/pi/sound_clock1/sound1/T07_30.mp3、T08_00.mp3、…、T15_00.mp3

手動での動作確認

手動での動作確認の一例を以下にまとめておきます。
⑥の Python のスクリプトを手動で実行し、音声が再生できることを確認してみます。

⑨ ⑥のスクリプト sound_clock1.py をテキストエディタなどで開き、以下の[1]、[2] となるよう、スクリプトを修正します。

[1] スクリプトの末尾近辺で、コメントアウトしてある行の冒頭の “# ” を削除して保存します。
※ コメントアウトしてある行では、再生するファイル名を強制的に “T08_00.mp3″ に差し替えて、再生を実行するようにしています。もし、”T08_00.mp3” というファイルが “sound1” フォルダ内にない場合は、フォルダに入れた任意のファイル名に修正してください。
[2] さらに、スクリプト末尾で、tm1.sleep( sec1 ) としている行の冒頭に “# ” を入れ(コメントアウトして)、保存します。
(”tm1.sleep( sec1 )”   →   “# tm1.sleep( sec1 )” に書き換える。)

※ サンプルスクリプトでは、0 分 0 秒などのちょうどきっかりの時刻で音声が鳴るよう、待ち時間 sleep を入れています。
動作確認をする場合は、この待ち時間は不要ですので、コメントアウトしてすぐに音声が再生されるようにします。

⑩ ターミナルを起動し、以下を参考に Python のスクリプトを実行してください。
例: python /home/pi/sound_clock1/sound_clock1.py

→ 音声が再生できたら、成功です!

うまく動いたら、[1]、[2] の修正をもとに戻し、スクリプトを保存してください。

音声が鳴らないとき
・ Raspberry Pi につなげたスピーカーの接続、電源、ボリュームの設定が適切か、確認してください。
・ Raspberry Pi の GUI 画面右上でのスピーカーの種別の設定、ボリュームの設定が適切か、確認してください。
・ mp3 ファイルを直接ダブルクリックし、Raspberry Pi の OS 上で直接、音声が再生できるか確認してください。他の音楽等の mp3 ファイルを再生し、確認してください。
・ mp3 のファイル名が間違っていないか確認してください。実際のファイルのありか、パスと、スクリプトに記載されたパスが完全に一致しているか確認してください。フォルダ名など、どこか変更していないか、を確認してください。

定期的に自動で音声を再生する(cron の設定)

手動で動作することが確認できたら、つぎに、Raspberry Pi  で自動で実行するよう設定します。
具体的には、Linux の cron という機能を使って、時刻とコマンドを指定することで、自動でスクリプトを実行します。

⑪ ターミナルを起動し、”crontab -e” + [enter] と入力ます。(cron を起動します。)
⑫ 以下を参考に、cron の編集画面の末尾等に時刻とコマンドを追記します。

例:
29,59 07,08,12,14 * * * python /home/pi/sound_clock1/sound_clock1.py

※ 上記の例は、時刻 7:29、7:59、8:29、8:59、12:29、12:59、14:29、14:59 に python のスクリプト sound_clock1.py を実行する例です。
時報を鳴らす時刻の1分前にスクリプトを実行するようにしています。
スクリプトを実行すると、Python のスクリプト側で、7時30分0秒等の時刻に音声が再生されるよう、秒単位で時刻補正のウェイトを入れ、ちょうど 0 秒となるタイミングで音声を再生します。
※ 時刻の補正を入れているのは、cron の設定時刻に極力依存せず、音声データを正しい時刻で再生するようにするためです。
たとえば、時刻の補正をしないと、cron の設定時刻が数分ずれてしまっていると、間違った時刻に音声データを再生してしまう可能性があります。
そこで、再生するファイル名と音声を再生する時刻が必ず1:1で対応するよう、Python のスクリプト側で補正しています。
(過去の経験から、cron の設定時刻と再生ファイル名を突き合わせて確認する手間が完全に解消するよう、Python のスクリプトを作っています。)
※ また、再生する音声ファイル名は、5分刻みとなるようにしています。
たとえば、T07_45.mp3、T07_50.mp3、T07_55.mp3 といった音声ファイルを作っておけば、7:45、7:50、7:55 に時報を鳴らすことが可能です。
※ 曜日によって時報を再生する時刻や回数を変えたい、朝と夜で時報の時間間隔を変えたい、等の場合は、行を追加して設定してください。

⑬ 編集を終えたら、”[ctrl] + x” を入力し、保存して終了します。

→ 設定した時刻に自動で音声が再生されたら、成功です!

cron の説明

・ crontab での書式は、[分] [時] [日] [月] [曜日] [コマンド] の順で記載します。各項目は、半角スペースで区切ります。
・ * と記載すると、すべての分、時、日、…、等となります。

※ なお、上の記載例で ” * * * python … ” とした部分では、” * * * sudo python … ” とする必要はありません。
Python のスクリプトでは、Raspberry Pi に標準で入っている VLC メディアプレーヤーを呼び出していますが、”sudo” 権限では実行ができない仕様となっているため、この記載としています。

※ また、作成したスクリプトの権限設定を表示させると、以下となっています。
ls -al /home/pi/sound_clock1/
-rw-r–r– 1 pi pi xxx xxx sound_clock1.py
drwxr-xr-x 2 pi pi xxx xxx sound1
pi ユーザーでログインしているのであれば、特に権限設定を気にすることなく、前述の手順で動くと思います。

うまく動いたら

※ うまく動いたら、時報を鳴らす時間帯や時間間隔をカスタマイズ、最適化してみてください。
現状のサンプルスクリプトの記載では、音声ファイルを鳴らす間隔は、最短5分おきで指定できます。
たとえば、日頃、朝 8:00 に会社や学校に出かけるのであれば、7:00、7:30、7:40、7:45、7:50、7:55 のように、出かけるまぎわに頻繁に時刻をお知らせする。8:00 には Raspberry Pi や電源含め、完全にシャットダウンする(下記の関連リンク参照)、などの応用が可能です。
必要に応じて音声ファイルを追加して、cron やスクリプトの記載を修正してください。

※ 声のデータではなく、鐘の音、音楽、フリー音源などを鳴らすようにすることも可能です。
この場合、再生する時刻に応じて、ファイル名を上記と同様の要領で設定してください。
スクリプトを修正することで、ファイル名を直接指定することも可能です。

※ 上記は、音声データをサイトからダウンロードする例としましたが、音声を自作しても問題ありません。第三者に公開・配布等する可能性がある場合は、著作権などの観点で音源を自作したほうが安心です。
詳細は省略しますが、テキストを音声にする Python のスクリプトをインストールして、音声を自動生成させる、といった応用も可能です。

サンプルスクリプトの説明

・ スクリプトの冒頭で、必要なライブラリをインポートしています。shlex、subprocess は Linux コマンドを Python から実行するために入れています。
・ def format1( … ) は2桁の数値を生成する関数です。
・ def get_filename1() は、現在時刻を取得して、再生する mp3 ファイルのファイル名を生成する関数です。
まず、関数が実行された現在時刻(n1 時 n2 分)を取得します。
つぎに、現在時刻以降で、mod1 = 5 分刻みでの時刻を求め、ファイル名 TXX_XX.mp3 を生成しています。
たとえば、スクリプトが実行された時刻が 7:58 だったとします。すると、実行した時刻以降で、00 分、05 分、10分、…、55分など、5分刻みとなる時刻を求めます(例:8:00)。
その後、ファイル名 T08_00.mp3 を生成します。この例では、8:00 の時報(T08_00.mp3) を鳴らすには、2分早いです。sec1 = 180 秒待ってから、T08_00.mp3 を鳴らす必要があります。そこで、待ち時間 sec1 を求めます。
関数の末尾で、再生すべきファイル名 T08_00.mp3 と、待ち時間 sec1 を return で返します。
・ def play_vlc1( file1 ) は、音声を再生する関数です。file1 に音声ファイルのフルパスを渡すと、Linux コマンドを生成して再生します。
これは、下記の「フォルダ内のすべての音声ファイルを再生する 【Raspberry Pi】」と同等の関数です。関心のある方は参照してください。
・ その後、path1 の部分で、ファイルのパスを取得し、現在時刻からファイル名 file1 と待ち時間 sec1 を取得します。
・ tm1.sleep( sec1 ) で待ち時間を入れたのち、play_vlc1( … ) を実行することで、正しい時刻で音声を再生します。スクリプトを修正することで、設定した秒数分、事前に音声を鳴らす、などのカスタマイズも可能です。

まとめ

Raspberry Pi で時報を鳴らす方法について、手順とスクリプトをまとめました。

今回のスクリプトを応用すると、天気予報、渋滞情報を流す、室内の温湿度・気圧、外の温湿度を音声でお知らせする、なども可能になります。
他にも Raspberry Pi で使えるスクリプトなどをまとめ、公開しています。
もし関心があるようでしたら、関連リンクなども参照してください。

関連リンク
・ フォルダ内のすべての音声ファイルを再生する 【Raspberry Pi】
・ リアルタイムクロックに関するまとめ 【Raspberry Pi】
・ Raspberry Pi にリモートデスクトップで接続する
・ 
Raspberry Pi を自動で起動、シャットダウンする
・ 起動、終了時にログを出力する 【Raspberry Pi】

外部リンク
・ 日本語 音声読み上げソフト|音読さん (ondoku3.com)
・ テキスト→音声 変換(読み上げ)【無料】 (cman.jp)

サンプルスクリプト sound_clock1.py

import glob as gl1 
import shlex as sl1 
import subprocess as sp1 
import time as tm1 
import datetime as dt1 

def format1( str1 ): 
    return ("00" + str(str1))[-2:] 
    
def get_filename1(): 
    mod1 = 5 
    str1 = dt1.datetime.now() 
    n1 = int( str1.hour)
    n2 = int( str1.minute ) 
    diff1 = mod1 - (n2%mod1) 
    n3 = n2 + diff1 
    if n3 >= 60: 
        n3 = n3 - 60
        n1 = n1 + 1 
        if n1 >= 24: 
            n1 = n1 - 24 
    str2 = "T" + format1(n1) + "_" + format1(n3) + ".mp3" 
    sec1 = diff1*60 -int( str1.second ) 
    return str2, sec1 
    
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/sound_clock1/sound1/" 

file1, sec1 = get_filename1() 
file2 = path1 + file1 
# file2 = path1 + "T08_00.mp3" 
print( file2 ) 

print( "sec:" + str(sec1) )
tm1.sleep( sec1 ) 
play_vlc1( file2 ) 

 

タイトルとURLをコピーしました