Pythonでウェイクワード検出をやってみた (picovoice社 Porcupine)

スポンサーリンク

ウェイクワードは「アレクサ」や「OK Google」みたいな音声認識を開始するための言葉。
そのウェイクワード検出がしたくなったので、前々から気になっていたpicovoice社Porcupine(ポーキュパイン)を使ってみました。

Porcupineは日本語に翻訳すると「やまあらし」。
様々なプラットフォームやコンピューター言語をサポートしているのが特徴。

ウェイクワード検出(wake word detection)は、ホットワード検出(hot word detection)、キーワード認識(keyword recognition)、 キーワード スポッティング(keyword spotting)とも呼ばれる。

動作確認環境

Windows 11 バージョン22H2 (OSビルド 22621.1105)
python 3.10

プリセットのウェイクワードを試す

まず最初にpicovoiceのサイトで会員登録をして、アクセスキーの取得が必要。

あとは、porcupineGihHubに書かれているとおりに実行。
pvporcupinedemoというデモコマンドを使う。デモコマンドの詳細はこちら

セットアップ

pip install pvporcupinedemo


プリセットのウェイクワード「picovoice」でウェイクワード検出してみる。

porcupine_demo_mic --access_key アクセスキー --keywords picovoice

他にも次のような色々なプリセットウェイクワードがある。
alexa, americano, blueberry, bumblebee, computer, grapefruit, grasshopper, hey barista, hey google, hey siri, jarvis, ok google, pico clock, picovoice, porcupine, terminator

詳細はヘルプ(porcupine_demo_mic --help)で表示できる。複数のプリセットを同時に検出することもできる。

「--sensitivities」オプションで感度も変えれる

porcupine_demo_mic --access_key アクセスキー --keywords picovoice --sensitivities 0.8


オリジナルのウェイクワードを試す

porcupineでは、オリジナルのウェイクワードが簡単に作れる。手順はpicovoice consoleで、言語、ウェイクワード文字列、プラットフォームを選択するだけ。 ウェイクワードを作成すると、そのウェイクワードやプラットフォームに対応したキーワードファイルがダウンロードできる。

オリジナルウェイクワードをデモコマンドで試す場合の例:

porcupine_demo_mic --access_key アクセスキー --model_path porcupine_params_ja.pv --keyword_paths yamaarashi_ja_windows_v2_1_0.ppn

porcupine_params_ja.pvは日本語用モデルファイル。こちらから入手できる。
yamaarashi_ja_windows_v2_1_0.ppnはキーワードファイルの例。


Pythonプログラム

PyAudioで扱いたかったので、デモをベースに適当に実装

必要に応じてパッケージをインストール

pip install pvporcupine pyaudio
import struct
from datetime import datetime

import pvporcupine
import pyaudio

porcupine = None
pa = None
audio_stream = None
# keywords = ["picovoice", "blueberry"]
keywords = ["やまあらし"]
ACCESS_KEY =  アクセスキー
KEYWORD_FILE_PATH = "yamaarashi_ja_windows_v2_1_0.ppn"
MODEL_PATH = "porcupine_params_ja.pv"
try:
    # porcupine = pvporcupine.create(keywords=keywords, access_key=access_key)
    porcupine = pvporcupine.create(access_key=ACCESS_KEY,
                                   keyword_paths=[KEYWORD_FILE_PATH],
                                   model_path=MODEL_PATH,
                                   )
    pa = pyaudio.PyAudio()
    audio_stream = pa.open(
        rate=porcupine.sample_rate,
        channels=1,
        format=pyaudio.paInt16,
        input=True,
        frames_per_buffer=porcupine.frame_length)
    print("start")
    while True:
        pcm = audio_stream.read(porcupine.frame_length)
        pcm = struct.unpack_from("h" * porcupine.frame_length, pcm)

        result = porcupine.process(pcm)
        if result >= 0:
            print('[%s] Detected %s' % (str(datetime.now()), keywords[result]))

finally:
    if porcupine:
        porcupine.delete()

    if audio_stream:
        audio_stream.close()

    if pa:
        pa.terminate()


Pythonライブラリ

APIドキュメント
ソース

料金

料金

Freeプランのウェイクワード検出に関連する制限:
・月あたり3アクティブユーザーまで。アクティブユーザー数の考え方はFAQ参照
・カスタムウェイク ワード作成は月3つまで。

精度

picovoice社が公開しているベンチマークによると、PocketSphinxやSnowboyよりも精度がいいらしい。 音声認識と一緒で、マイクで収録した音が駄目だと当然ウェイクワード検出も駄目だった。

認証方法

アクセスキー方式。ユーザーによる発行や削除はできないので、流出には注意が必要。。。

ライセンス

ライセンス
無料枠で商用利用可であることは公式ブログや料金ページに記載あり。

リンク

PorcupineのFAQ
ウェイクワード作成のヒント

他社のウェイクワード検出関連リンク

ウェイクワード検出の各サービスについてまとまった記事
Azure キーワード認識
ウェイクワード検出は最初エッジで行い、クラウドで検証。

(Alexaの)音声リクエストがたどる道筋
アレクサも最初エッジで行い、クラウドで検証。

GitHub Topicsのwake-word-detection
LINE Clovaはウェイクワード終わりの1.5秒前から音声取得、Amazon EchoやGoogle Homeはどうなってる?