ファシリテーション用タイマー

ワークショップなどでファシリテーションをするときに使うためのタイマーを作ってみました。

使う場面

プロジェクタなどを使って進行しているワークショップや授業など。
時間を切って作業してほしいとき。
プロジェクタなどに映し出しておくことを想定。

どういうもの?

こういうの
https://rissoku.net/petitapp/cocoa-timer/

画面キャプチャ

タイマーの使い方

一般的なキッチンタイマーとほぼ同じ。(だと思う)
10分、1分、10秒、1秒のボタンで時間をセット。
「スタート」でカウントダウンを開始し、0秒になったら点滅。音はなりません。
途中でやめたいときは「ストップ」
「リセット」で元に戻る。

なぜ作ったか

小学校にお邪魔して実施しているプログラミング授業のコンテンツのひとつで「1分でやってみよう」ワークが含まれているものがあり、欲しいと思っていたから。適当なツールなり、物理的なタイマーなり探そうかと思ったのですが、衝動的に作ってみました。
1分ワークに限らず、たとえば20分のワーク時間をとるときとか「この時計で15分まで」というより「このタイマーがゼロになるまで」のほうが、やりやすいよね。と。まだ実践で使っていないので、使いながら改善していこうと思っています。

ソース

ソースはgithubの練習がてらこちらにも。
https://github.com/cocoakamen/cocoa-timer

本当に練習なので、公開ツールな感じになってませんが、使ってみるのが大事ということで。
hello-worldだけして半年以上放置していたアカウントがついに活かされる時がやってきました。
githubを使うと、なんだか、エンジニアな気がしてきます。(単なる気のせい)

ライブラリなどは使わず、プレーンなhtml/css/javascriptで書いてみました。画像も使ってません。数字はdivのborderで書いてます。
ボタンは、どこかからのコピペ。

かけ算の順序を学ぶScratchのサンプルをリミックスしてみた

ベネッセの指導案サイト「プロアンズ」の「かけ算の文章問題名人をめざして」を利用した取り組みが紹介されているICT教育ニュースの記事を読んで、Scratchのプログラムを動かしてみました。

後半で使う060_小2算数_九九の文章問題をつくる_20190319で遊んでみたら、現れたこのシュールな出力。

女の子の手の数と本の数の順番が逆

ひと笑いしたあと訪れる疑問。

掛け算の順番が違うからってこうなるのおかしくない?

ということで前半の方059_小2算数_九九の文章問題を解く_20190319.sb3に戻って確認。

りんごが5個ずつ。おさらが2つの場合。

正解の時。
順番OK。

不正解の時。
順番NG。

….

なんか。いずい。
かけざんの順番変えたら、数えるものが変わるってどういうこと?

….

どっちかというとこんなイメージ。
2×5ならこうでは?

掛け算の順序問題については、特に言を持ちませんが、私の感覚に忠実なものをScratchのお勉強がてら、作ってみました。
https://scratch.mit.edu/projects/312157573/

Bowl2スプライトのコードの右のほうに該当のロジックはありました。
こんな感じに。
絵を描くところ

あ。でも、本当は問題と違う数の場合でも、そのまま描いちゃえばいいような気はします。
気が向いたら、またやってみます。

なお、これが、プログラミング教材として適切かどうか。という点に関しては、少し前に話題になった、文章を作るやつの時と同じ感想を持っています。

『ブランディングの本質 100年先につなぐ価値』平井 克幸 (著), タナベ経営 ブランディングコンサルティングチーム (編集)

++++


++++

なぜこれを読んだか

ここ数年、ブランディングとか、マーケティングとか、コンセプトメイクとか、実際どうやるの?というところの概観を、お手軽に把握できる本があれば読みたいなーと、ぼんやり考えつつ、この分野の本を手に取ることすらない日々が続いてました。

先日、久しぶりに大型書店で時間つぶしをする機会があり、何冊か立ち読みした結果、購入したのがこちらの本です。

読み終わって

全体を通して、非常に読みやすくてわかりやすく、数時間で一気に読めました。
内容がいいとか悪いとかはわからないのですが、「やってみたい」と思わせるには十分な納得感でした。

ことばのチョイスがいちいちカッコいい

全体を通して、割とキャッチーな言葉づかいをしている印象。好みの分かれるところですが、私は結構好きです。

いくつか印象に残ったセンテンス

センテンスのカッコよさや内容が印象に残ったセンテンスをあげてみます。

  • ブランドとは顧客との約束であると同時に、社員との約束でもある。働く全ての社員に「この分野の技術に関しては、他社には絶対に負けない」という自信と誇りを与え、それを磨き続ける努力を怠らないことがナンバーワンブランドには不可欠になる。

  • ギャップは解消するためにあるのだ。

  • ブランドイメージを高める点で重要なのは、社会貢献を単なる寄付やボランティア活動で終わらせないことだ。そこに自社ならではの”ストーリー”が必要になってくる。

  • ブランドとは、組織風土や企業文化といったDNAレベルで形成されるもので、それと連動することが必要である。

  • コンセプトに正解はない。そこにあるのはブランドに込められた思想であり、意思である。

  • 自分のこだわりや好みを信じて貫き通すこと。そこに心を揺さぶる「何か」があれば、必ず共鳴する顧客が現れるはずだ。

  • 整理と統一なくして強いブランドはできない。新しいことを付加するのはいいが、散らかしすぎると「何でも屋」になってしまう。捨てる勇気があって初めて、ナンバーワンブランドが成り立つことを肝に銘じておきたい。

やっぱりリアル本屋さんもいい

以前は、本屋さんをぐるぐる回って立ち読みして、やっと1冊買う。みたいな休日の過ごし方をしていたものですが、近頃は、レビュー記事やAmazonのレコメンド機能を頼りに、書籍を購入するのがデフォルト。ひさしぶりに、なんの前情報もない状態での立ち読みからの購入でした。

こういう本の買い方で、一気に読めると、もうそれだけでうれしいです。

Amazon:
ファーストコールカンパニーシリーズ ブランディングの本質 100年先につなぐ価値

「主語と述語に気を付けながら場面に合ったことばを使おう」というプログラミング授業事例

プログラミング教育ポータル

文科省、総務省、経産省が一緒に取り組んでいる
「未来の学びコンソーシアム」というのがあります。

そこには、小学校でのプログラミング教育事例を掲載したポータルサイトがあります。

で。

今までは。
扱っているテーマが何なのか。
くらいしか見ていなかったのですが。

なんとなく中身を見てみようと思い立ち。
目についたのがこちら。

主語と述語に気を付けながら場面に合ったことばを使おう
https://miraino-manabi.jp/content/290

助詞を穴埋めさせることを「プログラミング体験」としていることに衝撃を受け。
思わずツイート。

この事例に思うこと

その後、細切れにツイートしたのをここにも残しておきたいと思います。

まず第1印象は上述の通り、衝撃。

そして、衝撃が去っての感想。

これに続いて、細切れにコメントをツイートしていますが。
あらためて考えをまとめなおしてみます。

まとまった授業時間が確保できないこと。
対象学年が2年生であること。

を鑑みれば。

  • ブロックの操作になれること。
  • 自分のブロックの操作で何らかの結果を得られること。
  • 自分が動かしているモノ自体が、同じようにブロックを並べて作ったものであることを知ること。

をもって、プログラミング体験とするのも、いいのかもしれないと。

ただし。

日本語の穴埋めがプログラミングではない。
ということを子どもたちに認識させた上で。

他の時間で実際に子供たちがプログラミングする時間を確保できるのであれば。

と思います。

あらためてみてみると

この事例で使われているScratchのプロジェクトは以下で確認できるんですが。
https://scratch.mit.edu/projects/276907585/

実行画面がシュールで面白いので。
こういうの作りたい!!と思う子も出てくるのでは。

と思いました。

scratch

三角関数より分数の割り算のほうがいらないと思う。

三角関数はほっとけばいいと思う

三角関数って。
あんなに苦しめられたのに役に立たないもの筆頭。
みたいにあげられることが多いですけど。

三角関数って。
そこまで目の敵にするほど難しくないと思うんです。

定義自体は簡単ですし。
公式は加法定理だけ覚えておけば入試問題くらい解けるんです。

便利なものなんだから。
日常的に使っている人たくさんいるんだから。
粛々と覚えればいいじゃないですか。

と思うくらいには理系脳です。

それよりも分数の割り算

それより。

分数の割り算って。
小学校でしか使わないし。

分数で割るって意味わかんないし。
いらないと思うんです。

やめればいいのに。

って思います。

小学生の時。
分数の割り算はなぜひっくり返してかけるのか。
全く腹落ちしていませんでした。

そして。

腹落ちしないまま。
私の世界から。
分数の割り算は消えました。

「分ける」計算から「比を求める」計算へ

割り算は。

10個の飴玉を5人に分けたら1人いくつもらえますか。

というようなときに使う計算として私の前に現れました。

なので。

割り算は分けるための計算。

だという理解をしていました。

分数は。

ピザをみんなで分けたときの大きさを表す数でした。

それがあるとき。

私の中で。

割り算は比を求めるための計算なのだ。

と再定義され。

分数は割り算の表現方法の一つなのだ。

と認識が変わりました。

すると。

見える世界が大転換しました。

そもそも。

分数で分けるってどういうこと?

なんて。

考える必要がなくなりました。

比を求めるなら。
相手は分数だろうが整数だろうが少数だろうが。
関係ありません。

目の前がぱーっと明るくなりました。

時すでに遅し

しかし。

不幸なことに。

そのころには。

分数の割り算が。
私の目の前に現れることはありませんでした。

中学数学以降。

「分数をかける」ことはあっても。
「分数で割る」ことを意識したことはないと思うのです。(たぶん)

なんのための分数の割り算だったのか。
いまだに腑に落ちません。

親として

ただひとつ言えるのは。

小学生時代に。
分数の割り算が腹落ちしなくても。
全く問題ないこと。

もし。

自分の子供が分数の割り算でつまづいたら。

いまはそういうものと思っておけばいい。
そのうちわかる。と伝えたいと思います。

ml5jsのLSTMサンプルを動かしてみる

本を読み始めたのはいいが、とりあえず動かしたい

ゼロから作るDeep Learningをちびちび読んでいるのですが。
ちびちびすぎて、まだ4章。
先が長すぎる。

とりあえず動かしてみよう。

ってことで。

ml5.jsLSTMのサンプルプログラムを動かしてみようと思い立ちました。

LSTMって何?っていう疑問はとりあえず脇に置いておいて。
日本語のデータ作って、動かすぞ。

というのをゴールにすることにします。

Local環境で動かす

とりあえず、ここから一式持ってきました。
https://github.com/ml5js/ml5-examples

で。これがLocalで動くことを確認。
https://github.com/ml5js/ml5-examples/tree/master/p5js/LSTM/LSTM_Text

ここまでは順調。
次はデータ作成。

tensorflowをインストールする

とりあえずここだけを見て。
https://www.tensorflow.org/install/?hl=ja

tensflow

えい。

1
2
3
4
5
6
c:\work\ml5js\training-lstm>pip install tensorflow
Collecting tensorflow
Could not find a version that satisfies the requirement tensorflow (from versions: )
No matching distribution found for tensorflow
You are using pip version 18.0, however version 18.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.

だめだった。

言われた通り、pipをupgrade。

1
2
3
4
5
6
7
8
9
c:\work\ml5js\training-lstm>python -m pip install --upgrade pip
Collecting pip
Downloading https://files.pythonhosted.org/packages/c2/d7/90f34cb0d83a6c5631cf71dfe64cc1054598c843a92b400e55675cc2ac37/pip-18.1-py2.py3-none-any.whl (1.3MB)
100% |████████████████████████████████| 1.3MB 4.6MB/s
Installing collected packages: pip
Found existing installation: pip 18.0
Uninstalling pip-18.0:
Successfully uninstalled pip-18.0
Successfully installed pip-18.1

もういっかい。えい。

1
2
3
4
c:\work\ml5js>pip install tensorflow
Collecting tensorflow
Could not find a version that satisfies the requirement tensorflow (from versions: )
No matching distribution found for tensorflow

だめだった。

しかたがないので。

ちゃんとインストールガイドを見ることに。
https://www.tensorflow.org/install/pip?hl=ja

ここまでたどり着いた。

1
2
3
4
5
6
7
8
c:\work\ml5js>python --version
Python 3.6.5

c:\work\ml5js>pip --version
pip 18.1 from c:\users\nahok\appdata\local\programs\python\python36-32\lib\site-packages\pip (python 3.6)

c:\work\ml5js>virtualenv --version
16.2.0

しかしインストールできない。

URL指定でもやってみた。

1
2
C:\work\ml5js>pip3 install --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.12.0-cp36-cp36m-win_amd64.whl
tensorflow-1.12.0-cp36-cp36m-win_amd64.whl is not a supported wheel on this platform.

だめだった。

そして気づく。

おや。ぼくのPython、32bit?

1
2
3
C:\work\ml5js>python
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 16:07:46) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.

PC自体が64bitなのは知っていたのでノーケアだった。

もはや。

いつ、どうやってpythonをインストールしたのか定かではない。
Pythonには32bitと64bitがあるのか。そうか。そうなのか。

入れなおした。(追加して入れた。Pathは入れてから環境変数直した)

1
2
3
4
C:\work\ml5js>python
Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

えい。

1
2
3
C:\work\ml5js>pip3 install --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.12.0-cp36-cp36m-win_amd64.whl
(中略)
Successfully installed tensorflow-1.12.0

やっと成功した。

virtualenvいれたのに普通にインストールしちゃった。

気にしない。

チュートリアルTraining a LSTM

やっと本題。

このチュートリアルをすすめます。
https://ml5js.org/docs/training-lstm

  1. トレーニング用のリポジトリから一式持ってくる

gitでcloneしてくるだけ。

1
2
3
4
5
6
7
C:\work\ml5js>git clone https://github.com/ml5js/training-lstm.git
Cloning into 'training-lstm'...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 30 (delta 2), reused 0 (delta 0), pack-reused 24
Unpacking objects: 100% (30/30), done.
  1. データを持ってくる

さて。どうしよう。青空文庫でいっか。

こちらを参考に。(というかそのまま実行)
【Python】MeCabを使って青空文庫を簡単に分かち書きする方法

GoogleColabって初めて知りました。
すごいですね。

ここでゲットした「吾輩は猫である」の分かち書きテキストを。
トレーニングのインプットにするべく。
mydataフォルダを作って、input.txtという名前で保存。

  1. トレーニング!!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
c:\work\ml5js\training-lstm>python train.py --data_dir=.\mydata
Here we go! Reading text file...
0/10500 (epoch 0), train_loss = 8.013, time/batch = 0.963
Model saved to checkpoints\.\mydata\.\mydata!
1/10500 (epoch 0), train_loss = 7.999, time/batch = 0.691
2/10500 (epoch 0), train_loss = 7.961, time/batch = 0.675
(中略)
10497/10500 (epoch 49), train_loss = 1.844, time/batch = 0.602
10498/10500 (epoch 49), train_loss = 1.918, time/batch = 0.614
10499/10500 (epoch 49), train_loss = 1.826, time/batch = 0.593
Model saved to checkpoints\.\mydata\.\mydata!
Converting model to ml5js: .\mydata .\mydata-10499
Done! The output model is in models
Check https://ml5js.org/docs/training-lstm for more information.

終わった!!

どれくらい時間かかったかわからないんですが。

0.6秒 × 10500 = 105分

くらいでしょうか。

4.自分のデータを使う

LSTM_Textのmodelsフォルダにフォルダごと放り込む。
lstm

sketch.jsのデータ指定しているところを変更する。

1
2
3
// Create the LSTM Generator passing it the model directory
//charRNN = ml5.charRNN('./models/woolf/', modelReady);
charRNN = ml5.charRNN('./models/mydata/', modelReady);

index.htmlも、ちょろちょろ見た目を修正して。
できたー。

lstm text

まとめ

だから、何?という感じ。

せっかくなのでアップしてみた。
http://rissoku.net/petitapp/LSTM_Text/

さ。

ゼロから作るDeep Learningの続き読もっと。

「ゼロから作るDeep Learning」のサンプルプログラム(MNIST)を動かす

なぜか

半年ほど前(夏の暑いころ)に衝動的に買いました。
誰かが絶賛していた記憶。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
斎藤 康毅
オライリージャパン
売り上げランキング: 308

ずっと放置していたので

大掃除からの現実逃避冬休みの自由研究的に。
雰囲気だけでもつかもうかなと。
さらっとサンプルプログラムを動かしつつ読み始めました。

サンプルプログラムはこちら。
https://github.com/oreilly-japan/deep-learning-from-scratch

3章の「手書き数字認識」まできました

ニューラルネットワークとかの基礎的な解説も終わり。
いよいよ手書き数字認識。

さっそくエラー

とりあえず実行してみたら出たエラー

1
2
3
4
5
C:\work\python>python c:/work/python/deep-learning-from-scratch-master/ch03/neuralnet_mnist.py
Traceback (most recent call last):
File "c:/work/python/deep-learning-from-scratch-master/ch03/neuralnet_mnist.py", line 6, in <module>
from dataset.mnist import load_mnist
ModuleNotFoundError: No module named 'dataset'

こういう、いかにも基本がなってないです系のエラーって。
初心者には厳しいですよね。(注:Python初心者です)

試行錯誤することなく、とりえあえずIssueを確認。

ありました。
https://github.com/oreilly-japan/deep-learning-from-scratch/issues/25

解決していなかった

さらにエラー

1
2
3
4
5
C:\work\python>python c:/work/python/deep-learning-from-scratch-master/ch03/mnist_show.py
Traceback (most recent call last):
File "c:/work/python/deep-learning-from-scratch-master/ch03/mnist_show.py", line 7, in <module>
from PIL import Image
ModuleNotFoundError: No module named 'PIL'

これもIssueにあった。
https://github.com/oreilly-japan/deep-learning-from-scratch/issues/26

インストール

1
2
3
4
5
6
C:\work\python>pip3 install pillow
Collecting pillow
Downloading https://files.pythonhosted.org/packages/6c/60/4c0e6702a39eab8d5d4d210f283907cbe387fcffeb873d8eb8c3757a21a9/Pillow-5.3.0-cp36-cp36m-win32.whl (1.4MB)
100% |████████████████████████████████| 1.4MB 3.3MB/s
Installing collected packages: pillow
Successfully installed pillow-5.3.0

できた

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
C:\work\python>python c:/work/python/deep-learning-from-scratch-master/ch03/mnist_show.py
Downloading train-images-idx3-ubyte.gz ...
Done
Downloading train-labels-idx1-ubyte.gz ...
Done
Downloading t10k-images-idx3-ubyte.gz ...
Done
Downloading t10k-labels-idx1-ubyte.gz ...
Done
Converting train-images-idx3-ubyte.gz to NumPy Array ...
Done
Converting train-labels-idx1-ubyte.gz to NumPy Array ...
Done
Converting t10k-images-idx3-ubyte.gz to NumPy Array ...
Done
Converting t10k-labels-idx1-ubyte.gz to NumPy Array ...
Done
Creating pickle file ...
Done!
5
(784,)
(28, 28)

Issueにあげてくれた方、ありがとうございました。

続きは

読み進められるかは不明

続きをやろうとしたら発見した

フォルダを移動して実行しなきゃいけなかったらしい。
https://github.com/oreilly-japan/deep-learning-from-scratch#%E5%AE%9F%E8%A1%8C%E6%96%B9%E6%B3%95

README.md

1
2
3
4
5
$ cd ch01
$ python man.py

$ cd ../ch05
$ python train_nueralnet.py

ちゃんと移動して実行したら、パスとか直さなくて大丈夫でした。
なーんだ。(ありがち)

AIY Voice Kit V2 OS入れ替えた

あっという間に動かなくなった

ボタンを光らせたいと思ったんです。
それだけなんですが、色々なサイトをみて、色々やっているうちに。

何もできなくなりました。

この記事の方と同じような感じですかね。
Google AIY Voice Kitの再インストール手順

仕方がないので。

再インストールすることに。

上の記事のかたはおそらくV1なので、公式サイトを参考に。
といっても、まあ同じですが。

せっかくなので最新版を

GitHubのリリースページを確認したら、ちょうど、新しいのがリリースされたばかり。ということで2018-11-16版をウキウキDL。

と。こ。ろ。が。

SSH接続できない。
理由は不明。

手元にあるキーボードはUSB接続のもののみ。
ディスプレイも普通のHDMIケーブルしかない。

もういちど

AIY Kits Release 2018-08-03をDLして最初からやりなおし。

といっても。

Cloud側の設定は残っているし、1度通った道。

ということで。

サンプルプログラムを動かすところまではさくさくっと行きました。

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アシスタント(とりあえずこのデモのプログラム)が起動するようにしたいなーと思います。