NAS内の音楽ファイルを再生

スマートスピーカーからNASにアクセス



「Pi函 (pi-bako)」を使ったスマートスピーカーですが、音楽再生用と考えた場合制約が多いです。
Voice Kitの仕様上、市販のGoogleスマートスピーカーのようにはオーディオ関係のコマンドを受け付けてくれません。(「この端末はその操作に対応していません」と言われて終わり…)

とは言えベースにしているのはラズパイOS(Raspbian)ですので、mplayerを使えば、mp3のような音楽ファイルの再生自体は可能なはずです。

問題はどこに音楽ファイルを置いて再生させるかですが、方法はいくつかあります。

①USBメモリーに音楽ファイルを入れてUSB端子に挿す
②起動用MicroSDカードの空きスペースに音楽ファイルをコピーする
③NASにある音楽ファイルにアクセスさせる

今回は一番スマートで使い勝手がよさそうな「③NASにアクセス」を実現したいと思います。
※NAS(Network Attached Storage)は、LAN接続できる記録デバイスの事です。

まずNASの各種情報を確認

ラズパイからNASにアクセスする際に必要な情報を調べておきます。

①NASのIPアドレスと使用フォルダー(192.168.0.2/sda1/PUBLIC、等)
②アクセスするユーザーID
③アクセスパスワード

これらはNASを導入した際に最初に決めているはずですので、どこかで確認できるはず…。

ラズパイとNASを繋ぐには…

---------------------------------------------------------------------------------------------------------------
以下の説明について。
当方、プログラミングについてはほとんど素人です。
ネットにある関連記事を参考に、適当にプログラムのコードを弄ってます。
結果オーライで運よく上手くいっているだけの可能性が大きいです。
ですので、もし参考にされる場合は、あくまで自己責任でお願いします。
---------------------------------------------------------------------------------------------------------------

いつものようにPCからVNCで接続して、その画面からラズパイの中のファイルを変更します。
VNC画面(ラズパイ側のデスクトップ画面)でタスクバーのターミナルアプリケーションアイコンをクリックして、ターミナル画面を立ち上げます。


①/mnt/nasフォルダーを作る

ターミナル画面で、「sudo mkdir /mnt/nas」と入力して、Enterキーを押します。(PC画面上で上記の文字列をコピーしてターミナル画面上でペーストしてもOKです。)
このコマンドは「mntフォルダーの中にnasと言うフォルダーを作る」くらいの意味です。

続けてターミナル画面で、「sudo chmod 777 /mnt/nas」と入力して、Enterキーを押します。
このコマンドはnasフォルダーにラズパイ中で使用する際の使用権限を与えるものです。

②/etc/fstabを修正する

ターミナル画面で、「sudo nano /etc/fstab」と入力して、Enterキーを押します。
このコマンドは「bootフォルダーの中にあるfstabというファイルを文字編集アプリ(nano)で開く」くらいの意味です。

今回入力する文字列は横に長いので、ターミナル画面自体を横に広げておくと見やすいです。

「#」のある行の上に1行追加して、以下の文字列を追加します。
------------------------------------------------------------------------------------
//[①IPアドレスと使用フォルダー] /mnt/nas cifs username=[②ユーザーID],password=[③パスワード],file_mode=0777,dir_mode=0777,iocharset=utf8,defaults,vers=1.0 0 0
------------------------------------------------------------------------------------
[①IPアドレスと使用フォルダー]、[②ユーザーID]、[③パスワード]の所には、調べておいたNASの情報を入れます。

[①IPアドレスと使用フォルダー]と「/mnt/nas」の間に1個スペースが必要です。



そのまま保存します。

キーボードの「Ctrl」キーを押しながら「x」キーを押すと、保存するか聞いてきますので、「y」キーを押します。
ファイル名をconfig.txt(元のまま)にするか聞いてきますので、「Enter」キーを押して保存完了ですので、ターミナルアプリケーションを終了させます。

③/etc/rc.localを修正する

ターミナル画面で、「sudo nano /etc/rc.local」と入力して、Enterキーを押します。

一番下の「exit 0」の上に行を追加して、以下の文字列を追加する
------------------------------------------------------------------------------------
sleep 20
sudo mount -a
------------------------------------------------------------------------------------



同様に、そのまま保存します。

④raspi-configで起動設定変更

ターミナル画面で、「sudo raspi-config」と入力して、Enterキーを押します。



「3 Boot Options」>「B2 Wait For Network at Boot」に設定して、終了します。

その後、メニューからラズパイを再起動(Reboot)させます。


NASにアクセスできるか確認

再起動後、ファイルマネージャーで「mnt」>「nas」フォルダーを開いて、その中にNASの中で使用しているフォルダーが追加されていればOKです。


これは、ラズパイ内のその領域に実際にそのフォルダーやその中のファイルがある訳ではなく、あくまで仮想的に置かれているだけです。
そのフォルダーを開くと、その時点でNASにアクセスして、その中身を表示します。

ですが、この仮想フォルダーのパス(例えば/mnt/nas/Music)でラズパイからアクセス可能になっている事が非常に重要です。

この後は、mnt」>「nas」>「Music」フォルダーの直下に再生したい音楽ファイルが複数置いてある想定で話を進めます。

どうやってmplayerで再生させるか?

NASにアクセス可能になりましたので、どうやってその中の音楽ファイルを「音声操作」でmplayerに再生させるかですが…。

とりあえず、一番単純に音楽ファイルが入っているフォルダーの中身を全てランダムで連続再生させてみます。音声操作の発話は「曲をシャッフル」とします。

デモプログラムをメモ帳アプリで開く

PCからVNCでラズパイに接続して、その画面からラズパイの中のファイルを変更します。

「home」>「pi」>「AIY-voice-kit-python」>「src」> 「examples」>「voice」にあるデモプログラム「assistant_library_with_button_demo.py」を選択して、右クリックして出てくるメニューから「アプリケーションで開く」を選択します。

②「Text Editor」を選択して、「OK」を選択します。

③「assistant_library_with_button_demo.py」がメモ帳アプリで開きます。

「assistant_library_with_button_demo.py」を変更する

「assistant_library_with_button_demo.py」を変更する個所は以下のようです。

音楽ファイル再生動作の記述を追加

以前の記事でWebラジオの再生の記述を説明しましたが、その下に行を開けて、以下の文字列を追加します。
------------------------------------------------------------------------------------
            elif text == '曲をシャッフル':
                self._assistant.stop_conversation()
                subprocess.call('speaker-test -r 22050 -c1 -l1 -t wav -w /home/pi/AIY-voice-kit-python/src/OK.wav', shell=True)
                subprocess.call('mplayer -quiet -shuffle /mnt/nas/Music/* &', shell=True)
------------------------------------------------------------------------------------

簡単に動作の説明をしますと、発話内容が「曲をシャッフル」と合致した場合、効果音「OK.wav」を鳴らして、その後mnt」>「nas」>「Music」フォルダー内にある音楽ファイルを「ランダムで全て再生する」です。

ちなみに、「Music/*」の「*」が「そこにある全てのファイルが対象」になるという意味の記号です。
もし、「Music」フォルダーの中にさらにフォルダーがあって、その中に音楽ファイルが置いてあるような場合は、Music/*/*」となります。
意味的には、「全てのフォルダーの中の全てのファイルが対象」になります。

変更が出来ましたら、そのまま保存します。


動作を確認する

以下の方法で、修正したデモプログラムファイルがちゃんと動作するか確認できます。

①まず、二重起動を防ぐため、一旦、現在動作中のデモプログラムを停止します。
ターミナル画面で、「sudo systemctl disable voice-recognizer.service」と入力して、Enterキーを押します。
その後、ラズパイを再起動します。

②再起動後、「Start dev terminal」ターミナル画面で、「src/examples/voice/assistant_library_with_button_demo.py」と入力して、Enterキーを押します。

デモプログラムが実行されますので、「OK Google」と発話した後に「曲をシャッフル」と発話してみて、効果音が鳴って、文字列が一行づつ増えていけば動作している証拠です。
しばらくして、音楽ファイルが再生され始めればOKです。

この方法を使うと、変更が間違っていた場合にプログラムが途中で終了するのですぐに分かります。(記述の間違いの部分のヒントも得られる場合もあります。)
再度プログラムを変更して、トライ&エラーで修正が出来ます。

「main.py」ファイルを上書き後、自動起動にする

「Start dev terminal」ターミナル画面上で、デモプログラムが上手く動作しているようなら、それをラズパイの起動時に自動で起動するように設定します。

①「Start dev terminal」ターミナル画面を出して、「sudo cp src/examples/voice/assistant_library_with_button_demo.py ~/AIY-projects-python/src/main.py」と入力して、Enterキーを押します。
これは変更したデモプログラムで「main.py」というファイルを上書きする手順です。
「main.py」が再起動後、自動実行されるプログラムファイルになります。

②ターミナル画面で、「sudo systemctl enable voice-recognizer.service」と入力して、Enterキーを押します。
これで、再起動後、変更したデモプログラムの記述が自動的に実行されます。

実際の動作は?

ラズパイを再起動して動作を確認します。
電源ONにして起動完了までかなり待ちますが(1分くらい)、「OK Google」と言ってから、「曲をシャッフル」と発話すると、音楽ファイルの再生が始まります。

とりあえずは上手く動作しているようです。

再生順番はランダムなので、自分の自由になりませんが、曲のスキップ(次の曲に変える)くらいはやりたい事もあるかもしれません。
なので次回は、ボタンでの「次の曲へ」操作を可能にしたいと思います。

---------------------------------------------------------------------------------------------------------------
追記:
NAS内の音楽ファイルの再生の際、時々一瞬再生が途切れる事があります。
ターミナル画面で再生させると、その瞬間「Audio device got stuck!」が発生しているようです。
USBメモリー内の同じファイルでは問題ないので、おそらくWiFiの通信状態の影響かと思われます。(私の所の通信環境が悪いせいでしょうね…)

mplayerの仕様にオプションでキャッシュを付加できるようなので、やってみました。
(キャッシュサイズの512は適当です)

mplayer -quiet -shuffle /mnt/nas/Music/*
mplayer -cache 512 -quiet -shuffle /mnt/nas/Music/*

再生の途切れはなくなりました!
ターミナル画面上では「Audio device got stuck!」が確認できますので、通信の途切れをキャッシュでカバーしてくれているのではないかと思います。
とりあえずは、OKかな。
---------------------------------------------------------------------------------------------------------------

コメント