IToTの覚え書き

マイクロビット、アルドゥイーノ、ラズベリーパイなどで楽しい道具を作る趣味のサイトです。 基本的に自分用の覚え書きです。

カテゴリ: グーグルホーム

IFTTT有料化対処法をもうひとつ考えました。おもにgoogle home miniに音楽や語学のCDトラックをmp3化した物を口頭でかけてもらうためのものです。

「OKグーグルCD中国語14」というと「CD中国語のトラック14をかけます ポロン」と言ってサーバの中国語フォルダの014.mp3をかけてくれます。
「OKグーグルCD竹内まりや1」というと「CD竹内まりやのトラック1をかけます ポロン」と言ってサーバの竹内まりやフォルダの001.mp3をかけてくれます。

1.グーグルスプレッドシートを新規に作ります。
シート:
A1セル:空白
A2セル:=SUBSTITUTE(SUBSTITUTE(A1," ","")," ","")
A3セル:空白
A4セル:=Right("00"&A3,3)
A5セル:="http://211.132.114.***:50011/?mp3=http://192.168.1.2/"&A2&"/"&A4&".mp3"
// 211.132.114.***:50011はgoogle home notifierのグローバルIPアドレス
// 192.168.1.2は音声フォルダを入れたweb serverのローカルIPアドレス

マクロ:
function doPost(e) {
var jsonString = e.postData.getDataAsString();//IFTTTからJSON形式で変数を受け取る
var data = JSON.parse(jsonString);//配列に分解
var NumberField = data.NumberField;//数字#を変数NumberFieldに
var TextField = data.TextField;//文字列$を変数TextFieldに
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getActiveSheet();
sheet.getRange("A1").setValue(TextField);//A1セルに変数TextFieldを
sheet.getRange("A3").setValue(NumberField);//A3セルに変数NumberFieldを
var url = sheet.getRange("A5").getValue();//A5セルの計算されたurlを変数urlに
UrlFetchApp.fetch(url);//urlを開く
}

これを「公開」…「web applicationとして導入」します。
このマクロを実行するurlアドレスが
https://script.google.com/macros/s/AKfycbxy6d8ii9MluRbNTmXRWpwLDTIG-anTE0CK***/exec
などと表示されますので、コピーしておきます。

2.IFTTTを新規に作ります。
IF(トリガー):google assistant
Say a phrase with both a number and a text ingredient
What do you want to say?:「CD $ # 」
What do you want the Assistant to say in response?:「CD $ トラック # をかけます」
Language:Japanese

THEN(アクション):web hooks
URL:先ほどコピーしたアドレス
Method:POST
Content Type:application/JSON
Body:{"NumberField": "{{NumberField}}", "TextField": " {{TextField}}" }

コンテンツを増やしたいときもサーバにフォルダを作ってmp3ファイルを入れるだけです。
IFTTTもグーグルスプレッドシートもスクリプト(GAS)も一度作れば何もいじらなくて大丈夫です。
これで先の方法とあわせてIFTTT2つで無料で十分やっていけそうです。


2020年末にIFTTTが有料化して毎月4ドル支払わないと3個までしかアプリが使えなくなりました。
今まで30個くらい作っていたので困りました。毎月4ドルでもちりも積もれば山です。

しかしこれはIFTTTの番号#と文字$を両方使うことで対応できました。
「OK グーグル ナンバー # $」です。
たとえばナンバー99はgoogle spleadsheetのシート名99に相当します。
料理のレシピですので覚えやすく99(クック)にしました。

これで、たとえば「OK グーグル No.99 肉じゃが」といえばシート名99「料理レシピ」が開き、C1セルに「肉じゃが」と入ります。C2~C5までに表から肉じゃがのレシピを検索し、計算式で加工して最終的にC6にnotifier boardに送るurlを作ります。すると「肉じゃがのレシピは卵1、水1/2、小麦粉60g、片栗粉30gです」とgoogle home miniが喋ってくれます。

ほかに分別ごみをシート名53に作って「OK グーグル No.53 明日」といえばC1セルの「明日」という文字から表計算の式が計算してC4セルに「燃えないごみ」、C5セルに「明日は燃えないごみの日です」を算出し、それからC6セルにurlを作ります。セルの各式はExcelに似ていて簡単に作れます。
これでIFTTT1個のアプリでgoogle spleadsheetが許す100シート分まで使え、3個なら300シートまで無料で使えます。

悪いことばかりでなくいいこともありました。今までGASでUrlFetchApp.fetch(url)するときにurlは日本語はダメでurlコードに変換する必要がありました。そこで今まではecl.jsをgoogle spredsheet内でライブラリ化して
var url = ecl.EscapeSJIS(value);
としていましたが、google spleadsheetは賢くなって日本語のままでfetchできるようになりました。

参考までに私の作ったGAS(GoogleAppsScript←googleの作ったJavaScriptみたいなやつ)はこれ1個だけです。
これでIFTTTからJSONで送られてきた番号#と文字$からシートを移動し、表のデータを検索し結果を、家のD1 miniカードのesp8266-google-home-notifier経由で、google home miniに喋らせることができます。
function doPost(e) {
var jsonString = e.postData.getDataAsString();//JSONでないと文字化けする
var data = JSON.parse(jsonString);
var value1 = data.value1; //NumberField(#)の中身
var value2 = data.value2; //TextField($)の中身
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName(value1);
sheet.getRange("C1").setValue(value2);//IFTTからの文字をC1に入れて検索
url = sheet.getRange("C6").getValue();//C6までにurlを作る
UrlFetchApp.fetch(url); //notifierにデータを送る
}


これと補完する数字#と文字列$を入れ替えたようなもう一つの方法もあります。

2021年になって、久しぶりにアイデアが湧いてさわってみたら、esp8266-google-home-notifierが喋らなくなっていました。

アイデアとは台所で立ったまま料理名をいえば、自分の料理レシピをgoogle home mini が言ってくれるというもの。例えば「OKグーグル 私のレシピ 野菜炒め」というと、「野菜炒めのレシピは水大2、酒大1、塩こしょう、醤油、オイスターソース、片栗粉各小1です」と言ってくれるもの。

esp8266-google-home-notifier作者のhorihiro(Hirofumi Horikawa)さんの情報を調べてみたら、google側の小変更があったが、esp8266-google-ttsバージョンアップで対応済みとのこと。
(horihiroさんありがとう!あなたはいい人です)
さっそくesp8266-google-ttsのバージョンアップをしましたが喋りませんでした。そこで、
Windows Xp → Windows 7
Arduino IDE 1.6.5 → 1.8.13
Board Maneger で、esp8266 Board 2.4.1 → 2.7.4
Library Maneger で、esp8266-google-home-notifier 1.0.7 → 1.0.7
Library Maneger で、esp8266-google-tts 1.0.7 → 1.1.0

と全て最新にバージョンアップしました。それでも喋りませんでした。

horihiroさんの所は喋るのに私の所が喋らないのはソフトのせいじゃないはず。ハードかな?試しにボードを今まで使っていたもの(Wemos D1ミニ開発ボード ESP8285)から、別なもの(D1 Mini ESP8266)に変えてみたら、喋りました。何かの仕様が変わってESP8285ははずされたんですね。

なんとか無事に2021/03/03にesp8266-google-home-notifierが復活しました。

ところがもう一つ問題が起きました。IFTTTが有料化したのです。→IFTTT有料化対処法


『アナウンサーが読む聞く教科書 山川詳説日本史』という本があります。
ベッドに横になりながらこの本を開いて好きなところをグーグルホームに読ませましょう。
(ローカル)パソコンを起動する必要はありません。



グーグルスプレッドシートのグーグルアップススクリプトにはjavascriptの知識が必要ですし、ファイルメーカーのウェブコンパニオンにはCDMLの知識が必要です。
でもよく考えたら、グーグルアップススクリプトはイフトがurlを扱うときに日本語が文字化けすることの対策でしたし、ウェブコンパニオンはローカルパソコンにHTMLテキストが音声と同時に自動的に立ち上げるためのものでした。
ただmp3音声を再生するだけならグーグルスプレッドシートもファイルメーカーも使わずにイフトだけでできると気がつきました。本を追加するたびにイフトを作らなければいけませんが、これならすごく簡単にだれでもすぐできます。

「OKグーグル 詳説日本史 128」と言えば、http://192.168.11.2/nihonshi/128.mp3ファイルが再生されるようにします。

イフトのトリガーはもちろんグーグルアシスタント、アクションはウェブフックです。
If You say "詳説日本史 #", then Make a web request
そのurlは、
http://t****.xyz:50024/?mp3=http://192.168.11.2/nihonshi/{{NumberField}}.mp3
(※http://t****.xyz:50024はグーグルホームノティファイヤー入りD1カードのurlです)

もしurlに日本語が入る場合は、注意が必要です。
こちらからURLエンコードしてください。
たとえば
http://t****.xyz:50024/?mp3=http://192.168.11.2/山川詳説日本史/{{NumberField}}.mp3
としたいのなら、
http://t****.xyz:50024/?mp3=http://192.168.11.2/%E5%B1%B1%E5%B7%9D%E8%A9%B3%E8%AA%AC%E6%97%A5%E6%9C%AC%E5%8F%B2/{{NumberField}}.mp3
とします。
この方法はグーグルスプレッドシートとファイルメーカーを経由する方法と比べて反応が早く、直ちに読み始めますので気に入りました。

<材料>
アナウンサーが読む聞く教科書山川詳説日本史 1ヶ
グーグルホーム 1ヶ
グーグルホームノティファイヤー入りD1カード 1ヶ
イフト (本の冊数)×1ヶ

グーグルホームミニに「OKグーグル 本を読んで リンガフォン中国語」というと画面を開いて、読んでくれます。

画面はマウスでも操作でき、本文と日本語訳が連動します。

「OKグーグル 本を読んで リンガフォン中国語27」なら第27課を読んでくれます。数字を付けなければランダムで読みます。「OKグーグル 本を読んで リンガフォン中国語続き」といえば次の課を読んでくれます。中止したいときは「OKグーグル 本を読んで 中止」です。

↑このページのトップヘ