6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GoogleHomeとIFTTTとFirebaseとラズパイで指定した数に対応した音を流す(英単語読み上げツールの作成)

Posted at

はじめに

英単語を学習する時に、いちいちPCを立ち上げて音をきいたり、スマホを立ち上げて音を聞くのがめんどくさい
特定のページを指定したら、それに対応した音が流れるといいなと思い作った

環境

ラズパイ

$lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 9.4 (n/a)
Release:	9.4
Codename:	n/a

$npm -v
5.6.0

$node -v
v9.4.0

シチュエーション

「ねえ Google 単語帳5」と発話
GoogleHomeからは単語帳5ページに対応した音源がながれる

仕組み

GoogleHomeから発話された内容をIFTTTのからGoogle Assistantでうけとりwebhooksで指定したFirebase RealtimeDatabeseに内容を記録する
ラズパイ上のnode.jsでFirebase RealtimeDatabeseが更新されたら、更新された内容を受け取りgoogle-home-notifierでgoogleHomeに流してもらいたい音声のurlを渡すようにする。
流してもらう音声に関してはラズパイ上にwebサーバー(Appach)を立てて、そこに対応する音声データをおいておく

Firebaseの設定

Firebaseで新しいプロジェクトを作成する
一番左のメニューの一番上Project OverViewの歯車マークを押しプロジェクトの設定を選択
開いたページの右下にあるウェブアプリに Firebase を追加をクリックすると必要な設定を見ることができる
スクリーンショット 2018-10-24 22.17.26.png

スクリーンショット 2018-10-24 22.17.37.png

次に一番左のメニューの中からDatabaseを選択しRealtimeDatabeseを選択し下記のような画面に遷移する
プロジェクトIDの横のプラスボタンを選択しurl""の項目をつくる

スクリーンショット 2018-10-24 22.25.09.png

IFTTTの設定

Google Assistantの設定

GoogleHomeと連携したGoogleアカウントでIFTTTにログインをする
Google Assistantを選択し、そのなかのSay a phrse with a numberを選ぶ
この項目は発話した数字を取得し、その数字をトリガーとして使うことができる

スクリーンショット 2018-10-23 22.25.31.png

この項目での具体的な設定は下記のように
What do you want to sayの項目に単語帳 # と入力する.
#に発話した数字が入ってくる

スクリーンショット 2018-10-23 22.26.48.png

GoogleHomeからの返答も書いておく #を入れておくとユーザー側が発話した数字がここに入るようになる

LanguageをJapaneseに選択するのを忘れないようにしてください

スクリーンショット 2018-10-23 22.27.00.png

webhooksの設定

URLには

https://{Firebaseで設定したプロジェクトID 例:XXXXXXXXXXX-12345}.firebaseio.com/url.json
をいれる

Bodyには

"http://{ラズパイのIPアドレス例:192.xxx.xxx.xxx}/English/{{NumberField}}.mp3"

FirebaseのRealTimeDatabeseに送信する内容を入れる
以前の項目で#に入る数字の内容をNumberFieldでとりだすことができる
NumberFieldという項目がなければ下のAdd ingredietボタンを押すとでてくる
スクリーンショット 2018-10-23 22.27.39.png

ラズパイ上にwebサーバーをたてる(apache)

こちらを参照しました
Google HomeにRaspberry Pi上の音楽ファイルを再生してもらうよ

上記に書かれているのを引用しますが、下記三行をラズパイ上で実行します

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install apache2

ラズパイ上で/var/www/htmlの階層に移動してEnglishフォルダを作り音声ファイル1.mp3を入れてmacから下記URLにアクセスし再生を確認します

http://{ラズパイのIPアドレス例:192.xxx.xxx.xxx}/English/1.mp3

ラズパイ上でnode.jsの準備

google-home-notifier

こちらを参照して準備を整えました
GoogleHomeスピーカーに外部からプッシュして自発的に話してもらいます
Google Homeで好きなポッドキャストをスマートに再生する

まずgoogle-home-notifierをcloneする

$git clone https://github.com/noelportugal/google-home-notifier
$cd google-home-notifier/
$ls
LICENSE  README.md  example.js  google-home-notifier.js  package.json

必要なパッケージを入れる

feedparserfirebasegoogle-home-notifierrequestをいれます

package.jsonを更新します

$vi package.json

package.jsonの中身

{
  "name": "google-home-notifier",
  "version": "1.2.0",
  "description": "",
  "main": "google-home-notifier.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Noel Portugal",
  "keywords": [
    "google home",
    "notifications",
    "notifier"
  ],
  "license": "MIT",
  "dependencies": {
    "body-parser": "^1.15.2",
    "castv2-client": "^1.1.2",
    "express": "^4.14.0",
    "google-tts-api": "0.0.2",
    "mdns": "^2.3.3",
    "ngrok": "^2.2.4",
    "feedparser": "^2.2.9",
    "firebase": "^5.5.1",
    "google-home-notifier": "^1.2.0",
    "request": "^2.88.0"
  }
}

ライブラリを導入

$npm install

新しいファイルを作る

$vi play-English.js

play-English.jsの内容

var FeedParser = require('feedparser');
var firebase = require('firebase');
var googleHome = require('google-home-notifier');
var request = require('request');

const lang = 'ja';
const ip = '192.xxx.xxx.xxx'; //再生したいGoogle HomeのIPアドレス

googleHome.ip(ip, lang);

//Firebaseでプロジェクトを造ったときに確認した内容
const config = {
  apiKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  authDomain: 'xxxxxxxxxxx-xxxxx.firebaseapp.com',
  databaseURL: 'https://xxxxxxxxxxx-xxxxx.firebaseio.com',
  projectId: 'xxxxxxxxxxx-xxxxx',
  storageBucket: 'xxxxxxxxxxx-xxxxx.appspot.com',
  messagingSenderId: 'xxxxxxxxxxx'
};
firebase.initializeApp(config);

var db = firebase.database();
var ref = db.ref('/');

//RealTimeDatabeseが更新されるとこの関数の中に入ってくる
ref.on('child_changed', function(snapshot) {
  var url = snapshot.val()
  if (url) {
    googleHome.play(url, (notifyRes) => {
      console.log(notifyRes);
    })
  }
  ref.update({'url': ''}); // 変更をリセット
});

実行してみる

$node play-English.js

永続化

foreverを利用しました

foreverコマンドでNodeJSアプリを起動したままにする

完成!!
発話すると単語を読み上げてくれて便利

参考資料

Google HomeにRaspberry Pi上の音楽ファイルを再生してもらうよ
GoogleHomeスピーカーに外部からプッシュして自発的に話してもらいます
Google Homeで好きなポッドキャストをスマートに再生する

先人の皆様に感謝を込めて :pray:

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?