なんで作ったの?
英語(やその他の外国語)の単語や文章を覚えたい。ちゃんとスペルミスなく書き取れるか確かめたいから、誰か読んでー。
誰か身近にいてくれればいいのだが、いても発音がちょっとなあ、とか、中国語、ハングル、ロシア語などは、そもそも読める人が周りにいなかったりする。
そこで、Google Homeに読んでもらおうと思った。いろんな言語に対応しているようだし、少なくとも主要な言語はカバーされているはずだ(Google Translateで試してみればわかる)。
文や単語の入力は、毎回打ち込むとしたら、それはGoogle Translateのページを使うのとなんらかわらない。それに答えを見ながら書き取りをするようなもので意味がない。そこで、
Google Sheetsに入力フォーマットを作って、決まったセルに読んでほしい文や単語と言語を打ち込んでおき(あるいは誰かに打ち込んでもらい)、これをアプリが読みに行ってGoogle Homeに発声させる。
ができればカッコいい。それに以下のような会話をする必要がなくなるのである。
子供1:ママ読んでー。
ママ(読んであげる)
子供1:は?そんなのあったっけ?発音が変。だめじゃん。
パパ:なんだその態度は。んなら自分で録音してそれを聞け。
子供1:読んでー。
ママやパパ:ごめん、今手が離せない、後にして。
子供1:せっかくやる気になったのに。明日テストなのに。
たいていママ:だから昨日やっといたら、って言ったじゃない。
パパ:いらない紙の裏に100回書け。そのほうがはやい。
なにをするもの?
Google Sheetsに作ったフォーマットに、覚えたい文や単語と言語を入力しておきます。例えば下のように。
カラムCに文や単語、なんでもいいので読んでほしいものを記入し、カラムBに言語の指定をします。カラムDはメモです。
Read For Me!というGUIアプリを作ったので、これを開いて、
- Google sheetsのファイル名(あらかじめ登録してあるもの)を選びます。
- Load gssを押すと、ワークシート(Work Sheet、複数ある)名が読み込まれ、数が表示されます。
- Work Sheet名を選び、
- Parse sheetボタンで入力した文を読み込みます。
- 文の番号を選び、
- Read for me!ボタンを押すとGoogle Homeから文の読み上げが聞こえます。
- Show Sentenceにチェックを入れると、
- 今の文を文字で見ることができます。
どういう仕組み?
Read For Me appがGoogle driveにあるGoogle sheetを読みに行き、指定されたファイルの指定されたワークシートにある文を取得します。この部分にはGoogle Drive APIと、それを扱うpython library, gspreadとoauth2clientを使っています。
さて、appで選ばれた文は、jsonという形式に箱詰めしてRaspberry pi(一号機)で動いているNode-REDのflowに配達されます。flowはごくごくシンプルで、
こんな感じです。自分でこれを作ってみてから、Node-RED経由しないで、直接Google Homeに送れないの?という疑問を持ちましたが、どうなんでしょう。今すぐわかりません。すみません。
これ読んで、を送られたGoogle HomeはGoogleのサーバーにその文を送って音声ファイルを受け取り、それを再生するのですが、その部分は図には入れませんでした。
つかっている技(わざ)
興味のある方は、ここに出てくる文や単語をGoogle検索してさらに調べてみてください。
- wxpythonでGUIアプリケーションを作る
- pythonからGoogle Sheetsの読み書きをする
- Node-REDでフローを作る(POSTを受けてGoogle Homeにメッセージを伝える)
- python programをAuto-py-to-exeでexe化する
作り方
アプリはwxpythonを使ってGUIの構築をしています。作り方を説明するとなると、それはwxpythonの説明になってしまいますので、今回はスキップします。
pythonからGoogle Sheetsを扱う方法は、参考ページを下に挙げておきます。
- https://qiita.com/AAkira/items/22719cbbd41b26dbd0d1
- https://towardsdatascience.com/accessing-google-spreadsheet-data-using-python-90a5bc214fd2
code
今回は省略。ごめんなさい。
使ってみて
Google Sheetsは家族で共有できるように設定したので、誰もが自分のワークシートを作って自由に使えるようになっている。どうでもいい文を入れておかしなことを言わせてみるもよし、真面目に勉強用に使うもよし。
いろいろ遊べます。
このあとの予定
いまのところイギリス英語になっている。Google AssistantのvoiceはGoogle Home Appから設定してあり、家族のだれが話しかけるのかによって、違う声が答えてくれる。しかし、今回のようにprogramからアクセスした場合、いつも同じ声のイギリス英語しか聞こえてこない。これを変える方法を見つけてさらにカスタマイズしたい。
Pythonで作ったプログラムをほかの人に配布する場合、これまでcx_freezeやpyinstallerを使ってきたが、今回auto-py-to-exeというものを見つけて使ってみた。Read For Me!自体それほど複雑でないこともあってか、一発でうまくいった。普通ならコマンドオプションや、spec(config) fileを書いて設定するところがすべてGUIでセットできてわかりやすい。しかも出来上がってくるoutput (pyinstallerでいうところのdist) が小さい。これはすごくいいことだ。Scikit-learnやmatplotlibなどを使ったものでもhookがうまくいくか試したい。
うらばなし
2018年の7月に最初のバージョンをMacOS上で作った。その後なぜだかすっかりこのアプリと仕組みの存在を忘れており、つい先日、子供の宿題のdictationを手伝って思い出した。コードを引っ張りだして走らせてみたら、いくつかmoduleが見つからない、というエラー。思い出せない。何をどうインストールした?しかもWindowsで走らせるとレイアウトが崩れる。コードを見直してレイアウトや使い勝手を修正し、google-home-notifierというものを使っていたところをNode-REDでのflowに置き換えた。あれからずいぶんコードを書いたからか、GUI構築や、関数の割り振りの段取りの悪さなど、いたるところが気に入らない。自分で書いたのに。でも、コーディングはいつでもこんな調子です。極端な場合、数日後には自分でもわからなくなるようなコードが書けてしまう。逆もあって、ずいぶん前に自分で書いたコードをみて、すげえ。なんでこんなことができた?と感心することもある。まだまだ修行の道は長い。