ボタンでmplayerを操作(gpiozeroでボタン制御)

スマートスピーカーに「次の曲へ」ボタンを追加




以前の記事で「Pi函(pi-bako)」を使ったスマートスピーカーに音量調整ボタン機能を付けましたが、今回はそれの続きです。

前回、NASの中にある音楽ファイルをシャッフル再生できるようにしましたが、再生順番はランダムなので、自分の自由になりません。
なので曲のスキップ(次の曲に変える)くらいはやりたい気もします。

「Pi函(pi-bako)」の背面のプログラム可能な2個のボタンのうち、上ボタンの長押しだけ操作が空いていましたので、ここに「次の曲へ」機能を割り当てたいと思います。

各ボタンの操作はこんな感じです。



mplayerをスレーブモードで操作

再生中のmplayerアプリには、外から命令を与えて操作するための仕組みがあり、それを「スレーブモード」と言います。

mplayerを起動するときに「-slave」オプションを付けるとそのモードになります。

「スレーブモード」になると、「-input file=xxxxx」オプションを付けることで、特定のファイル(xxxxx)に命令が書き込まれると、それを読み込んで、その通りに動きます。

そのため、その特定のファイルを作成するコマンド「mkfifo xxxxx」と、その特定のファイルに命令を書き込むコマンド「echo "pt_step +1" > xxxxx」との組み合わせで使用されます。

ちなみに上記の「pt_step +1」はmplayerへの命令の一例です。(意味は「トラックを1個進める」です)
どんな命令が可能かは、ターミナル画面に「mplayer -input cmdlist」と打ち込みますと一覧が出てきます。

今回は、その特定のファイルを「tmp」フォルダーの中に「omx-input」というファイル名で作成します。(記述的には「/tmp/omx-input」です)

実際のプログラムの変更ですが…

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

デモプログラムを変更する

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

まず、以前の記事で変更したデモプログラム「assistant_library_with_button_demo.py」を変更します。

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

②開いた「assistant_library_with_button_demo.py」の「曲をシャッフル」部分は以下のようになっていると思います。

------------------------------------------------------------------------------------
            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)
------------------------------------------------------------------------------------

③「subprocess.call('speaker-test …」の下に以下の文字列をコピーしてペーストします。

------------------------------------------------------------------------------------
                subprocess.call('mkfifo /tmp/omx-input', shell=True)
------------------------------------------------------------------------------------

④その下のmplayerを動作させる部分の記述を以下のように変更します。赤字部分を追加)

------------------------------------------------------------------------------------
                subprocess.call('mplayer -quiet -shuffle -slave -input file=/tmp/omx-input /mnt/nas/Music/* &', shell=True)
------------------------------------------------------------------------------------

⑤最終的に、以下のようになればOKです。

------------------------------------------------------------------------------------
            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('mkfifo /tmp/omx-input', shell=True)
                subprocess.call('mplayer -quiet -shuffle -slave -input file=/tmp/omx-input /mnt/nas/Music/* &', shell=True)
------------------------------------------------------------------------------------

⑥そのまま、保存します。

⑦再起動後に今回の修正内容が反映されるようにします。

「Start dev terminal」ターミナル画面を出して、「sudo cp src/examples/voice/assistant_library_with_button_demo.py ~/AIY-projects-python/src/main.py」と入力して、Enterキーを押します。

ボタンプログラムを変更する

同様に、以前の記事で作成した「spbutton.py」を変更します。

「home」>「pi」>「AIY-voice-kit-python」>「src」にある「spbutton.py」選択して、右クリックして出てくるメニューから「Text Editor」を選択して、開きます。

②開いた「spbutton.py」の「def held1(btn):」部分は以下のようになっていると思います。(実際の命令が記述されていない状態)

------------------------------------------------------------------------------------
def held1(btn):
    btn.was_held = True
    print("button", btn.pin.number, "長押検知")
------------------------------------------------------------------------------------

一番下に以下の文字列をコピーしてペーストします。

------------------------------------------------------------------------------------
    subprocess.call('echo "pt_step +1" > /tmp/omx-input', shell=True)
------------------------------------------------------------------------------------

④最終的に、以下のようになればOKです。

------------------------------------------------------------------------------------
def held1(btn):
    btn.was_held = True
    print("button", btn.pin.number, "長押検知")
    subprocess.call('echo "pt_step +1" > /tmp/omx-input', shell=True)
------------------------------------------------------------------------------------

⑤そのまま、保存します。

以上でプログラムの変更は完了です。


実際の動作は?

ラズパイを再起動して動作を確認します。

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

その後、ボタン2(背面の上側ボタン)を長押しすると、一旦再生が止まり、次の曲の再生が開始されます。

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


コメント