Enter!バッチを起動しようと勢いよくキーを叩いたら、それはシフトキーだった。Homeのようなものを作ることができます。Kitを入れて、音声でSwitchBotをオン・オフする音声コマンドデバイスを開発してみたいと思います。Proを使用しているのですが、毎回充電が100%になる度に充電器のスイッチをオフにして、空になったらまたオンにするのが面倒でした。デスクの奥に電源タップがあって、わざわざ席を立ってポチっとしに行かなきゃ届かない位置だったのです。これがすごく面倒臭くて。なんだ、しょうもない話だなとお思いかもしれませんが、私はそれ以上にしょうもない人間なんです。なんとか楽な方法はないかなーと苦しみに苦しみぬいた上、カレント・ビッグウェーブに乗ってここはひとつボイスで操ることにしました。Kitがありましたからね。あと、何かに使えるんじゃないかと思って買っていたSwitchBot。Bluetooth経由で操作できるアナログなスマートスイッチです。Amazonで日本語版も売ってるみたいです。死んだ感のある往年のバズワード「マッシュアップ」によって、様々な技術を組み合わせて作りますよ。私の環境は次の通りです。Snowboyというのはホットワード検出のライブラリ(+ボイスモデル作成クラウドサービス)です。KitのページからはSDカードイメージのファイルがダウンロードできなくなっているようです。V2を使っている人はバンドルされているSDカードのままでOKだと思います(持ってないから確証はないけど)。V1を使用している方で、再度イメージ焼きから開始したい方は、以下のURLのページからイメージがダウンロードできます。V1Pythonセットアップではまず最初にPythonのセットアップから始めます。Pythonのバージョンはもちろん3です。python-venvは最初から入っているはずなのでvenvを作成するところから始めます。env/yoshikoここでは仮想環境名をyoshikoにしました。「よしこちゃん」と話しかけると反応するようにしたかったので。ここは「まりこちゃん」でも「さちこちゃん」でも構いません。言わずもがな、思い出の女子の名前にしておくと、グッと盛り上がりますよ!続いて、pipとsetuptoolsのインストール。setuptoolsこれで仮想環境を使用することができます。3系になっていればOKです。SDKを使用することはないんですが、どうせ必要になってくると思うのセットアップしておきます。Home的なことができるAPIです。pipでインストールします。google-assistant-sdk[samples]それから認証用ライブラリも同様に。google-auth-oauthlib[tool]クライアントから使用するのにはOAuth認証が必要です。Consoleを訪れてOAuthクライアントIDを取得しましょう。Consoleへアクセスして、新規プロジェクトを作成します。プロジェクト名もyoshikoにしました。待っていると、プロジェクトの作成が完了するはずです。左側のメニューから「APIとサービス」-「ライブラリ」を選択します。sdk」と入力すると、該当するAPIに絞り込まれますので、これをクリックします。APIを有効にして、完了を待ちます。完了したら左側のメニューから「認証情報」をし、続いてOAuthクライントIDを選択します。同意画面が必要だそうで、「同意画面を設定」へと進みましょう。同意画面の設定で入力が必要なのは「ユーザーに表示するサービス名」のみですので、ここに「Yoshiko」と入力しました。すると先程の画面に戻ってきて「アプリケーションの種類」の選択を迫られます。なんでもいいと思うのですが、私は「その他」を選択し、名前を「yoshiko」にしておきました。認証情報の作成が完了したので、クライアントに配置するJSONファイルをダウンロードできます。ラズパイ上でGUIで作業していた方はそのままダウンロードすればよいですし、別の端末からscpで送ってもよいです。ラズパイ上の/home/piにこのJSONファイルを配置してください。APIを利用できるよう認証します。次のコマンドを実行します。/home/pi/client_secret_XXXXX.jsonclient_secret_XXXXX.jsonというのは、先程ダウンロードしたJSONファイル名です。ご自分の環境に合わせて適宜変更して下さい。https://...」というメッセージが表示されますので、そのURLにブラウザでアクセスします。Googleアカウントを選択し、アクセスを許可すると認証コードが表示されるので、ターミナルにコピペしてEnterを押します。...」と表示されていれば認証は完了です。デバイスモデルというのを登録しないといけないです。モデル名このコマンドのオプション等はググってみてください。大事なのはモデル名ですが、ここではモデル名をyoshikoにしました。作成したモデルの一覧は次のコマンドで確認できます。--modelでは最後にちゃんと動作するか確認しておきましょう。talkのサンプルを実行してみます。Enterとか言われるので、指示通りエンターキーを押します。それから何か日本語で話しかけてみて下さい。Homeと同じように応答してくれるはずです。SDKのセットアップは完了です。APIは音声→テキストに変換する、いわゆるディクテーション(書き起こし)APIです。ホットワードを検出した後に聞き取りモードに入り、マイクから拾った音声はこのAPIにてテキストに変換します。cloud_speechも含めたaiyライブラリの依存関係は~/AIY-voice-kit-python/requirements.txtの中に書いてありますので、すべて最新版を入れておきましょう。Consoleにいって、認証情報を作成します。今度はサービスアカウントキーを作成します。続いて必要情報を入力してキーを作成。勝手にJSONファイルがダウンロードされたら、それを/home/piに配置します。その際、ファイル名をcloud_speech.jsonに変更するのを忘れないでください。APIを有効にしておかなければなりません。APIのときと同様に有効にします。Speechのセットアップは完了です。動作を確認しておきましょう。確認用スクリプトを入れるディレクトリを作成して、そこで作業します。aiyにリンクを貼れば、pythonパッケージとして認識してくれます。Kit上面のボタンを押すまで待ちます。ボタンが押されるとボタンが点滅し、音声入力を待ちます。そこで何か話しかけると、その音声がテキストとして出力されます。「さようなら」と発話するとスクリプトの終了です。Speechを日本語化しています。aiy.i18naiy.i18n.set_language_code('ja-JP')上手く日本語の書き起こしができていればセットアップは正常です。Snowboyのセットアップ次にSnowboyをセットアップします。detectionライブラリです。Homeのような音声認識デバイスを起動するトリガーとなるワードのことです。よしこちゃんと私の架け橋です。SDKだけでも音声待ち受けループ→ディクテーション(音声をテキストに書き起こすこと)という流れでホットワード待ち受けを作成することはできるのですが、待ち受け中もAPI使用の課金対象となるので、無料で遊ぶには敷居が高いです。Snowboyは(個人用途では)無料で利用することができ、しかもホットワードをWeb上で録音・学習させ、モデルデータとしてダウンロードして使用することができます。今回はこのホットワードにSnowboyを使用します。ライブラリはPythonから使用できます。インストール手順がgithubに書いてありますが、そのままでは動かなかったので、手順を順に説明します。[github]READMEにはprecompiledバイナリがあると書いてますが、そのままでは動かなかったので、手動でビルドした方がいいと思います。libatlas-base-devREADMEにも記述のある通り、一度マイクからの録音と再生を試してみます。test.wav録音した音声が再生できればOK。ビルドするためにソース類一式をダウンロードしましょう。https://github.com/Kitt-AI/snowboy.gitホットワード検出ライブラリをビルドします。foundとエラーになってしまいます。aptでインストールしたswigはswig3.0というコマンド名になっているからですね。ここはMakefileを編集しましょう。viなりnanoなりで開いて、次のように編集して保存します。makeすると成功するはずです。直下に_snowboydetect.soというファイルができていれば成功です。ホットワード検出のデモを試してみます。resources/models/snowboy.umdl2018-05-01時点ではここでエラーが出ました。pythonで相対importしている点に問題があります。一時的にimport文を直接編集して問題を回避することにします。snowboydecorder.pyを編集して次のようにします。この行を追加では再びデモを実行しましょう。failedホットワードの待ち受けに入ります。先程のdemo.pyで引数として渡したsnowboy.umdlが音声モデルであり、この音声モデルは「Snowboy」というホットワードに対するモデルです。いうわけで、マイクに向かって「Snowboy」と話してみましょう。...とターミナルに表示され「ピコーン」というサウンドが聞こえてくれば成功です。それでは先程の「Snowboy」という音声モデルを独自のものに差し替えます。Snowboyにログインすれば音声モデルの作成ができるようになります。録音もブラウザ上でできますので、お好みの音声モデルが登録されていなければ自分で作成してみてください。私は「よしこちゃん」という音声モデルを作成し使用しています。よしこちゃんで問題ないなら、この音声モデルをそのまま使用しても構いません。https://snowboy.kitt.ai/hotword/20463ダウンロードした音声モデルファイルを次の位置に配置します。ここでは音声モデルファイルをyoshiko-chan.pmdlとします。snowboy/resources/models/でも先程のデモを独自の音声モデルで実行してみましょう。resources/models/yoshiko-chan.pmdl今度は自分で選んだホットワードで話しかけて下さい。私の場合はもちろん「よしこちゃん」。前回同様に「ピコーン」というサウンドが再生されれば成功です!Snowboyの導入はこれにて完了です。サンプリング数が少ない音声モデルは検出精度がそんなに高くないのかも?私の「よしこちゃん」は、ラズパイのかなり近くで大きな声で話し掛けないと検出してくれませんでした。みんなによしこちゃんを育ててもらわねばならないのですね。まあ今回はとりあえずこれで良しとします。SwitchBotをあやつるSwitchBotをpythonからあやつるにあたって、とりあえずオン・オフがpythonから切り替えることができるかを試してみましょう。switchbotがpython-hostというpythonからSwitchBotを操作するスクリプトを提供してくれています。[github]ただこのスクリプト、root権限が必要だったり、環境によっては動かなかったりと、あまりイケてません。gistにもっと簡単な例が上がっているので、こいつをベースにスクリプトを書きます。先に必要なライブラリをインストールしておきます。bluepyではテスト用のスクリプトを作成します。offp.disconnect()このまま実行しても動きません。SwitchBotのMACアドレスを指定する必要があるのです。コメントに記載してある通り、次のコマンドでSwitchBotのMACアドレスを確認します。(unknown)...ここの表示されるMACアドレスでSwitchBotのものをコピーして、先程のソースのff:ff:ff...の箇所に貼り付けます。switchbot_bluepy.pySwitchBotのPressが走るはず!壁スイッチモード(オン・オフ切り替え式)にしている場合は、先程のソースの以下の箇所のコメントを調整して試してみて下さい。off一旦疎通が確認できればここはOKです。下準備が完了したので、ようやくお目当てのものを開発していきます。Kit上面ボタンを点灯して、音声入力待ちに「充電つけて」「充電消して」音声コマンドでSwitchBotをオン・オフに何か違うことを言ったら、最初のホットワード待ち受けモードに戻るというシンプルなものにします。ディレクトリの作成や、必要なライブラリのコピーやリンクを貼っておきます。/home/pi/yoshikoをプロジェクトディレクトリにしましょう。snowboy/_snowboydetect.so次に、switchbotパッケージを作成します。'__main__':send_command(sys.argv[1])(SwitchBotのMACアドレスを置換するのを忘れないようにしてください)これは単独で動作を確認しておきましょう。動きますでしょうか?aiyライブラリも使用できるようにシンボリックリンクを貼っておきます。aiy最後にメインのスクリプトファイルを書きます。audio_gain=10)のsensitivityとaudio_gainを調整してみてください。ささやかなヘルプはsnowboyのgithubに書いてあります。一応、ソース置いておきます。(と言っても、シンボリックリンクばっかりなんですけど。[github]あとがきとりあえず動くところまでということで、かなりpoorな実装なのでそこはあしからず。思ったほどsnowboyのホットワード検出の感度がよろしくない・・・。これなら、素直にJulius使った方がいいのかもしれない。aiy.audio.sayでよしこちゃんに日本語を話してもらおうと思ったのですが、内部で使用しているpico2waveが日本語に対応していないので無理みたいでした・・・。ここも素直にOpenJtalkに置き換えた方が手っ取り早そう・・・。Kitのボタン操作にaiyライブラリ使用するぐらいでいいのかな。OpenJTalk(発話)という構成でよしこちゃんをいぢることにします。返信をキャンセルメールアドレスが公開されることはありません。名前*メール*サイト上に表示された文字を入力してください。コメントデータの処理方法の詳細はこちらをご覧ください。検索:プロフィールitmammothIT界のマンモスを目指しているフリーエンジニアです。麻婆豆腐/Ruby/Kotlin/麻婆春雨/Python好きです。最近カリフラワーも好きになりました。