「OK Google」発話でWebラジオを鳴らす

「OK Google」で音楽を鳴らしたい


アンプHATの音質を確認するためにも、Voice KitでWebラジオ再生をさせたいと思います。
前面ボタンのLED点灯、効果音も含めて、動作イメージはこんな感じです。

Webラジオの再生方法は、ラズパイZeroを使った以前の記事と基本的に同じです。
また、前面ボタンのLED点灯と効果音を鳴らす方法も、同じく別の以前の記事と同様です。

ですが、今回のラズパイ(3B、4Bシリーズ)とアンプHATの組み合わせの場合では、一部プログラムの変更が必要な個所がありましたので、その部分の説明に絞って説明したいと思います。

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

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


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

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」がメモ帳アプリで開きます。
(以降は、右クリックメニューの中に「Text Editor」が登録されます。)

「assistant_library_with_button_demo.py」を変更する

「assistant_library_with_button_demo.py」を変更する個所は以下のようです。
※以下の修正内容は、以前の記事1以前の記事2の修正内容を行った後の「assistant_library_with_button_demo.py」への追加修正になります。

①Webラジオの動作の記述の変更

「subprocess.call('mplayer -ao alsa:device=plughw=0.1 -playlist…」
 の部分を
「subprocess.call('mplayer  -playlist…」
というように「-ao alsa:device=plughw=0.1」の記述を削除します。
(ラジオを複数設定している場合は、他も同様に修正します。)
------------------------------------------------------------------------------------
            if text == 'ラジオ 1':
                XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                subprocess.call('mplayer  -playlist http://yp.shoutcast.com/sbin/tunein-station.pls?id=1469526 &', shell=True)
------------------------------------------------------------------------------------

②LED点灯の動作の記述の変更

「GPIO.setup(24,GPIO.OUT)」と「GPIO.output(24, 1)」
の部分を
「GPIO.setup(17,GPIO.OUT)」と「GPIO.output(17, 1)」
というように数字の記述を変更します。
------------------------------------------------------------------------------------
        if event.type == EventType.ON_START_FINISHED:
            self._board.led.status = Led.BEACON_DARK  # Ready.
            self._can_start_conversation = True
            # Start the voicehat button trigger.
            GPIO.setmode(GPIO.BCM)
            GPIO.setup(17,GPIO.OUT)
            GPIO.output(17, 1)
            logging.info('Say "OK, Google" or press the button, then speak. '
                         'Press Ctrl+C to quit...')
------------------------------------------------------------------------------------

③効果音の記述の変更

subprocess.call('speaker-test -Dplughw:0,1 -r 22050…」
 の部分を
subprocess.call('speaker-test  -r 22050…」
というように「-Dplughw:0,1」の記述を削除します。
------------------------------------------------------------------------------------
        elif event.type == EventType.ON_CONVERSATION_TURN_STARTED:
            subprocess.call('pkill -KILL -f mplayer', shell=True)
            subprocess.call('speaker-test -r 22050 -c1 -l1 -t wav -w /home/pi/AIY-voice-kit-python/src/listen.wav', shell=True)
            self._can_start_conversation = False
            self._board.led.state = Led.ON  # Listening.
------------------------------------------------------------------------------------

さらに、Webラジオの記述の部分の
subprocess.call('speaker-test -Dplughw:0,1 -r 22050…」
 の部分を
subprocess.call('speaker-test  -r 22050…」
というように「-Dplughw:0,1」の記述を削除します。
(ラジオを複数設定している場合は、他も同様に修正します。)
------------------------------------------------------------------------------------
            if text == 'ラジオ 1':
                XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                subprocess.call('speaker-test -r 22050 -c1 -l1 -t wav -w /home/pi/AIY-voice-kit-python/src/OK.wav', shell=True)
                XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
------------------------------------------------------------------------------------

修正が出来ましたら、そのまま保存します。

動作を確認する

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

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

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

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

---------------------------------------------------------------------------------------------------------------
追記:
現状、「ラジオ 1」という発話は「Google Assistant」の認識結果と合わないようです。
(「ラジオ 2」は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キーを押します。
これで、再起動後、変更したデモプログラムの記述が自動的に実行されます。

動作的に課題は?

手を使わずに「OK Google」の発話からWebラジオの再生まで出来るようになったので、一応OKなのですが、実は大きな問題があります。

それは、Webラジオ局を途中で切り替えたい時です。
Webラジオの再生中はその音が大きいため、「OK Google」の発話がマイクに届かないので、ラズパイ側が反応してくれません。

回避する方法は、再生中の曲の終わりの無音部分のタイミングで、「OK Google」するくらいです…。
まぁ、どうしても曲の途中でWebラジオ局を切り替えたい場合は、前面ボタンを押せばいいのですが。

実際、Webラジオ再生の音質はどうか?

「零函 (zero-bako)」を使ったスマートスピーカーの場合は、GPIO端子を使った「PWMオーディオ」というアナログ信号出力方法でした。
なので、音楽再生中は気にならないのですが、曲間など無音の部分で「ジー」や「ジジ」といったノイズが絶えず聞こえていました。

今回のアンプHATを使ったスマートスピーカーの場合は、「I2S」でのデジタル信号出力、HAT内の専用回路でのデジタル>アナログ変換の方式なので、その辺のノイズが一切なく、無音の部分はほぼ完全に無音です。

音質の向上に関しては「非常に効果あり」です。



コメント