音声操作でWebラジオを鳴らす

音声操作で音楽を鳴らしたい


Voice Kitソフトウェアを実装した自作スマートスピーカーですが、そのままでは音楽は再生してくれません。
例えば「ラジオを再生して」と話しかけても、「この端末はその操作に対応していません」と、つれない返事が返ってきます。

何か方法はないか?と思って調べましたら、Voice Kitのデモプログラムの中の「assistant_library_with_local_commands_demo.py」を使えば、自分の好きな音声命令を作れて、動作を実行させる事ができるようです。

ただ、「…_local_commands_demo.py」はボタン操作に対応していないため、そのままではラズパイZeroでは動作しないようです。
なので、前回の記事で使用した「assistant_library_with_button_demo.py」をベースに「…_local_commands_demo.py」の動作を上乗せした別のデモプログラムを作る必要がありそうです。

こんな感じで動かせたい

イメージ的には、Volumio2で実現できているWebラジオの再生の感じ。
いくつかのWebラジオ局を登録しておいて、ボタンを押して「ラジオ1」と発話、するとその名前で登録してあったWebラジオを再生開始。以下、「ラジオ2」でも同様。

そのための下準備

①日本語入力を出来るようにする

ターミナル画面で「sudo apt-get update」と入力して、Enterキーを押します。
かなり時間がかかりますが終了まで待ちましょう。
一番下の行が下図のような文字列になればOKです。


次に「sudo apt install ibus-mozc」と入力して、Enterキーを押します。
こちらも多少時間がかかりますが、同様に終了まで待ちましょう。
再起動後、タスクバーに文字入力アイコンが表示されて、日本語に切り替えて使えるようになります。

②mplayerをインストールする

mplayerは各種音楽データの再生が可能なアプリケーションです。ターミナル画面で「sudo apt-get install mplayer」と入力して、Enterキーを押します。
これで自動でインストールされます。

③聞きたいWebラジオ局の情報を入手する

PCのブラウザで「Shoutcast - Home」を開きます。
上端のメニューから「LISTEN」を選択して出てくる画面から、聞きたいWebラジオ局を探します。

聞きたいWebラジオ局が見つかったら、その局の①ダウンロードボタンをクリック、出てくるメニューで②Winamp(.pls)にカーソルを合わせます。(※クリックはしません。)
左下に表示される文字列の最後の③数字部分をメモします。(この場合は「1469526」です)
デモプログラムの変更の際に、この数字でWebラジオ局を指定する事が出来ます。




④念のため、現在のデモプログラムをコピーしておく

念のために、最悪現状に復帰できるように、現在のデモプログラム「assistant_library_with_button_demo.py」をコピーして保存しておきます。

ファイルマネージャーで、「home」>「pi」>「AIY-voice-kit-python」>「src」> 「examples」>「voice」を開いてみると、デモプログラム「assistant_library_with_button_demo.py」がありますので、それをコピーして、適当な別フォルダーにペーストしておきます。

もし、デモプログラムの修正が上手く行かず、Voice Kitソフトウェアが動作しなくなった場合は、変更したデモプログラムと保存してあった元のデモプログラムを差し替える事で元に戻せます。

デモプログラムファイルの変更ですが…

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


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

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

②「アプリケーションの選択画面」で「アクセサリー」を選択、出てくるリストの中から「Text Editor」を選択して、「OK」を選択します。

③「assistant_library_with_button_demo.py」がメモ帳アプリで開きます。
(以降は、右クリックメニューの中に「Text Editor」が登録されます。)

「assistant_library_with_button_demo.py」を変更する

「assistant_library_with_button_demo.py」に追加する文字列は以下のようです。

①ファイルの先頭近くにある「import」項目に「import subprocess」を追加します。
------------------------------------------------------------------------------------
import logging
import platform
import sys
import threading
import subprocess
------------------------------------------------------------------------------------

②中段当たりの「elif event.type == EventType.ON_CONVERSATION_TURN_STARTED:」行の下に「subprocess.call('pkill -KILL -f mplayer', shell=True)」を追加します。
------------------------------------------------------------------------------------
        elif event.type == EventType.ON_CONVERSATION_TURN_STARTED:
            subprocess.call('pkill -KILL -f mplayer', shell=True)
            self._can_start_conversation = False
            self._board.led.state = Led.ON  # Listening.
------------------------------------------------------------------------------------

③さらにその2行下の「self._board.led.state = Led.ON # Listening.」行の下に一行開けて、以下の赤字の文字列を追加します。(赤文字部分をコピーしてペーストして下さい。)
------------------------------------------------------------------------------------
        elif event.type == EventType.ON_RECOGNIZING_SPEECH_FINISHED and event.args:
            print('You said:', event.args['text'])
            msg=event.args['text']
            text = event.args['text'].lower()

            if text == 'ラジオ 1':
                self._assistant.stop_conversation()
                subprocess.call('mplayer -ao alsa:device=plughw=0.1 -playlist http://yp.shoutcast.com/sbin/tunein-station.pls?id=1469526 &', shell=True)
------------------------------------------------------------------------------------
この部分の文字列の最後の行の数字「1469526」が、下準備でメモした聞きたいWebラジオ局を指定するための数字です。

この記述の動作を簡単に説明すると、ボタンを押して発話した内容「ラジオ 1」とデモプログラムの記述「if text == 'ラジオ 1':」にある「ラジオ 1」が一致していれば、その下にある記述(この場合、指定したWebラジオ局をmplayerで再生する)を実行するというものです。

そのまま保存します。

動作を確認する

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

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

②再起動後、「Start dev terminal」ターミナル画面で、「src/examples/voice/assistant_library_with_button_demo.py」と入力して、Enterキーを押します。
デモプログラムが実行されますので、ボタンを押して、「ラジオ1」と発話してみます。
文字列が一行づつ増えていけば動作している証拠です。
しばらくして、指定したWebラジオが再生されればOKです。

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

呼び出し発話とデモプログラムの記述について

上記のデモプログラムの「if text == 'ラジオ 1':」の中の「ラジオ 1」という記述ですが、気を付けないといけないのは、「(カタカナの)ラジオ」+「(半角スペース)」+「(半角の)1」だという事です。

なぜ、それでないといけないかと言うと、Google社の「Google Assistant」という発話内容を分析して、それを文字列に変換するネット上の音声認識サービスが、一番妥当な文字列としてそう変換しているからです。(現在がそうなだけで、将来変わる可能性がありますが。)



逆に言うと、呼び出しの発話は何でも良くて、「Google Assistant」が返す文字列とデモプログラムに記述している文字列が一致さえすれば、OKです。
自分が発話した内容が、「Google Assistant」からどう言う文字列で返されているかは、ターミナル画面に流れるテキストで分かります。



この場合、「You said: ラジオ 1」とあるように、「ラジオ 1」と返されています。
なので、呼び出し文言を変更したい場合は、自分の好きな文言で発話して、その結果をターミナル画面上でコピーして、デモプログラムにペーストして記述すると間違いがないです。

---------------------------------------------------------------------------------------------------------------
追記:
現状、「ラジオ 1」という発話は「Google Assistant」の認識結果と合わないようです。
(「ラジオ 2」はOKなので、なぜ?という気はしますが、どうしようもないですね。)
こういう場合は、「ラジオの一番」というように少し長めの呼び出し文言にすると良いようです。
どの文言が呼び出しに使えるかは、上記の方法で確認可能です。
---------------------------------------------------------------------------------------------------------------

Webラジオ局を増やす

複数のWebラジオ局を、発話に合わせて再生したい場合は以下のようになります。
先ほど追加した「ラジオ1」のための文字列の下に以下のような赤文字列を追加します。
その部分の最後の行の数字(例えば「99500322」)はあらかじめ調べておきます。
------------------------------------------------------------------------------------
            if text == 'ラジオ 1':
                self._assistant.stop_conversation()
                subprocess.call('mplayer -ao alsa:device=plughw=0.1 -playlist http://yp.shoutcast.com/sbin/tunein-station.pls?id=1469526 &', shell=True)

            elif text == 'ラジオ 2':
                self._assistant.stop_conversation()
                subprocess.call('mplayer -ao alsa:device=plughw=0.1 -playlist http://yp.shoutcast.com/sbin/tunein-station.pls?id=99500322 &', shell=True)
------------------------------------------------------------------------------------
同様に、最後の行の数字部分を変える事で呼び出すWebラジオ局を、「ラジオ3」「ラジオ4」と増やしていけます。

「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キーを押します。
これで、再起動後、変更したデモプログラムの記述が自動的に実行されます。

実際の動作は?

ラズパイを再起動させて、動作を確認します。
起動開始して2分くらい待って、ボタンを押して、「ラジオ1」と発話してみます。
しばらくして、指定したWebラジオが再生されればOKです。

課題は?

今のままだと、完全に動作可能になるまでの時間や発話のタイミングが分かり難いですね。
次回以降で改善したいと思います。


コメント