ウェイクワードで操作できるスマートホーム・デバイスを作り始める
こんにちは、ヨシケンです!
これまでラズパイを使って、スマートスピーカーや画像解析するカメラなどを作ってきました。
ここからは、そこで使った音声技術や画像解析を活用して、お家で役立つスマートホーム・デバイスを作って行きたいと思います。
2018年3月に機能向上して発売されたRaspberry Pi 3B+や、小型ラズパイのRaspberry Pi Zeroなどを使って、声で操作する便利なホームデバイスを作っていきますよ!
今回の記事で必要な物一覧
・小型USBマイク
(USBで使えるマイクなら何でも構いませんが、今回は小型で1,000円以下のこちらを使いました。)
・小型スピーカー
(こちらもイヤフォン・ジャックに差さるものなら構いませんが、充電式アンプ付きのこちらを使っています。)
・LEDとケーブル類
今回の記事の流れ
1.Raspberry Pi 3B+の基本設定
2.スピーカーとマイクの設定
3.Snowboyウェイクワードの導入
4.ウェイクワードとラズパイのLEDを連動させる
5.まとめ
1.Raspberry Pi 3B+の基本設定
Raspberry Pi 3 Model B+ (以下ラズパイ又は3+と記述)は2018年3月14日(これはπ=3.14にちなんでいるそうです)に発売され、以前のラズパイ3と比べてCPUクロックが1.4GHzとなり、ネットワーク性能が向上した最新のラズパイです。そうは言っても、サイズや基本設定などはこれまでと変わらず、今までのやり方を踏襲して進めることができます。OS Raspbianのインストール、RasPi-configでの設定、Wi-Fi環境、SSH接続など基本的なところは、こちらのエントリによくまとまっていますので、参照してやってみて下さい。
ここでは、Raspbian Stretch OSを使っていて、ラズパイの基本的な設定が済んでいる事を前提に進めます。
2.スピーカーとマイクの設定
基本設定に続いて、スピーカーとマイクの設定をします。写真のようにジャックにスピーカーを、USBにマイクを挿して、音声の確認をします。
まずaplay -lでスピーカーが認識されているか確かめます。ここでは Card 0にスピーカーが認識されている状態です。また、arecord -lでマイクのカード番号が Card 1になっているのを確認します。
自分で音を録音し、それを先ほどのaplayで聞いたり、arecordとaplayを繋げて、その場の音がスピーカーから流れる事を確認します。
arecord -f S16_LE -r 16000 -D 1 test.wav # 録音を止める時は、CTRL+Caplay -f S16_LE -r 16000 test.wav
alsamixer #音量の調整など。止めるときは、Esc
arecord -f cd -Dhw:1 | aplay -Dhw:0
また、sudo vi ~/.asoundrcという音声設定ファイルを、このマイク、スピーカーに合わせて変更しておきます。
pcm.!default { | |
type asym | |
playback.pcm { | |
type plug | |
slave.pcm "hw:0,0" | |
} | |
capture.pcm { | |
type plug | |
slave.pcm "hw:1,0" | |
} | |
} |
3.Snowboyウェイクワードの導入
さて、マイクとスピーカーが動くようになったので、今回のメイン、ウェイクワードの設定を行います。
ウェイクワードとは、「アレクサ!」や「OK Google!」などのように、スマートスピーカーを起動させる最初の決まった呼びかけワードです。
ここでは、Alexaでも使われているウェイクワードのサービスSnowboyを使って、自分独自のウェイクワードを設定できるようにします。
まずこちらのページからSnowboyのダウンロードとラズパイへの導入を行います。
サイト上のDownloadsから、Raspberry Pi with Raspbianのバージョンを選んでダウンロードします。このパッケージをラズパイに送っておきます。
また以下のライブラリをラズパイにインストールし、Snowboyでの音声対応ができるようにします。
scp rpi-arm-xxxx.tar.bz2 pi@raspiname.local#xxxxはダウンロードしたsnowboyファイル名、raspiname.localはラズパイのアドレスを指定して下さい。
(ラズパイ側で)
sudo tar xaf rpi-arm-xxxx.tar.bz2 #先ほど送ったファイルを解凍
sudo apt-get install python-pyaudio python3-pyaudio sox
sudo pip install pyaudio
さあこれだけで、ラズパイがウェイクワードを聞いてくれるようになります。
ラズパイ上でデモプログラムを流してみましょう。
cd snowboy
python demo.py resouce/snowboy.umdl
※ここで指定している.umdlや.pmdlがウェイクワード・ファイルで、デモではあらかじめ用意された「スノーボーイ」という単語が入っています。
プログラムを流したら、マイクの近くで「スノーボーイ!」と呼びかけてみて下さい。見事反応すると、ピン!という反応音が聞こえるはずです。
こちらはその時の動いている簡単な動画です。
4.ウェイクワードとラズパイのLEDを連動させる
Snowboyが動いたところで、ラズパイ側につながったものと連動させてみます。ここでは最も簡単なLEDをチカチカさせる、ウェイクワードでLチカをやってみます。ラズパイに以下のようにLEDをつなぎます。
それでは、ウェイクワード反応後にLEDを光らせる、wake_led.pyプログラムを記述します。
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
import snowboydecoder | |
import sys | |
import signal | |
from light import Light | |
interrupted = False | |
LED=17 | |
def signal_handler(signal, frame): | |
global interrupted | |
interrupted = True | |
def interrupt_callback(): | |
global interrupted | |
return interrupted | |
if len(sys.argv) == 1: | |
print(“エラーです。モデル名を指定して下さい。”) | |
sys.exit(-1) | |
model = sys.argv[1] | |
signal.signal(signal.SIGINT, signal_handler) | |
detector = snowboydecoder.HotWordDetector(model, sensitivity=0.5) | |
print(“ウェイクワードを発話して下さい。Ctrl+Cで終了します。”) | |
led = Light(LED) | |
detector.start(detected_callback=led.blink, | |
interrupt_check=interrupt_callback, | |
sleep_time=0.03) | |
detector.terminate() |
このプログラムを流して、また「スノーボーイ!」と呼びかけてみましょう。
python wake_led.py resources/snowboy.umdl
見事、LEDがチカチカしたでしょうか?
また百均などで買ってきたLED電球を使って、もう少しお家が楽しくなるような電飾にしてみましょう。季節柄、クリスマスツリーを光らせるのもいいですね。
まとめ
今回は、ラズパイでスマートホームの第一回として、Snowboyというウェイクワードの仕組みを導入しました。
そしてこのウェイクワードから、ラズパイ側のLEDを光らせる事を簡単にやってみました。
これはラズパイのローカル上で動いているので、ネットワークが無いところでも、声さえかければラズパイの操作が可能になっています。LED以外もセンサーや音がするものと組み合わせて使う事ができます。色々やってみて下さいね。
次回は、このウェイクワードを使って声でラズパイを操り、家内のスマートホーム化を進めていきます。
お楽しみに!
今回の連載の流れ
第1回: ウェイクワードで操作できるスマートホーム・デバイスを作り始める(今回)
第2回: 独自のウェイクワードでお部屋をチェックする
第3回: 声でリモコンを操作して便利に使う
第4回:カメラをつけて、お部屋のチェックなど便利に使おう!