Skip to content

Porcupine WakeupWord

kemako edited this page Jul 21, 2023 · 4 revisions

ウェイクアップ・ワードを作成する

ウェイクアップ・ワードとは「Alexa」や「Hey Siri」のように音声アシスタントを起動するためのフレーズです。

picovoiceのporcupineというエンジンを使用すると、オリジナルのウェイクアップ・ワードを検知できるようになります。日本語にも対応しているので、自由にフレーズを指定することができます。 今回は「こだま」をウェイクアップ・ワードに設定してみましょう。

1. porcupineのアクセスキーを取得

まずはporcupineの公式サイトでアカウントを新規作成しましょう。 アカウントを作成すると、アクセスキーを取得することができます。

codama-doc-r0/examplesディレクトリ内に.envファイルを新規作成し、以下のようにアクセスキーを記入しておきます。

ACCESS_KEY = "YOUR_ACCESS_KEY"

2. porcupineでウェイクアップ・ワードを登録

公式ガイドに従ってウェイクアップ・ワードを登録します。

Picovoice Consoleのページで「Porcupine Wake Word」をクリックして、ウェイクアップ・ワード作成のページに移動します。

言語を日本語に設定し、好みのウェイクアップ・ワードを入力してブラウザ上で検知されることを確認します。 動作を確認できたら、プラットフォームをRaspberry Piに設定してダウンロードします。

ダウンロードした設定ファイル(.ppn)をcodama-doc-r0/examplesディレクトリ内に移動させてください。

※日本語を使う場合は、日本語用のモデルファイル(.pv)が必要ですが、このリポジトリにはデフォルトで入れています。

3. パッケージのインストール

porcupineを使うためのパッケージをインストールしましょう。

$ pip install pvporcupine

4. プログラムを作成

以下のpythonプログラムをcodama-doc-r0/examplesディレクトリ内にwakeup_word.pyという名前で保存します。

import pvporcupine
import queue, sys
import numpy as np
import sounddevice as sd
import os
from dotenv import load_dotenv

load_dotenv('.env') 

AUDIO_DEVICE_NUM = 8

# 録音の設定
SAMPLE_RATE = 16000
CHANNELS = 1

sd.default.device = AUDIO_DEVICE_NUM

# porcupineの設定
porcupine = pvporcupine.create(
  access_key=os.environ.get("ACCESS_KEY"),
  keyword_paths=["kodama_ja_raspberry-pi_v2_2_0.ppn"],
  model_path="porcupine_params_ja.pv"
)

q = queue.Queue()

def recordCallback(indata, frames, time, status):
    if status:
        print(status, file=sys.stderr)
    q.put(indata.copy())

def run():
    try:
        stream = sd.InputStream(
            samplerate=SAMPLE_RATE,
            dtype="int16",
            blocksize=porcupine.frame_length,
            channels=CHANNELS,
            callback=recordCallback,
        )
        stream.start()
        print("Start")

        while True:
            if not q.empty():
                data = q.get(block=False)
                data = np.reshape(data, [data.shape[0]])
                
                keyword_index = porcupine.process(data)
                
                # "こだま"を検知したら
                if keyword_index == 0:
                    print("Detected: こだま")

    except KeyboardInterrupt:
        pass
    finally:
        sd.stop()
        while not q.empty():
            q.get(block=False)


if __name__ == "__main__":
    run()

5. プログラムの実行

wakeup_word.pyを実行すると、「こだま」と話しかけたときに「Detected: こだま」と出力されます。

$ python wakeup_word.py

これでオリジナルのウェイクアップ・ワードを作成できるようになりました。

次は録音した音声をテキストに変換するに進みましょう。

Clone this wiki locally