Falconの思うままに

PASCAL好きが、気ままにマニアックなネタを

nodered aplayではまる

さて、備忘録を兼ねての記事です。

 

NodeRedでwavファイルを定時に再生するというアプリを家庭内に

配信しています。要は子供に起きろという放送(笑)

個々の部屋にはamazon echoがあり、ラズパイとはbluetoothで接続させて

外部スピーカーとして使っています。

 

以前はalexaのスキルとかを駆使していましたが、認証が面倒で仕様が変わる

のに対応していかないといけなく、そもそもLAN内で完結したかったので

外部スピーカー化がお薦めです。

 

まあ、それはうまくいっているのですが、ラズパイ直にスピーカーをつないで

います。2000円くらいのやつですが、ここへも再生したいのですが、

wavの再生コマンドと言えばaplayです。

aplay ファイル名

で簡単に再生してくれます。

bluetoothへは

aplay -D bluealsa ファイル名

的にアドレス指定で設定すれば再生してくれます。

ということでこれをシェルスクリプトで設定してNodeRedから

コマンド実行ノードで指定するだけなのですが、なぜかbluettoothはうまくいくのに

スピーカー直はエラーがでてしまうという現象に悩まされました。

「ファイルが見つかりません」になるのです。

いや、あるんだけど...

シェルから直にコマンド実行すると再生されます。

 

以前は動いていたはずなんだよな~~と

いろいろ試すとどうもaplayの引数解釈の問題らしいと疑りました。

NodeRedからと直実行では実は同じではないんですよね。

Pythonやってるとわかるのですが、子プロセスでの実行の場合

環境変数の引継ぎとかの問題があります。

aplayの場合何を見ているのかわからないですが、出力先の指定をしていないので

そこが問題のようです。

黙っているとphoneジャックという思い込みですね。

無指定なんでエラーですよということだと判断しました。

ということで -D オプションをちゃんと書くということなのですが、

この場合デフォルト指定でいいので、

aplay -D sysdefault ファイル名

と書くと、しっかり再生してくれました。

子プロセスの実行問題の勉強になりました。

 

次回は音声合成の紹介です。

 

ではでは。