UKey's Labo

AVS – ホットワード(アレクサ)を変更する

AVSのホットワードをSensoryからSnowboyに変更して、アレクサ以外でAlexaを起動する

デフォルトのままだと、「Alexa!」(英語)で呼ばないと反応してくれないし、「Alexa!」もかなり大声で呼ばないと反応してくれないため、ホットワードのライブラリをデフォルトのSensaryからSnowboyに変更します。

Snowboyを使用すると、ホットワードを任意のものに変更でき、呼びかけ時のマイクゲイン、センシティブも変更できます。センシティブは、分かりやすくいうと「反応のしやすさ」になりますかね。。。自身ないですが。センシティブを大きくしすぎると物音とかにも反応してしまったり、Alexaのスピーカーから出力されているAlexa自身の声に反応してしまったり(とにかく、どんな音にも反応してしまう)するため、その点は厄介だったりしますが、自分の好きなホットワードに変更できるというのは、大きな魅力でしょう。

ちなみに、Snowboyは、個人利用は無償で利用できますが、商用利用の場合は有償ですのでお気をつけください。

動作環境

環境 バージョン
ラズパイモデル Raspberry Pi 3 Model B Plus Rev 1.3u
OS Raspbian GNU/Linux 9.6 (stretch)
avs (Alexa Voice Service) v1.11.0 released 12/19/2018

ホットワードモデルの作成

WebサイトSnowboy HOTWORD DETECTIONを開きます。

画面右上にある「Log in」からログインします。

いずれかのアカウントでログイン可能です。

ログイン後、すでに誰かが登録してあるホットワードの一覧が確認できます。デフォルトでは全ての言語が表示されているので、「Language Filter」からJapaneseを選択すれば、日本語で調べることができます。すでに登録されてあるホットワードを使用するなら、ここでの以降の作業は不要です。お好みのホットワードモデルをダウンロードして使用しましょう。

せっかくなので、ここでは自分の好きな言葉でホットワードモデルを作成します。

右上の「Create Hotword」をクリック。

以下を入力します。

入力が完了したら「Record my voice」をクリック。

音声を録音して、モデルデータを作成します。録音は3回行います。

「Record」ボタン押下で録音が開始されます。

2019/03/10現在では、Google Chrome、もしくはFireFoxでしかこの作業は行なえませんので注意。

僕も当初、SafariでやってRecordボタンを押下しても録音が開始されず、原因がわからずしばらくハマってしまいました。検索すればすぐ答えには辿りつけたのですが、原因がブラウザ依存というのが経験からわからなかったです。

Google Chromeを使用した場合、Recordボタンを押下すると以下のようなポップアップが表示されるので、

「許可」します。

3回Recordingを実施して、「Test the Model」をクリック。

モデル作成時のデータを登録、テストを行います。

testが成功すれば、晴れて音声モデルをダウンロードできます。

「Save and download」をクリックして、音声モデルをダウンロードします。

トラブルシューティング – Recordingができない

上記にも記載している通り、Chromeもしくは、FireFoxのみでしか実施できません。

なので、それ以外のブラウザを使用しましょう。

また、Recording実行時に、以下の画像箇所に波形が表示されていれば、マイク入力ができていますが、全く何も表示されない場合は、使用するマイクが違う or そもそもマイクが認識されていない等が考えられます。

使用しているマイクの確認、もしくは使用するマイクの変更は、Chromeを使用している場合は、アドレスバーのここをクリックします。

「管理」をクリック。

ここでマイクの変更を行います。

snowboyのインストールと設定

まずはsnowboyをダウンロードします。

# ディレクトリの移動
cd {avsインストールフォルダ}/third-party

# githubからソースをダウンロード
sudo git clone https://github.com/Kitt-AI/snowboy.git

# 必要なライブラリをインストール
sudo apt install -y libatlas-base-dev

setup.shを編集して、ホットワードにsnowboyを追加します。

vim {avsインストールフォルダ}/setup.sh
  echo "==============> BUILDING SDK =============="
  echo

  mkdir -p $BUILD_PATH
  cd $BUILD_PATH
  cmake "$SOURCE_PATH/avs-device-sdk" \
      -DCMAKE_BUILD_TYPE=DEBUG \
  # ====== 以下を追加 ========
     -DKITTAI_KEY_WORD_DETECTOR=ON \
     -DKITTAI_KEY_WORD_DETECTOR_LIB_PATH="$THIRD_PARTY_PATH/snowboy/lib/rpi/libsnowboy-detect.a" \
     -DKITTAI_KEY_WORD_DETECTOR_INCLUDE_DIR="$THIRD_PARTY_PATH/snowboy/include" \
  # ====== ここまで   ========
      "${CMAKE_PLATFORM_SPECIFIC[@]}"

  cd $BUILD_PATH
  make SampleApp -j2

else
  cd $BUILD_PATH
  make SampleApp -j2
fi

echo
echo "==============> SAVING CONFIGURATION FILE =============="

ビルドエラーになる箇所を修正。

{avsインストールフォルダ}/avs-device-sdk/build/cmake/BuildOptions.cmake

sudo vim {avsインストールフォルダ}/avs-device-sdk/build/cmake/BuildOptions.cmake
# Set up the compiler flags.
add_definitions (-D_GLIBCXX_USE_CXX11_ABI=0) # ←これを追加
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

マイク感度の調整

ここが一番の難所かと思います。

以下ファイルにホットワード検知のマイク感度を設定する箇所があるので、調整します。

{avsインストールフォルダ}/avs-device-sdk/KWD/KWDProvider/src/KeywordDetectorProvider.cpp

sudo vim {avsインストールフォルダ}/avs-device-sdk/KWD/KWDProvider/src/KeywordDetectorProvider.cpp
#ifdef KWD_KITTAI
/// The sensitivity of the Kitt.ai engine.
/// 感度調整
static const double KITT_AI_SENSITIVITY = 0.50;

/// The audio amplifier level of the Kitt.ai engine.
/// マイクゲイン
static const float KITT_AI_AUDIO_GAIN = 0.5;

/// Whether Kitt.ai should apply front end audio processing.
static const bool KITT_AI_APPLY_FRONT_END_PROCESSING = true;
#endif

この、KITT_AI_SENSITIVITYKITT_AI_AUDIO_GAINの設定値によっては、雑音を拾ってAlexaが起動したり、Alexaが喋ってる自分の声に反応してしまったりと、うまく動かないので、何度も調整する羽目になる場合もあります。ちなみに、上記設定は自分の環境下でのベスト設定値です。

ここは、自分の環境に合った値をトライ&エラーで見つけていくしかないかなと思います。

あとは、音声モデルのファイル名もここで任意のファイル名にすることもできます。

#if defined(KWD_KITTAI)
    return alexaClientSDK::kwd::KittAiKeyWordDetector::create(
        stream,
        audioFormat,
        keyWordObservers,
        keyWordDetectorStateObservers,
        pathToInputFolder + "/common.res",
        {{pathToInputFolder + "/alexa.umdl", "ALEXA", KITT_AI_SENSITIVITY}},
        ///                    ^^^^^^^^^^^^ ここを変更
        KITT_AI_AUDIO_GAIN,
        KITT_AI_APPLY_FRONT_END_PROCESSING);

#elif defined(KWD_SENSORY)

snowboyを含めて再ビルド

setup.shを実行して、再度ビルドを行います。

sudo bash setup.sh config.json

ビルド実行後、再度startsample.shが作成されるので、編集します。

sudo vim startsample.sh
  cd "/home/pi/avs-sdk/build/SampleApp/src"

#  ./SampleApp "/home/pi/avs-sdk/build/Integration/AlexaClientSDKConfig.json" "/home/pi/avs-sdk/third-party/alexa-rpi/models" DEBUG9

# 上記をsnowboyを見るよう以下のように修正
  ./SampleApp "/home/pi/avs-sdk/build/Integration/AlexaClientSDKConfig.json" "/home/pi/avs-sdk/third-party/snowboy/resources" DEBUG9

ホットワードモデルを配置

以下に、作成したホットワードモデルxxxxx.pmdlファイルを配置します。

{avsインストールフォルダ}/third-party/snowboy/resources/

ちなみに。

.pmdlはpersonal、.umdlはuniversalです。個人で自前に作成した音声モデルデータは.pmdlになっていると思います。

ここまで準備が完了すれば、後はstartsample.shを実行して、自分の作成したホットワードで呼びかけてみましょう。反応してくれれば完了です。

トラブルシューティング – snowboyが実行されていない

setup.shを修正して、snowboyをビルドに含めるようにしてあるはずですが、うまく行っていない場合は、以下コマンドを実行後、再度setup.shを実行してビルドしてみるとうまくいく場合があります。

cd /home/pi/sdk-folder/sdk-build && cmake /home/pi/sdk-folder/sdk-source/avs-device-sdk -DKITTAI_KEY_WORD_DETECTOR=ON -DKITTAI_KEY_WORD_DETECTOR_LIB_PATH=/home/pi/sdk-folder/third-party/snowboy/lib/rpi/libsnowboy-detect.a -DKITTAI_KEY_WORD_DETECTOR_INCLUDE_DIR=/home/pi/sdk-folder/third-party/snowboy/include -DGSTREAMER_MEDIA_PLAYER=ON -DPORTAUDIO=ON -DPORTAUDIO_LIB_PATH=/home/pi/sdk-folder/third-party/portaudio/lib/.libs/libportaudio.a -DPORTAUDIO_INCLUDE_DIR=/home/pi/sdk-folder/third-party/portaudio/include

自分の作成した音声モデルファイル(xxx.pmdl)ファイルがそもそも正常に動作するのか気になる場合は、以下を参考に、テストしてみてください。

参考サイト