以前、作って運用しつつもブラッシュアップ中のRaspberry Pi 3 Model B+とJulius、Open JTalkベースの自作スマートスピーカーがあります。
主な機能は、
尚、ラズパイ用ACアダプタを挿したスイッチ付きコンセントでのON/OFFとは別にラズパイ用boot/reboot/shutdown物理ボタン付き。
音声認識にJuliusを使った自作スマートスピーカーに伝言とメモの機能を実装するにあたり、マイクとスピーカーを専有してしまうOSSやALSAからPulseAudioに移行しました。
ちなみに便利なのでラズパイだけでなく、PC/Debianにも自作スマートスピーカー機能を搭載しています。
自ずとモニタ付きとなるPC版スマートスピーカーには、PC及びラズパイ双方のスマートスピーカー機能のデスクトップアプリとしてPyQt5/Qt Designerによる操作パネルも作成しました。
今回は、タイマー機能を追加してみました。
年月日指定には未対応ですが、分単位の引数1つを指定するカウントダウンタイマー、24時間制で任意の時・分の引数2つを指定する時間指定タイマーです。
とは言え、応答スクリプトはともかくもスマートスピーカーの辞書登録のボリュームを考えるとせいぜい、前者は、5分単位で30分程度まで、後者は、30分単位がいいところかなとは思っています。
尚、過去の時刻を指定した場合には、翌日の当該時刻にアラーム設定するようにしてみました。
当初、シェルスクリプトでatコマンドを使うつもりでしたが、結果、Perlスクリプトでsleepを使うことにしました。
というのは、以下の理由からです。
このタイマー設定のスクリプトに1、3、5、10...など引数を1つ渡せば、「x分タイマー開始」というメッセージと共にタイマーが設定され(その時間x60sec分だけsleepし)ます。
このスクリプト自体には制限は設けなかったので1000分でも50000分でも...が、スマートスピーカー側の辞書登録を考えると5分刻みで30分程度までにしようかと。
また、引数に9 30、14 0、...などを引数を2つ渡せば、「x時x分にタイマーを設定」、過去の時刻を指定した場合、「明日のx時x分にタイマーを設定」というメッセージと共にタイマーが設定され(sleepし)ます。
[2020/04/25:修正]
お恥ずかしい...数値と文字列の演算子間違いにより、誤動作による受け付けない時間があったり、分の"59"と差分の"1"が範囲外になってました...。
これまでご参照くださった方々、すみませんでした。
これも辞書登録を考えると12時間の方が...、ただ、それだと過去時刻の場合、微妙...12時間の場合は、未来時刻のみに...。
タイマー設定は、OSがプロセスとして受け付けてくれる限り、いくつでも追加できます。
アラーム音については、自身が使わせてもらっているDebian(Linux)には、以前タイマーアプリを入れてあったからか、ちょうどよい音源ファイルalarm-clock-elapsed.ogaがあったのでこれを使わせてもらいました。
「2つめのアラームです」といった具合にカウントして発声させることもできますが、省きました。
設定時間になると前者設定の場合、「x分経過」、後者設定では、「x時y分になりました」というメッセージの後、アラーム音が鳴ります。
ハマりポイントは以下2点(何れもスクリプト上のコメントにも書きました)。
1つは、ロケールに対応していないPerl(5.10以降)の標準ライブラリTime::Pieceでの整形・出力結果は、JSTそのものですが、内部的にはGMT扱いのようで一部、日付計算の結果がどうにも合わず、もしや?と気づいて調べるまで若干、時間を費やしました。
もう1つは、mplayerでの再生において端末上でコマンド実行、端末上でスクリプト実行、それとスマートスピーカーからの実行で、それぞれオプションの要不要があって、この相違に気づくまでちょっと手間どりました。
以前、自作スマートスピーカー用にPyQt5/Qt Designerによるスマートスピーカー用デスクトップ操作パネルも作りました。
従前は、意味もなく、スマートスピーカー用操作パネル上のタイマー設定も5分刻みで60分までにしていました。
が、せっかくPCから設定できるデスクトップ版操作パネルなので今日からはタイマースクリプトにおいては既に実装済みの24時間計の時間指定アラームにすることにしました。
Qt Designerで[Spin Box/スピンボックス]を使い、時間は[0-23]、分は[0-59]の範囲で指定可能としています。
前述の通り、1分でも過去の時刻は、明日の時刻として設定します。
あ、間にコロンがあった方がよいか、あとで入れておきます。
あと、PC搭載自作スマートスピーカーのtimer.plは、前述のスクリプトでいけましたが、なぜか、ラズパイの方は、アラーム音源が、バックグラウンドだと鳴らず、フォアグラウンドにする必要がありました。
尚、リモートホストの操作でも書いた通り、他のスクリプト同様、ラズパイ用スクリプトは、PC側からsshで直接指定すると実行できないのでPC側は、シェルスクリプトとしてpingを投げ、通れば、sshしつつ、当該スクリプトをフルパス指定するようにしています。
もちろん、後述のstop_all_timer.plもstop_all_timer.shとして同様にします。
タイマー停止スクリプトは、これだけです。
実行すると「全てのタイマーを停止します」というメッセージに続けてタイマーをリセットしてくれます。
こうすると、いくつあってもtimer.plにマッチするプロセスを全てなかったことにしてくれます。
/path/to/jsayについてやラズパイスマートスピーカーへの反映についての詳細は、「自作スマートスピーカー」他、リンク先を参照してください。