🙌

EffecientWord-Netでカスタムのウェイクワードを学習する

2024/01/14に公開

前にRaspberry PiでEffecientWord-Netを動かせるようにしました。今回は独自のウェイクワードを学習させてそれを使用してみます。
前回の記事はこちら(https://zenn.dev/kobayutapon/articles/8282e244104276)

学習の環境

今回は以下の環境で行いました。Raspberry Piでもできそうですが、Githubのissueとか見ているとx86_64環境のほうが安定していそうなので今回はそちらを利用します。

CPU:AMD Ryzen9 7950X
RAM:64GB
SSD:2T
OS:Ubuntu 22.04 LTS

EffecientWord-Netのインストール

Python 3.9環境の設定

EffecientWord-Netを動作させるにはPython3.9の環境が必要です。pyenvを用いて動作環境を構築します。

必要なパッケージを追加

sudo apt install -y liblzma-dev
sudo apt install -y libbz2-dev libreadline-dev libsqlite3-dev

pyenvで環境をインストール

pyenv install 3.9.17
pyenv local 3.9.17
pip install --upgrade pip
pyenv rehash
python -m venv env
./env/bin/activate

※activateスクリプトに実行属性がついてないことがあるので注意

EffecientWordをインストール

sudo apt install -y portaudio19-dev libsndfile1-dev ffmpeg
pip install wheel
pip install typer
pip install rich
pip install "numpy==1.20.0" "librosa==0.9.2" tflite_runtime
pip install EfficientWord-Net

※ライブラリの依存が強いので上記でバージョンを指定してインストールする。(2024/1/14現在)

独自のウェイクワードを学習する

インストール出来たらウェイクワードを学習させます。

学習サンプルを用意する

必要なものは学習用の音声データを準備します。
これは以下のフォーマットで準備すると良いでしょう。

  • WAV形式
  • 16000Hz, モノラル
  • S16LE

学習用サンプルは最低4つ必要です。また、楽手モデルによっては2秒以上必要です。
学習用のデータはまとめて同じディレクトリに置いておきます。

学習をさせる

以下のコマンドを使って学習させます。

python -m eff_word_net.generate_reference [OPTIONS]

オプションは以下を指定します(必須)
--input-dir 学習する音声データが入っているディレクトリ
--output-dir 楽手済みのモデルを出力するディレクトリ
--wakeword ウェイクワード
--model-type 使用するモデル first_iteration_siamese か resnet_50_arc を指定

以下にコマンドの実行例を記載します。

python -m eff_word_net.generate_reference --input-dir=./ --output-dir=../model --wakeword=test --model-type=first_iteration_siamese

学習すると指定したディレクトリにjson形式のモデルデータが出力されます。
モデルタイプを resnet_50_arcに指定した場合、テスト用のファイルを2秒以上に設定しないとエラーが出ます。first_iteration_siameseだと短くても学習できそうです。

学習データを使う

学習したデータを動作する実機に転送します。
そのデータを使うようにプログラムを修正します。
こちらのプログラム(https://github.com/Ant-Brain/EfficientWord-Net/blob/main/eff_word_net/engine.py)を一部修正して使います。

ホットワードのモデルを定義し、Detectorに登録することで使用します。
以下修正例:

    test_hw = HotwordDetector(
        hotword="test",
        model = test_model,
        reference_file = "./test_ref.json",
        threshold=0.7, #min confidence required to consider a trigger
        relaxation_time = 2 #default value ,in seconds
    )


    multi_hotword_detector = MultiHotwordDetector(
        [mycroft_hw, alexa_hw, balloon_hw, computer_hw, mobile_hw, lights_on, lights_off, test_hw],
        model=base_model,
        continuous=True,
    )

修正出来たら実行して確認します。
今回は「テスト」という言葉を追加して使用しました。
以下Raspberry Pi Zero2Wでの動作例です。

きちんと検出できていることがわかります。

参考文献

https://github.com/HinTak/seeed-voicecard
https://zenn.dev/kobayutapon/articles/8282e244104276
https://github.com/Ant-Brain/EfficientWord-Net/tree/main
https://zenn.dev/kun432/scraps/7de88d0e1591a4

Discussion