音声操作の動作改善(音と光で分かり易く)

もっと使いやすくしたい?




前回の記事で、動作的には実現できましたが、実際に使う際にはいくつか問題があります。

①起動後、デモプログラムが音声操作可能になるまでかなり時間がかかるが、その操作可能になるタイミングが分からない。

②ボタンを押して、すぐに発話すると失敗する時がある。(音声受付までにタイムラグあり)

どうもこの問題はラズパイZero自体の処理速度が遅い事が原因で、これはどうしようもなさそうです。
解決策として、操作時に手掛かりになるように音や光で分からせる事が出来れば、今より使い易くなりそうです。

イメージはこんな感じ

①音声操作可能になった時点で、前面のLED(ボタン兼用)を点灯して知らせる。

②ボタンを押した後、音声受付可能になったら、効果音を鳴らして知らせる。

③発話を受けて、内部の音声処理が完了したら、効果音を鳴らして知らせる。



効果音を用意する

鳴らしたい効果音を、ネット上のフリーの効果音サイト、等で探します。
今回は2つ使います。

①「listen.wav」←ボタン押し後、音声受付開始時に鳴る音

②「OK.wav」←音声認識完了時に鳴る音

2つの効果音ファイルを「home」>「pi」>「AIY-voice-kit-python」>「src」に保存します。

LEDの配線を変更



LED⊕の配線を「3.3V」からGPIO24に変更します。
これでGPIO24に電気が流れればLEDが点灯、流れなければ消灯になります。

次はプログラムの変更ですが…

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


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

「home」>「pi」>「AIY-voice-kit-python」>「src」> 「examples」>「voice」にあるデモプログラム「assistant_library_with_button_demo.py」をメモ帳アプリ「Text Editor」で開きます。
---------------------------------------------------------------------------------------------------------------
今回、変更する「assistant_library_with_button_demo.py」ですが、前回の記事の修正済みファイルである事を前提に、それに変更を加えています。
---------------------------------------------------------------------------------------------------------------

「assistant_library_with_button_demo.py」を変更する

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

①ファイルの先頭近くにある「import」項目に「import RPi.GPIO as GPIO」を追加します。
------------------------------------------------------------------------------------
import logging
import platform
import sys
import threading
import subprocess
import RPi.GPIO as GPIO
------------------------------------------------------------------------------------
これはGPIOの制御を可能にするライブラリーを読み込むための記述です。

②中段当たりの「# Start the voicehat button trigger.」行の下に以下の赤字の文字列を追加します。(赤文字部分をコピーしてペーストして下さい。)
------------------------------------------------------------------------------------
        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(24,GPIO.OUT)
            GPIO.output(24, 1)
            logging.info('Say "OK, Google" or press the button, then speak. '
                         'Press Ctrl+C to quit...')
------------------------------------------------------------------------------------
この記述の動作を簡単に説明すると、デモプログラムが起動して、ボタン押し可能になった時点でGPIO24に3.3Vを流し、LEDを光らせる、というものです。

③さらにその下の「subprocess.call('pkill -KILL -f mplayer', shell=True)」行の下に、以下の赤字の文字列を追加します。(赤文字部分をコピーしてペーストして下さい。)
------------------------------------------------------------------------------------
        elif event.type == EventType.ON_CONVERSATION_TURN_STARTED:
            subprocess.call('pkill -KILL -f mplayer', shell=True)
            subprocess.call('speaker-test -Dplughw:0,1 -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.
------------------------------------------------------------------------------------
この記述の動作を簡単に説明すると、ボタンを押して、音声受付可能になった時点で「listen.wav」を鳴らす、というものです。

④さらにその下の前回追加した「ラジオ1」呼び出しのための記述の中の「self._assistant.stop_conversation()」行の下に、以下の赤字の文字列を追加します。(赤文字部分をコピーしてペーストして下さい。)
------------------------------------------------------------------------------------
            if text == 'ラジオ 1':
                self._assistant.stop_conversation()
                subprocess.call('speaker-test -Dplughw:0,1 -r 22050 -c1 -l1 -t wav -w /home/pi/AIY-voice-kit-python/src/OK.wav', shell=True)
                subprocess.call('mplayer -ao alsa:device=plughw=0.1 -playlist http://yp.shoutcast.com/sbin/tunein-station.pls?id=1473372 &', shell=True)
------------------------------------------------------------------------------------
この記述の動作を簡単に説明すると、「ラジオ1」として音声認識が完了した時点で「OK.wav」を鳴らす、というものです。

以下、「ラジオ2」、「ラジオ3」呼び出しのための記述でも同様に変更します。

そのまま保存します。

「main.py」ファイルを上書きする

「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」が再起動後、自動実行されるプログラムファイルになります。

実際の動作は?

ラズパイを再起動させて、動作を確認します。
起動開始して2分くらいで前面のLED(ボタン兼用)が点灯。
ボタンを押すと、一拍あって効果音「listen.wav」が鳴る。
その後「ラジオ1」と発話すると、一拍あって効果音「OK.wav」が鳴る。
しばらくして、指定したWebラジオが再生されればOKです。

---------------------------------------------------------------------------------------------------------------
もし、うまく動作しない場合は、前回の記事でやったように、一旦自動起動を停止してから、「Start dev terminal」ターミナル画面で、変更したデモプログラムファイル自体を実行してみると、記述間違い、等が確認し易いです。
---------------------------------------------------------------------------------------------------------------

コメント