本記事は、Cerevoスタッフが業務や趣味について思うままに書き綴るアドベントカレンダー企画「Cerevo アドベントTechBlog 2017」の第19日目です。
Cerevo アドベントTechBlog 2017
http://tech-blog.cerevo.com/archives/category/adventcalendar/2017/
こんにちは。電気設計担当のスン&メカデザイン担当のINDです。
アドベントカレンダー19日目は、最近巷で流行りのスマートスピーカーを自作してみる、というお話です。
クリスマスまであと6日ですが、すっかり寒くなってきましたね。今シーズンは平年より寒くなるだろうという話もありますが、防寒対策は万全でしょうか?
こんな寒い日々にもめげず、我々は仕事やら学校やらのために外出しなければならないわけですが、その道中、メールやラインの返信やちょっとした調べもののために、スマートフォンを操作したい時は多々あるでしょう。
しかし前述の通り外は寒い。できれば手袋を外さずに、もしくはポケットに手を突っ込んだまま用事を済ませたい、というような悩みをお持ちではないでしょうか?
そんなあなたに最新のソリューションをご紹介いたします。
それがこちら。名付けてGoogle Outsideマフラーです!
このマフラーはGoogleが開発したAIアシスタント、Google Assistantが組み込まれた端末が内蔵されているので、マイクに話しかけることで今日の予定や気になるニュースを答えてくれます。
さらにwebサービス「IFTTT」と連携することで、TwitterやLINE等のSNSにメッセージを送ったり、町中を歩いているときにポッと浮かんだとっておきのポエムをEvernoteに記録する、なんてことも可能となるのです!
マフラーで口を隠すことができるので、独り言をブツブツ言っている姿を見られることもありません!!
それでは、さっそくこのマフラーの作り方をご紹介していくことにしましょう。
電気・ソフトについて
電気・ソフトについてはスンが説明します。
用意するもの
・Raspberry Pi Zero W
https://www.switch-science.com/catalog/3200/
・Speaker phat
https://www.switch-science.com/catalog/3219/
・USBマイク
https://www.switch-science.com/catalog/3151/
・マイクロB⇔A 変換アダプタ
https://www.amazon.co.jp/Joyshare-Micro-USB-OTG%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-MicroB%E3%82%AA%E3%82%B9-A%E3%83%A1%E3%82%B9/dp/B01L0OL300/ref=pd_bxgy_107_img_2?_encoding=UTF8&psc=1&refRID=T3RRKGWD3QHRVVH14AP4
・タクトスイッチ(オルタネイトタイプ)
http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4J3R
・リチウムポリマー電池
これらを組んでいくと下の写真のようになります。
表面
裏面
基本的に難しいことは無く、写真のように組んでいくのみです。電池の接続については+をラズパイの2pinに、GNDを6pinに繋いで、+の配線の間に電源スイッチ用のタクトスイッチを入れました。充電基板も電池の+-にそれぞれ繋ぎます。
ちなみにUSBマイクは、純正のコンデンサマイクのままだとほとんど声を拾えていなかったので、別のマイクに交換しました。
続いてはソフトの準備です。
ラズパイの環境設定(OSのインストール等)
Raspberry Pi ZeroとZero Wセットアップ 完全ガイド
http://blue-black.ink/?page_id=1788
OSのインストール、環境設定はこの記事辺りを参考にセットアップを進めていきました。Google Assistantを使用する為に、無線LANに接続しておく必要があります。
Speaker phatのセットアップ
ラズパイZeroとOpenJTalk で京急線の案内を喋らせてみた
http://www.mana-cat.com/entry/2017/05/04/232605
Speaker phatのセットアップは上記を参考に進めていきました。
本来ならこちらの手順通りにセットアップを進めれば、問題なくスピーカーから音が鳴るはずなのですが、自分の環境では音が鳴りませんでした。どうもPulseAudioというアプリが悪さをしていたようで、それをアンインストールすることで音が鳴るようになりました。原因の深追いはしておらず、正しい対処だったかはわかりませんが参考までに。
ラズパイにGoogle Assistant SDKを導入する
Raspberry Pi1(たぶんZeroも可)でGoogle Assistantを試す
https://qiita.com/moritalous/items/8de3b4ac073a135731d3
Raspberry Pi にGoogle Assistant SDKを搭載して「OK Google」してみる。
https://qiita.com/PonDad/items/52eaa93338496b06cb1a
Google Assistant SDKのセットアップについても既に先駆者がおられたので、ありがたく参考にさせていただき、問題なく設定が完了しました。感謝しかありません。
独自Hot Wordの作成(Snowboyと連携)
今回使用しているラズパイzero W用のSDKでは、現状「OK, Google」のようなHot WordによるAssistantの起動に対応していません。(キーボードのEnterキーか、それに準ずるアクションが必要)
なのですが、Snowboyというライブラリを使用することで、ラズパイzero WでもHot Wordが実装できてしまいます。しかも「OK, Google」ではなく、独自のHot Wordも作成できるという優れものです。
Snowboyでの独自Hot Wordの作り方は下記で説明されています。
Snowboy Hotword DetectionをRaspberry Piで動かす
https://qiita.com/mayfair/items/d16d092328e60f0cac6b#%E7%8B%AC%E8%87%AA%E3%81%AEhotword%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B
こちらの手順に従って、「よう、マフラー」という独自Hot wordを作成しました。
そして実際にそのHot WordをRaspberry Pi zero W用のGoogle Assistantに組み込む方法については、日本語で書かれたブログ等が見つからなかったので、こちらで説明します。基本的に下記サイトに沿って設定していくのみです。
Simple Google Assistant with hotword activation from Snowboy setup for my Pi Zero W
https://github.com/warchildmd/google-assistant-hotword-raspi
まず上記サイトからリポジトリのコピーを取得します。
$ git clone https://github.com/warchildmd/google-assistant-hotword-raspi.git
そしてコピーしてきたフォルダ内の_snowboydetect.soをPython3対応にするために、_snowboydetect.so_py3というファイルの名前を変更します。
$ cd ./google-assistant-hotword-raspi
$ mv _snowboydetect.so_py3 _snowboydetect.so
元々あった_snowboydetect.soは別名に変更して置いておくといいかもしれません。
Snowboyの使用に必要なアプリをインストールします。
$ sudo apt-get install python-pyaudio python3-pyaudio sox
$ sudo apt-get install libatlas-base-dev
$ pip install pyaudio
以上でSnowboyの準備は完了です。
Google Assistantを起動する
ここまで準備できればあとは下記コマンドを打ち込むだけです。
$ python gassistant.py models/ok_google.pmdl
これでHot Wordの待ち受け状態に入り、作成したHot Wordで呼びかければGoogle Assistantが起動して、Google先生と会話することができるようになります。
起動時の自動実行
上記Assistant起動コマンドを、ラズパイ電源ON時に自動で実行するように設定します。やり方はいくつかあるみたいですが、今回はcrontabを使うことにしました。
まずシェルスクリプトを作成します。
$ sudo nano advent17.sh
#!/bin/sh
source env/bin/activate
sleep 5
python /home/pi/google-assistant-hotword-raspi/models/snowboy.umdl
exit 0
そしてこのスクリプトファイルをcrontabで実行するように設定します。
$ crontab -e
でcrontabを立ち上げて、下記コマンドを追加します。
@restart /home/pi/adbent17.sh
これで起動時に自動的にHot Wordの待ち受け状態に移行するようになります。
IFTTTとの連携
さて最後にIFTTTとの連携です。
Google HomeをIFTTTと組み合わせてTwitterやLineなどと連携しよう!
https://yuki-no-yabo.com/combined-googlehome-with-other-services/
上記はGoogle Homeで連携させていますが、やることは一緒です。同じように設定すれば、様々なwebサービスと連携することができます。
筐体設計について
筐体設計についてはINDが説明します。
基板などを入れる筐体を作る
とりあえず、構成されているパーツ群をノギスで計測して、なるべく、厚みの出ないように構成します。マイクロUSB挿入口や、スピーカーの位置などを鑑みながら、小さな箱を作りました。今回もfusion360を使用しました。
筐体を出力する
今回も時間がないので、オフィスにある個人所有の3Dプリンタを使います。時間がないときの設計検討時には本当に重宝しています。無理言ってお願いしているので、あとでお礼しなきゃ……。
マフラー(のようなもの)を作る
公開1日前。さあどうやって作ろう。とりあえず家にあるマフラーを見ると、ウールとかフリース、フェルトもある。「確か、フェルトはレーザーカットできるはず……」ということで、DMM.make AKIBAに確認して、レーザーカット可能とのことで、この方法で進めようと思います。また、筐体を入れる素材としてもしっかりしていて良さそうだと思いました。
まずは試しカットを行います。よし、いけそうだ。
マフラーを作るための図面を書く
ZOZOTOWNなどをみて、どんなマフラーにするか決めます。
- スイッチは外に出して、操作できるようにしたい。
- 使わないときは据え置きとして使いたい
- ちゃんと巻ける、操作できる
これを満たすような形状になるように、図面を書きます。満たされるどうかはぶっつけ本番です。
図面は単に慣れているという理由から、ライノセラスを作成しました。マフラーサイズは140cmにしようと思うのですが、レーザーカット機のカット可能サイズが70cmまでだったので、二つ折りにして切ってみます。
完成
さあでは出来上がった基板とマフラーを組み合わせて動かしてみましょう。
「よう、マフラー、Sing a song」と言ってみます。
IFTTTとの連携もこの通りです。
「よう、マフラー、going home」と言うとLINEに「帰ります。」とメッセージを送るように設定しました。
自宅などでは巻いて自立させ、据え置き機としても使用できます。「よう、マフラー、今日の気温は?」よし、巻いていこう!みたいな使い方もできますね!
ではさっそく巻いてみます。
どうでしょうか。冴えないおっさんが、このファッションアイテム身にまとうことで見違えたのではないでしょうか? せっかくなのでマフラーを付けて夜道を徘徊してみます。
「奇麗だなぁ……、ううう……、よう、マフラー、クリスマスまであと何日……?」
「みかんうまそうだなぁ……。よう、マフラー、愛媛県までの距離は?」
皆さんもクリスマスプレゼントにGoogle Outsideマフラーを作ってみてはいかがでしょうか?