JTalkベースの自作スマートスピーカーにUPnP/DLNAメディア再生機能を追加してみた話。ラズパイ用ACアダプタを挿したスイッチ付きコンセントでのON/OFFとは別にラズパイ用boot/reboot/shutdown物理ボタン付き。ちなみに便利なのでラズパイだけでなく、PC/Debianにも自作スマートスピーカー機能を搭載しています。今回は、これにMediaTombやMiniDLNA/ReadyMediaといったUPnP/DLNAメディア再生機能を追加します。B/Raspbianサーバには、最初から、これらUPnP、DLNAメディアサーバも入れてありました。今回は、これを自作スマートスピーカーから呼び出して再生するだけ。ネット検索してみたところ、mplayerでUPnP/DLNAサーバ上のメディアってどうやって再生するんだ?など、直接再生しようとしてか、妙に難しく考えているっぽく、解決に至っていないケースが多いように見受けられました。TVで検証した記事を見直したりしてUPnP/DLNAクライアントとして使えたRythmboxでも使わないとダメか?なんてハマりかけましたが、よく考えたら簡単でmplayerで実現できました。簡潔に言うとマウントしてから、MPlayerにファイルパスを渡すだけ。先のラズパイ上のNAS・ファイルサーバはSambaで実装してあり、アクセスするマシンからは、当該共有パスをマウント、mplayerにそこから辿った音源ファイルのあるパスを渡すだけでOK。音源パスに[*](階層に合わせてpath/to/*/*など複数も可)を使えば、ディレクトリをプレイリストのように扱うことができるため、音源ファイルを直接指定する必要はなく、スマートスピーカーには好都合。よってコマンドライン(CLI/CUI)操作もできるし、スクリプトに書くこともできます。今回は、映像は考慮せず、音源再生のみにフォーカスしました。何が嬉しい?UPnP/DLNAサーバは自前のサーバであり、例えば、手持ちの音楽CDをリッピングしてできた音源ファイルをアップしておけば、クライアントから再生することができます。いうことは、有線はもちろん、無線LANや無線アクセスポイントなど同じネットワーク内にいるパソコン、タブレット、スマホなどからもオリジナルの音源ライブラリを再生できることを意味します。メディアサーバには、後から追加することもできます。市販の一部のスマートスピーカーにもこうした機能はある(全てのスマートスピーカーが対応しているわけではない)らしいし、今回は、そんなオリジナル音楽ファイル再生機能を自作スマートスピーカーに搭載、音声で再生、停止できるようにしてみたということです。/mnt/naspi@raspberrypi~~$NetBSD上のSamba共有パスにWindows/Fedora/NetBSDからアクセスにも書きましたが、Linuxからなら、Samba共有のマウントは、このようにすればよいでしょう。リンク先にある通り、予め必要なパッケージもありますが、既にSambaサーバが稼働しているのであれば、それらはあるはず。リンク先では、NetBSDでサーバを立てたこともあり、smbpasswdを使いましたが、ある時点からpdbeditに切り替わったようです。自身は、この仕様変更に伴うものではないはずですが、ここで少しハマりました。-Lで出力されたユーザー一覧の結果があっていません。username=samba]としていたことで権限がないだの、そんなパスはないだのと無駄にアクセスできずに時間をとられました。/mnt/nas/path/to/music/*/*pi@raspberrypi~~$マウントさえしてしまえば、あとは、MPlayerにファイルパスを渡すだけです。前述の通り、アスタリスクで抽象化でき、プレイリストのように振る舞ってくれるのは好都合。ファイルパスにスペースがあるとエラーになるシーンもありますが、これは大丈夫でしました。mysmartspeaker.eucjppi@raspberrypi~$自作スマートスピーカーの音声認識ソフトウェアJuliusの独自辞書に今回のオリジナル音源再生時の呼びかけ情報を追加し、eucjpに変換しておきます。今回は、「音楽かけて」と呼びかけた時、Juliusが「音楽再生」と認識、テキスト出力したものを自作スクリプト./voicerecieve.plの条件分岐でこれに該当した場合、音声メッセージ「CDライブラリを再生します」に続き、手持ちの複数のCDからリッピング、ラズパイ/DLNAサーバ上にアップしてあるオリジナルミュージックライブラリが再生されるようにしました。&");}...pi@raspberrypi~$Juliusの音声テキスト変換出力結果を受ける自作スマートスピーカー用スクリプト./voicerecieve.plは、このように編集しました。メディアサーバ上の音源を再生する際には、my_music.shを呼び、これまで個別にpkillしていたコマンドをstop_radio.shにまとめることにしました。stop_radio.shにまとめたのは、音源混線回避にあたり、スクリプトをよりスマートにするため。いうのもラジオと天気予報や日付時刻などは再生が被っても、むしろ都合がよいこともありますが、複数のラジオが再生され、混線する可能性があり、そうなると何とも気色悪い響きになることがあったのですが、わかっていつつも面倒で対策は先延ばしにしていました。今回、mplayerによる再生のみならず、メディアサーバパスをマウントしており、再生を停止する際には、DLNAメディア(ラズパイ)サーバを常時起動していない関係でアンマウントもしておきたい、となるとラジオ停止時の処理に追加することになるので、この機会にスクリプト化することにした次第。ラジオや音源再生の条件分岐全て最初にこのスクリプト行を追加しておけば、pkillしてから再生するため、誤動作による混線を回避できます。/mnt/nas/path/to/minidlna/music/*/*fipi@raspberrypi~$音源再生スクリプトmy_music.shは、こんな感じにしてみました。mountは、通常、root権限が要りますが、systemd(デーモン)のサービスファイル内でsuしない限り、Juliusも自作スクリプトもroot起動するため、スクリプト上でsudoを付ける必要はありません。mount.cifs]にあるようにcifsの場合、mountオプション-oのusername/passwordを直接書く代わりにファイルに書いておくこともできます。/home/xxx/.smb_credencials]しておけばよいでしょう。Linux(やWindows)では、Avahi、macOSでは、Bonjourをインストール済みであれば、mDNSでホスト名.localを使え、ここでもこれを指定することができます。Error」とエラーメッセージがテキスト出力されます。mplayerを見たら、あるじゃんshuffleオプション、mplayerすごし。自身は、今のところ、ラズパイサーバを常時起動しておらず、必要都度起動(要らない時はシャットダウン)している為、mountチェックを入れています。先日、JuliusでPulseAudioを使うにあたり、systemdサービスファイルをユーザー起動に変更したのに伴い、変更が必要になりました。/mnt/nasとします、そもそも、後述のように/etc/fstabにこれ用の記述があれば、こうできるから利便性が高いわけで...。いうか、systemdサービスファイルを結果root起動しつつ、suしており、このスクリプトもroot起動だったから先の記述で事なきを得て気づかなかったという大ボケっぷりでした。PC版、ラズパイ版ともにスマートスピーカーで「音楽かけて」と言っても常に「サーバがマウントされていません」となり、あれ?と思って調べてみて気づくに至りました。/mnt/naspi@raspberrypi~$音源再生スクリプトstop_radio.shは、こんな感じにしてみました。rtmpdumpについては不要ですが、一応、rtmpdumpとmplayerをpkill、マウントポイント/mnt/nasをumount。/mnt/nasをバッククォートで括ってダミーの変数に入れたあと、$?で評価する手もありますが、今のところ、これで支障はありません。rebootユーザー権限でmount/umountさせないとと思い/etc/fstabにNASをnoautoでマウント、再起動。-aしておけば、再起動する必要はないと思いましたが、一応。/etc/fstabでも前述のようにusername/passwordに代えて、これらを書いたファイルを指定すべく、[credentials=/home/xxx/.smb_credencials]を使うこともできます。前述の通り、Linux(Windows)では、Avahi、macOSでは、Bonjourをインストール済みであれば、mDNSでホスト名.localを使えるわけですが、/etc/fstabでもこれを指定することができました。考えたら、systemdでデーモン化しており、.serviceファイルでは、現状、Juliusも自作スクリプトもsuしておらず、root起動となるため、一般アカウントでマウント・アンマウントさせる必要なかったか...と思いきや、なぜか、必要っぽい...。精査していませんが、この場合、mountオプションには、どうもuserとusers両方とも必要な模様。mountによれば、userは、一般ユーザーでもmountできる指定ですが、当該マウントポイントはmountしたユーザーしかumountできない一方、usersは、他のユーザーでもumountできるとあり、/etc/fstabへの追記が必要だとしてもusersだけで事足りそうなのですが...。ラズパイとPCのスマートスピーカー両方やってたら、ちょっと混乱してきた...、systemdの.serviceファイルでsuでもしない限り、やはり、/etc/fstabの設定は要らないかも...。2019/06/09uid/gid/file_mode/dir_modeはなくても可、そもそもrootはさておき、他ユーザーがumountすることはないのでusersも不要でした。逆にこれに読み取り専用のroを追加しておくのは賢明かもしれません。何れにしてもラズパイスマートスピーカーもPC/Debianに搭載したスマートスピーカーもうまいこと機能しています。Gymで強化学習シミュレーションメインメニューホームページ作成メニューウェブ開発メニュー2004-2008-someday。