さて、備忘録を兼ねての記事です。
NodeRedでwavファイルを定時に再生するというアプリを家庭内に
配信しています。要は子供に起きろという放送(笑)
個々の部屋にはamazon echoがあり、ラズパイとはbluetoothで接続させて
外部スピーカーとして使っています。
以前はalexaのスキルとかを駆使していましたが、認証が面倒で仕様が変わる
のに対応していかないといけなく、そもそもLAN内で完結したかったので
外部スピーカー化がお薦めです。
まあ、それはうまくいっているのですが、ラズパイ直にスピーカーをつないで
います。2000円くらいのやつですが、ここへも再生したいのですが、
wavの再生コマンドと言えばaplayです。
aplay ファイル名
で簡単に再生してくれます。
aplay -D bluealsa ファイル名
的にアドレス指定で設定すれば再生してくれます。
ということでこれをシェルスクリプトで設定してNodeRedから
コマンド実行ノードで指定するだけなのですが、なぜかbluettoothはうまくいくのに
スピーカー直はエラーがでてしまうという現象に悩まされました。
「ファイルが見つかりません」になるのです。
いや、あるんだけど...
シェルから直にコマンド実行すると再生されます。
以前は動いていたはずなんだよな~~と
いろいろ試すとどうもaplayの引数解釈の問題らしいと疑りました。
NodeRedからと直実行では実は同じではないんですよね。
Pythonやってるとわかるのですが、子プロセスでの実行の場合
環境変数の引継ぎとかの問題があります。
aplayの場合何を見ているのかわからないですが、出力先の指定をしていないので
そこが問題のようです。
黙っているとphoneジャックという思い込みですね。
無指定なんでエラーですよということだと判断しました。
ということで -D オプションをちゃんと書くということなのですが、
この場合デフォルト指定でいいので、
aplay -D sysdefault ファイル名
と書くと、しっかり再生してくれました。
子プロセスの実行問題の勉強になりました。
次回は音声合成の紹介です。
ではでは。