見出し画像

snowboy 入門 (1) - 事始め

ウェイクワードエンジン「snowboy」の使い方をまとめました。

・snowboy v1.3.0
・Python 3.7 / 2.7
・macOS 11.4

1. snowboy

「snowboy」は、DNNベースの軽量なウェイクワードエンジンです。「OK Google!」や「Hey Siri!」のような、ウェイクワードに反応するアプリを作成することができます。

「ウェイクワード」は、発話された時にデバイスをアクティブにすることを目的とした特別な単語またはフレーズです。「ホットワード」「トリガーワード」「ウェイクアップワード」とも呼ばれます。

公式サポートは2021年末に終了し、以降はコミュニティサポートのみになっています。

2. 対応端末

「snowboy」の対応端末は、次のとおりです。

・Raspberry Pi (with Raspbian based on Debian Jessie 8.0)
・64bit Mac OS X
・64bit Ubuntu 14.04
・iOS
・Android
・ARM64 (aarch64, Ubuntu 16.04)

「snowboy」のライブラリの対応言語は、次のとおりです。

・C/C++
・Java/Android
・Go
・Node
・Perl
・Python2/Python3
・iOS/Swift3
・iOS/Object-C

3. モデル

モデルには2つのタイプがあります。

・.pmdl : パーソナルモデル (個人の声、3データ)
・.umdl : ユニバーサルモデル (万人の声、英語500/日本語2000データ)

提供されているユニバーサルモデルは、次のとおりです。

・alexa
・computer
・hey extreme
・jarvis
・neoya
・smart mirror
・snowboyd
・subex
・view glass

4. snowboyのインストール

「snowboy」のインストール手順は、次のとおりです。

◎ swig v3のインストール
最新の「swig v4」では動きませんでした。

(1) Swigのバージョンを確認し、v4の時はアンインストール。

$ swig -version
Uninstalling /usr/local/Cellar/swig/4.0.2... (725 files, 5.4MB)

$ brew uninstall swig

(2) 「swig v3」のインストール。

$ brew install swig@3

(3) パスを通す。

export PATH=/usr/local/opt/swig@3/bin:$PATH

(4) 「swig v3」のインストールを確認。

$ swig -version
SWIG Version 3.0.12

◎ pyaudioのインストール
(1) brewで「portaudio」と「sox」のインストール。

$ brew install portaudio sox

(2) Pythonの仮想環境で「pyaudio」をインストール。

$ pip install pyaudio

◎ snowboyのパッケージのビルド
(1) 「snowboy」のクローン。

$ git clone https://github.com/Kitt-AI/snowboy.git

(2)  Pythonの仮想環境で、以下のフォルダでmake。

・Python2 : snowboy/swig/Python
・Python3 : snowboy/swig/Python3
$ make

「_snowboydetect.so」「snowboydetect.py」などが生成されます。​

(3)  以下のフォルダの「snowboydecoder.py」の一部を変更。

・Python2 : snowboy/examples/Python/snowboydecoder.py
・Python3 : snowboy/examples/Python3/snowboydecoder.py
from . import snowboydetect
    ↓
import snowboydetect

5. ウェイクワードの動作確認

ウェイクワードの動作確認の手順は、次のとおりです。

(1) 以下のフォルダの「demo.py」を実行。

・Python2 : snowboy/examples/Python/demo.py
・Python3 : snowboy/examples/Python3/demo.py
python demo.py resources/models/snowboy.umdl
Listening... Press Ctrl+C to exit

「snowboy.umdl」は、様々な人の「snowboy」という発話を検出するユニバーサルモデルです。

(2)「snowboy」と英語で発音。

以下の文字が表示されたら、成功です。

INFO:snowboy:Keyword 1 detected at time: 2021-08-14 09:50:44

6. demo.py

demo.pyの中身は、次のとおりです。

import snowboydecoder
import sys
import signal

# 割り込みフラグ
interrupted = False

# シグナルハンドラ
def signal_handler(signal, frame):
    global interrupted
    interrupted = True

# 割り込みコールバック
def interrupt_callback():
    global interrupted
    return interrupted

# 引数の取得
if len(sys.argv) == 1:
    print("Error: need to specify model name")
    print("Usage: python demo.py your.model")
    sys.exit(-1)
model = sys.argv[1] # モデル名

# 終了シグナルのキャプチャ (Ctrl+C)
signal.signal(signal.SIGINT, signal_handler)

# ウェイクワード検出の生成
detector = snowboydecoder.HotwordDetector(model, sensitivity=0.5)
print('Listening... Press Ctrl+C to exit')

# ウェイクワード検出のメインループ
detector.start(
    detected_callback=snowboydecoder.play_audio_file, # 検出コールバック
    interrupt_check=interrupt_callback, # 割り込みコールバック
    sleep_time=0.03) # スリープ時間

# ウェイクワード検出の完了
detector.terminate()

◎ HotwordDetector()
HotwordDetector()のパラメータは、次のとおりです。

HotwordDetector(decoder_model,
   
    resource="resources/common.res",
   
    sensitivity=[],
   
    audio_gain=1,
   
    apply_frontend=False)

・decoder_model : モデルファイルのパス。
・resource : リソースファイルのパス。
・sensitivity : デコーダーの感度。
・audio_gain : 入力ボリュームに掛ける係数。
・apply_frontend : フロントエンド処理のアルゴリズムの適用。

◎ HotwordDetector#start()
HotwordDetector#start()のパラメータは、次のとおりです。

HotwordDetector#start(
        detected_callback=play_audio_file,
        interrupt_check=lambda: False,
        sleep_time=0.03,
       audio_recorder_callback=None,
        silent_count_threshold=15,
        recording_timeout=100)

・detected_callback : ウェイクワード検出時に呼ぶ関数または関数リスト。リストサイズはモデル数と同じにする。
・interrupt_check : メインループ停止時にTrueを返す関数。
・sleep_time : ループ待機する秒数。
・audio_recorder_callback : キーワードが発話後に呼ぶ関数。フレーズが記録されたファイル名が渡される。
・silent_count_threshold : フレーズの終わりを示すための沈黙時間。
・recording_timeout : 録音最大時間。

次回



この記事が気に入ったらサポートをしてみませんか?