AIY Voice Kit V2 電源入れたらGoogleアシスタントを実行

とりあえず、サンプルプログラムが動くようになったので、電源をいれたら、実行されるようにしたいと思います。

OSのバージョン

念のため確認。

1
2
3
4
5
6
pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 9.1 (stretch)
Release: 9.1
Codename: stretch

どうやるの?

こちらの記事(Google Voice Kit をオートスタートさせる)を参考に、/home/pi/AIY-projects-python/HACKING.mdのRunning automaticallyの項に従うことにしました。

最新のイメージファイルだと、HACKING.mdに記載がないらしいのですが、V2でデフォルトの状態では、記載がありました。

1
2
3
4
5
If you want the voice recognizer service to run automatically when the Pi
boots, you need to have a file in the `src` directory named `main.py`. You can
make a copy of one of the example scripts and rename it. Then run this command:

sudo systemctl enable voice-recognizer.service

実行したいPythonのソースファイルをsrc/main.pyとして保存して、voice-recognizer.serviceを有効にすればよいと。

というわけで、とりあえずコピー。

1
pi@raspberrypi:~ $ cp ./AIY-voice-kit-python/src/examples/voice/assistant_grpc_demo.py ./AIY-voice-kit-python/src/main.py

参考にした記事にはvoice-recognizer.serviceに不備があるとありますが、とりあえず、このままいってみます。
voice-recognizer.serviceを有効化。

1
2
pi@raspberrypi:~ $ sudo systemctl enable voice-recognizer.service
Created symlink /etc/systemd/system/multi-user.target.wants/voice-recognizer.service → /lib/systemd/system/voice-recognizer.service.

起動後、ステータスを確認。残念な結果のようです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pi@raspberrypi:~ $ systemctl status voice-recognizer.service
● voice-recognizer.service - voice recognizer
Loaded: loaded (/lib/systemd/system/voice-recognizer.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sat 2018-12-01 11:49:32 UTC; 1min 54s ago
Process: 750 ExecStart=/home/pi/AIY-projects-python/env/bin/python3 -u src/main.py (code=exited, status=203/EXEC)
Main PID: 750 (code=exited, status=203/EXEC)

Dec 01 11:49:32 raspberrypi systemd[1]: voice-recognizer.service: Failed with result 'exit-code'.
Dec 01 11:49:32 raspberrypi systemd[1]: voice-recognizer.service: Service hold-off time over, scheduling restart.
Dec 01 11:49:32 raspberrypi systemd[1]: Stopped voice recognizer.
Dec 01 11:49:32 raspberrypi systemd[1]: voice-recognizer.service: Start request repeated too quickly.
Dec 01 11:49:32 raspberrypi systemd[1]: Failed to start voice recognizer.
Dec 01 11:49:32 raspberrypi systemd[1]: voice-recognizer.service: Unit entered failed state.
Dec 01 11:49:32 raspberrypi systemd[1]: voice-recognizer.service: Failed with result 'exit-code'.
pi@raspberrypi:~ $ /home/pi/AIY-projects-python/env/bin/python3 -u src/main.py

しかたがないので、/lib/systemd/system/voice-recognizer.service を編集することに。
参考にしたサイトからコピペしていいのかよくわからなかったので、とりあえずExecStartのパスが怪しいと思って書き直しました。

前:ExecStart=/home/pi/AIY-projects-python/env/bin/python3 -u src/main.py
後:ExecStart=/usr/bin/python3 -u /home/pi/AIY-projects-python/src/main.py

全体はこちら。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# This service can be used to run your code automatically on startup. Look in
# HACKING.md for instructions on creating main.py and enabling it.

[Unit]
Description=voice recognizer
After=network.target ntpdate.service

[Service]
Environment=VIRTUAL_ENV=/home/pi/AIY-projects-python/env
Environment=PATH=/home/pi/AIY-projects-python/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ExecStart=/usr/bin/python3 -u /home/pi/AIY-projects-python/src/main.py
WorkingDirectory=/home/pi/AIY-projects-python
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi

[Install]
WantedBy=multi-user.target

そしてリブート後、再確認。
スクリプトの実行はうまくいったようです。

1
2
3
4
5
6
7
8
9
10
11
pi@raspberrypi:~ $ systemctl status voice-recognizer.service
● voice-recognizer.service - voice recognizer
Loaded: loaded (/lib/systemd/system/voice-recognizer.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2018-12-01 12:10:45 UTC; 2min 26s ago
Main PID: 556 (python3)
CGroup: /system.slice/voice-recognizer.service
└─556 /usr/bin/python3 -u /home/pi/AIY-projects-python/src/main.py

Dec 01 12:10:45 raspberrypi systemd[1]: Started voice recognizer.
Dec 01 12:12:00 raspberrypi python3[556]: Press the button and speak
Dec 01 12:12:00 raspberrypi python3[556]: [2018-12-01 12:12:00,698] INFO:recorder:started recording

1度シャットダウンして、電源を入れなおしてみます。(ターミナル接続なし)
ボタンを押して話しかけたら答えてくれました。

これで。

シンプルなAIスピーカとしては使えますが。

起動してるんだか。
ちゃんと聞いてくれてるんだか。
問い合わせ中なんだか。

全くわからない。

ので。

何らかの形でわかるようにしたい。

と思うのでありました。

やれるのかな。やれるよね。きっと。

いや。

その前にOSの時間がずれているの直したいような気がする。

なお。

OSの時間がずれていても、今の時間はちゃんと正しいのを答えてくれます。
Googleアシスタントは、毎回APIで聞きにいっているからだと思われます。

Google AIY Voice Kit V2 組み立てて日本語を話すまで

自分で自分に誕生日プレゼント第2弾。
Google AIY Voice Kit V2。

++++

【国内代理店版】Google AIY Voice Kit V2
Google
売り上げランキング: 52,251

++++

Raspberry Pi Zero WHからGoogle Assistant APIを使う、AIスピーカー自作キット。
必要なものが一式そろっています。

これ以外に必要なのは

  • USB電源
  • 精密ドライバー(2mmマイナス)
  • セットアップに使うPCなど

マニュアルはキットには付属していないので下記サイトを参照します。(英語)
https://aiyprojects.withgoogle.com/voice

組み立て

マニュアルを見れば迷わずできます。

セットアップの方法は2種類

組み立て後、セットアップ方法はふたつあります。

  1. スマホのAndroidアプリとPC(Window,Mac,Linux)を使う
  2. RspberryPiにモニター、キーボードなどつなげてセットアップ

アプリを使う方法でやってみることにしました。
AIY専用のAndroidアプリを使って、スマホとRaspberryPiをBlootoothで接続。RaspberryPiのWiFi設定をします。
その後、PCからRaspberryPiにターミナルからSSH接続します。

WiFi設定

マニュアルを見れば迷わずできますが、スマホに表示されるIPアドレスがなぜかグローバルでした。
PCから接続できなくておかしいことに気づき、アプリからの設定を再実行したところ、いつもの見慣れた192.168のアドレスになりました。

Google Assistantのセットアップ

Googleアカウントが必要ですが、アプリからのセットアップを選択しているくらいなので、当然持っています。

ターミナルの使い方からSTEP by STEP で解説されています。
https://aiyprojects.withgoogle.com/voice#google-assistant

何をしているのかよくわかりませんが、いわれるがままにポチポチいきます。
STEP 99 まで進むとAssistantが無事起動しました。(なお、STEP1は箱を開けるところからです)

感動です。

でも。

英語です。

動作確認で言ってみろと言われる「sing」も何度かトライしてやっと認識してもらいました。

日本語にしたい。

日本語にできるのか?

軽く日本語情報でググるとめんどくさそうな方法ばかりでてきます。
しかもV1で。(今回はV2)

しかし、SWITCH SCIENCEの紹介ページには、「日本語で話しかければ、スマート スピーカーがAI技術を利用してより人間的な応答をしてくれます。」とあります。

これは簡単にできるはずでは?

しかたなく英語でググったところ、このサイトにデモ用のPythonプログラムに1行追加したらうまくいったと書いてある。

ソースを編集して、日本語にする

編集したのは、/home/pi/AIY-voice-kit-python/src/examples/voice/assistant_grpc_demo.py

1
2
3
4
5
6
7
import logging

import aiy.assistant.grpc
import aiy.audio
import aiy.voicehat

aiy.i18n.set_language_code('ja-JP') #これを追加

これでassistant_grpc_demo.pyを実行してみたら、日本語になったー。

と喜んだのもつかの間。

アカウントと紐づけないと使いえないよ的なことを言われる。

Voice KitからGoogleアカウントへのアクセスを許可する

スマホのGoogleアシスタントから設定する必要があるのでインストールしました。

  • Googleアシスタントの設定画面開く
  • 「アシスタント」のタブを選ぶ
  • 「アシスタントデバイス」のVoice Kitを選ぶ
  • 「アカウントに基づく情報」を許可するところをON(右側)に。

できた

実行画面

このあとは

電源いれたらGoogleアシスタント(とりあえずこのデモのプログラム)が起動するようにしたいなーと思います。

Robotime スペースハンティング ソーラーパネル 3Dパズル

子どもたちの物心がついたころから。
自分用のおもちゃが買いづらくなっており。
誕生日付近に自分用のおもちゃを買うようになりました。

今年の第1弾はこれ。
++++

++++

これはなに?

  • 木製の3Dパズルということになっていますが、ちゃんと組み立て説明書がついています。
  • 作業する感覚はプラモデルと同じです。
  • 同梱されているもの以外では、カッターが必要でした。
  • いまどきのロボットおもちゃのようにプログラミングできたりはしません。

なぜこれにしたか

巷にあふれる「プログラミングできる」ロボットおもちゃをどれか試してみようかな。

と思っていたのですが。

プログラミング以外の要素になじみがなさ過ぎて。
遊び倒せる気がしないし。
すぐ飽きるのは目に見えている。

ならば。

一発モノのほうがいい。

最初はタミヤの模型キットで何か作ろうかなーと物色していたのですが。
見て回っているうちに目についたのがこのシリーズ

どれもこれもかっこいいではありませんか。

といっても。

難しすぎるのは作り切れる自信がない。

ということで。

お手頃価格で。
モーターとかギアを扱えるこちらのモデルにしてみました。

つくってみて

  • 説明書は英語のみでしたが、読む必要がある文章はほんのちょっとです。全く問題ありませんでした。
  • きっちり嵌められるように作られていて感動します。
  • きっちりすぎて、嵌めるのが大変なところも多いです。
  • 適宜余った板などを使って押したりもしましたが指が痛くなりました。
  • ぽきっといった部品もありますが、完成後に残った部品もあり、折れそうなやつは多めに用意されているっぽいです。
  • カッターで軸になる棒を切る手順があるのですが、実物大の長さが印刷されており、それにあわせて切ればいいので気が楽です。
  • 所要時間は数時間。
  • モーターのスイッチはありません。

完成した

かっこいいです。
完成しても走りださなくてちょっとがっかりしていましたが、太陽光にあてたら回りだしました。
部屋のあかりで走り出しちゃったら、うかつに飾っておけないですものね。

玄関に飾っておこうと思います。

キュリオシティローバー

テクノロジア魔法学校オープンキャンパス

テクノロジア魔法学校が、いまだけ無料体験をしているというので、早速やってみました。

やった人のレベル

  • まがりなりにも、業務でJavaScriptやHTML、CSSを書く機会があるが、基本的に地味なものしか作ったことがない
  • 特別ディズニー好きではないが、嫌いでもない
  • 「アプリを作りながらプログラミング学習しよう」系の本をやりきったことがない(途中であきてオリジナルを作り出す)

雑感

よかった。

  • 始まりはなんとなくゼルダっぽい。
  • ナビゲーションしてくれるキャラクターがかわいい
  • 数行の命令で図形が描けて、マウスに合わせて動くようにできるのは単純にうれしい
  • 色が動きに合わせてかわるのも感動する
  • コード入力する場所が、問題によってかわるのは意外と平気

いまいち。

  • 始まりがもったいぶりすぎなのと主人公のキャラ設定が好きじゃない。(好みの問題)
  • スクロールとかドラッグ&ドロップとかコピペの練習とか、ちょっとうんざり。12歳以上対象なのに。
  • ディズニーキャラクターはセリフのごく一部しかしゃべらない。
  • 全体感が見えない。(初心者向けに意図してやっているらしい)
  • 勉強したことを使って簡単なオリジナルアプリを作ってみよう!!に必要な情報が提供されていない。
  • 100時間も言われたことしかやらないのは耐えられない気がする。(好みの問題)

これが初心者にウケるのかどうかは不明。
意外とうちの子はやりたがるかもしれない。(みせてない)

Scratchの次はこれ?

ここには「Scratchの次はこれ」って書いてあるが、そんな感じはしない。
Scratch未経験者やScratchにはまらなかった子のほうがはまりそうな気がした。

図鑑漢字ドリル小学1~6年生 危険生物

++++

++++

うちの子たちが通う小学校では、毎日、自主学習が宿題になっていて、ノートに1ページ以上、何かしらお勉強をすることになっています。市販のドリルでもいいということで、長男と一緒に本屋さんで物色して購入したのがこちら。

図鑑好きの、それも危険生物図鑑をポケット版と大きい版と両方もっている長男にとってはたまらないドリル。

楽しそうです。

1日1ページずつやっているので、2か月くらいかかるのかな。

ぜひとも魚とか人体とか地球あたりでも出していただきたいものです。

小学生向けワークショップにて

小学生向けのプログラミングワークショップを。
やらせていただく機会がときどきあります。

回数としては。
両手におさまる程度の経験しかないのですが。

小学生というものは。

本当に。

学ぶことのプロだなと感じます。

わからないことを。
わかろうとする。

新しい概念を。
自分のものにしようとする。

その姿勢がデフォルト。

小学生のすごさというのは。

柔軟な発想とか。
独創的なアイデアとか。

そういうものではなく。

自分が持っているフレームワークの中に納まらないものを排除しない。

その1点に尽きるのではないかと思い始めています。

ロボホンのアプリをScratchで学ぶ

「ごはんないよ」アプリが。
とりあえず動くようになったので。

肉付けしていく前に。
勘で書いたところを裏付けるべく。

ドキュメントよもっかなー。

と開いてみたものの。

ZZZ….

ムリ。

読むともなしに眺めていたら。

Scratchって。
基本設計に便利そうだよな。

と以前から感じていたことを思い出したので。

ちょっと。

Scratchでアニメーションにしてみよう。

と思いたち。

今のところの理解で。
作ってみました。

横向いているペンギンがロボホンそのもの。
前向いているペンギンがロボホンの中の人。

Scratchでロボホンアプリのお勉強

Scratchプロジェクトも初公開してみました

雰囲気はそれっぽい気がする。
のちほどソースと見比べたいと思います。

そして。

こうやって作ると基本設計っぽい。
フレームワーク学習に使える気がするのでした。

Scratchでデザインパターン。

とかやっている人いそうですね。(調べてない)

ロボホンのアプリ開発者への道 声だけでメッセージを送る

「ごはんないよ」アプリを作成中。
起動するときの「ことば」を設定するところまできました。

今は、ボタンをタップするとメッセージを送るようになっているので、音声だけで送れるようにしたいと思います。

onResume()

いかにも必要そうなのでとりあえず有効化。

1
2
3
4
5
// VoiceUIManagerのインスタンス取得.
これの下のコメントアウトされていたものたちを有効化

//VoiceUIListenerの登録.
これの下のコメントアウトされていたものを有効化

ScenarioDefinitions.java

サンプルアプリを見て、勘で追加。

1
2
3
4
/**
* function:「ごはんないよ」をおくる
*/
public static final String FUNC_SEND_NAIYO = "naiyo";

MainActivity.java onExecCommand

サンプルアプリを見て、勘で追加。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Override
public void onExecCommand(String command, List<VoiceUIVariable> variables) {
Log.v(TAG, "onExecCommand() : " + command);
switch (command) {
case ScenarioDefinitions.FUNC_END_APP:
finish();
break;
case ScenarioDefinitions.FUNC_START_PROJECTOR:
//TODO プロジェクタマネージャの開始(プロジェクター利用時のみ).
//if(!isProjected) {
// startService(getIntentForProjector());
//}
break;
// 「ごはんないよ」追加
case ScenarioDefinitions.FUNC_SEND_NAIYO:
// メッセージ送信要求
sendBroadcast(getIntentForMessage());
break;
default:
break;
}
}

ホーム用シナリオ

そういえば、「ごはんないよ」で起動したかったんだと思い出して修正。

1
2
3
<situation priority="78" topic_id="start" trigger="user-word">
${Local:WORD_APPLICATION_FREEWORD} eq ごはんないよ
</situation>

こんな感じにしてみました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<topic id="start" listen="false">
<action index="1">
<speech>${resolver:speech_ok(${resolver:ok_id})}</speech>
<behavior id="${resolver:motion_ok(${resolver:ok_id})}" type="normal" />
</action>
<action index="2">
<speech>きどうしたよ。</speech>
<behavior id="assign" type="normal" />
<control function="start_activity" target="home">
<data key="package_name" value="net.rissoku.tapontalk" />
<data key="class_name" value="net.rissoku.tapontalk.MainActivity" />
</control>
</action>
<action index="3">
<speech>メールするね</speech>
<behavior id="0x040808" type="normal" />
<control function="naiyo" target="net.rissoku.tapontalk">
</control>
</action>
</topic>

そして。

ロボホンへ送り込む。
動きも確認したいのでケーブルもはずし。
いちど頭のボタンを押してから。

  • わたし「ごはんないよ」
  • ここあ「うん」
  • ここあ「きどうしたよ」
  • ここあ「メールするね」(“りょうかーい”のときと同じうごき)
  • ここあ「なほに”ごはんないよ”っておくっていい?」
  • わたし「いいよ」
  • ここあ「りょうかーい。送信するね」

できたー。

参考にしたのは

0401_SR01MW_Application_Programming_Guide_V01_03_00.pdf
0601_SR01MW_HVML2.0_Specification_V01_01_00.pdf
HVML2.0_Specification_Appendix_A
サンプルアプリ:SampleSimple

小学生はプログラミング検定合格を目指すのだろうか

小学生向けのプログラミング検定

「小学生向けのプログラミング検定」というワードが目につくようになったので、軽く調べてみたら、レゴのやつとScratchのやつとIchigoJamのやつが出てきました。

  • ロボット検定 For Wedo2.0
    ロボット検定のエントリーレベルとして追加されたようです。

  • ジュニアプログラミング検定
    王道のScratch。これを利用した実践例は聞いたことがあります。
    ただし、「MITメディア・ラボのLifelong Kindergartenグループが監修・運営等に関わるものではありません。」と明記されています。

  • IchigoJam検定
    本家本元がカリキュラム基準の提供を目的に始めたようです。ちょっと意外な気がしました。
    こういうものがあったほうが、授業で導入してもらいやすいという判断でしょうか。

学習すべき項目と到達基準が客観的に測れるものとして、活用されるのだと思いますが、
子どもたちのプログラミング学習が「テストのための勉強」にならないといいなあというのが率直な感想です。

テストありきのインプットとアウトプットのためのインプットは違う

これとは、まったく違う文脈で、gaccoでとある講座を受講開始しまして、本当に久しぶりに「確認テスト」に挑戦しました。これが、なんていうか、無駄に難しく感じたのです。選択式なのに、注意深く読まないと選択できないものが多くて苦戦しました。資料を読み返しながらやったのに、満点をとれなかったレベル。

問題に解答するために資料を読み返すって、本当に久しぶりの行為なんですが、注意の払い方が普段と違うことに気が付きました。

わたしは、普段から色々な資料を読み漁っているほうだと思うのですが、いつもはアウトプットのためのインプットです。企画を立てるときの仮説の裏どりや、考え方のベースにするための基礎知識の獲得が目的だったり、直接的なHowToを探すこともあります。当然ですが、そういうときは全体の文脈をとらえ、その中で重要なトピックを拾い上げていくという読み方になります。

ところが。

問題に解答するときは、逆なんですね。枝葉から入る。全く森が見えてこない。

思い返してみれば、若い頃は。

全体をとらえ、だんだん細かいトピックに入っていき、テストで聞かれるような細かいことまで覚えこんでいく。

という勉強をしていました。

若いころであれば、それほど違和感もなく、gaccoのテストにも臨めたかもしれません。しかし、残念ながら歳をとりました。残念です。

そして子どもたち

前述のプログラミング検定。どのような問題なのかは、確認していませんが、おそらく、順番に取り組めば、バランスよく知識が得られるように設計されているのでしょう。いくらなんでも枝葉な問題ばかりということはないでしょう。

でも、問題に答えるためにやりかたを覚えるのと、実現したいことのためにやり方を覚えるのって、ワクワク感が違いすぎます。
力試しとか知識の穴を埋めるためにテストを活用するのはいいと思いますが、プログラミングの楽しさを感じることが第一優先なはずの小学生が「テスト合格を目指して」勉強するのは、さけてほしいなと思います。

IchigonQuest

教育ITソリューションEXPO 2018にて。
わたしのココロに刺さりました。

イチゴンクエスト

公式サイト:IchigonQuest

↓公式サイトにのってるYouTube

わたし、この動画の方に説明していただいたようです。

ありそうでなかったこのUI。
たまらないです。

欲しい!!

と思わず口に出たワタクシ。

でも。

はんだ付けが必要。

とのことでひるんでおります。
はんだ付け未経験ゆえ。(道具もないし)

だれか。。