Help us understand the problem. What is going on with this article?

GoogleHomeとIFTTTとFirebaseとラズパイとnode.jsでyoutubeの音を流す

More than 1 year has passed since last update.

はじめに

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

もうすこしgoogle-home-notifierで遊んでみたくなったので下記を参考に、IFTTTで試してみたバージョンの作業メモ
Google Home自身でYoutubeの音楽を再生する

環境

ラズパイ

$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

Firebaseの設定

Realtime Databaseの中で+ボタンを押して新しい項目を追加する
googlehomeとその中にword""の項目をつくる
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3137363437392f36633831333539312d363336392d343863642d643765342d3439303633613638313039332e706e67.png

IFTTTの設定

Google Assistant

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

GoogleHomeに「トリガー ○○」というとその言葉をもとにyoutubeから探してくるようにします
書き方は下記のようにトリガー $と書くと任意の文字列が$に入ります
スクリーンショット 2018-10-29 0.10.18.png

webhooksの設定

スクリーンショット 2018-10-29 0.14.21.png
URLにはFirebase Realtime Databaseの中で設定した項目にBodyの中身を送られるように下記のように設定する

https://{Firebaseで設定したプロジェクトID 例:XXXXXXXXXXX-12345}.firebaseio.com/googlehome/word.json

をいれる

Bodyには下記のように入れた

"youtube {{TextField}}"

TextFieldという白い枠がなければ下のAdd ingredientを押して出すことができる

ラズパイ内

Google Home自身でYoutubeの音楽を再生する内の手順通り
youtube-dlを導入する

sudo pip3 install youtube-dl

foreverで永続化させようとした時に何故かconfig/local.jsを読み込んでくれず手こずったので、index.jsファイル内にすべてのconfigで必要な項目を入れれるように参考資料のコードを少し改造しました

'use strict';
const firebase = require("firebase");

const config = {
  apiKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  authDomain: 'xxxxxxxxxxxxxxx.firebaseapp.com',
  databaseURL: 'https://xxxxxxxxxxxxxxxx.firebaseio.com',
  projectId: 'xxxxxxxxxxxxxxxxxxxxx',
  storageBucket: 'xxxxxxxxxxxxx.appspot.com',
  messagingSenderId: 'xxxxxxxxxxx'
};

firebase.initializeApp(config);

const Youtube = require('youtube-node');
const youtube = new Youtube();
youtube.setKey('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');//youtubeのAPIキーを取得しココに入れる

const notifier = require('google-home-notifier');
notifier.ip('xxx.xxx.xxx.xxxxxx');//googlehomeのipアドレスをいれる
notifier.device('xxxxxxxxxx', 'ja');//googlehomeの名前を入れる
notifier.accent('ja');

const  exec = require('child_process').exec;


//database更新時
var db = firebase.database();
db.ref("/googlehome").on("value", function(changedSnapshot) {
  //値取得
  var value = changedSnapshot.child("word").val();
  console.log('valueチェック: %s', value);
  if (value) {

//コマンド生成
    getJsonData(value.split(" ")[0], {
      // youtube
      "youtube": function() {
        let keyword = value.split(" ");
        keyword.shift();
        keyword = keyword.join(' ');
        console.log('keywordチェック: %s', keyword);
        play_youtube(keyword);
      }
    })();

    //firebase clear
    db.ref("/googlehome").set({"word": ""});

  }
});

//jsonからvalueに一致する値取得
function getJsonData(value, json) {
  for (var word in json){
     if (value == word){
         console.log('json[word]チェック: %s', json[word]);
     }
     console.log('json["default"]チェック: %s', json["default"]);
  }
  return json["default"]
}


function play_youtube(keyword) {
  // categoryIdの10はMusic https://stackoverflow.com/questions/17698040/youtube-api-v3-where-can-i-find-a-list-of-each-videocategoryid
  youtube.search(keyword, 1, {'type':'video', 'videoCategoryId':10}  , function(error, result) {
    if (error) {
      console.log(error);
      return ;
    }
    console.log(JSON.stringify(result, null, 2));
    for (const item of result.items) {
      if (item.id.videoId) {
        console.log(item.id.videoId);

            exec('youtube-dl -g -x https://www.youtube.com/watch?v='+item.id.videoId, function(error, stdout, stderr) {
              if (error !== null) {
                console.log('exec error: '+error);
              }
              const soundUrl = stdout;
              console.log(soundUrl);

              notifier.play(soundUrl, function(res) {
                console.log(res);
              });
            });

      }
    }
  });
}

node.jsをラズパイ内で永続化

こちらを参考にしました
[Node.js] Foreverコマンドでスクリプトをバックグラウンドで動かす

vim /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

# googlehomeがyoutubeで音楽を検索するアプリ
sudo -u {{ユーザー名}} /usr/local/bin/node /usr/local/bin/forever start -p /var/run/forever --pidfile /var/run/node-app.pid -l /home/{{ユーザー名}}/Repository/google-home-play-youtube/google-home-notifier/out.log -a -d /home/{{ユーザー名}}/Repository/google-home-play-youtube/google-home-notifier/index.js

exit 0

ラズパイをリブートしてきちんと永続化されているか確認する

$ sudo reboot

再起動後
$ forever list

info:    Forever processes running
data:        uid  command             script                                                                                  forever pid  id logfile                                                                         uptime
~~~~~~省略~~~~~~~
data:    [3] Vf2l /usr/local/bin/node /home/{{ユーザー名}}/Repository/google-home-play-youtube/google-home-notifier/index.js        948     1020    /home/{{ユーザー名}}/Repository/google-home-play-youtube/google-home-notifier/out.log 0:10:32:6.993

参考資料

Google Home自身でYoutubeの音楽を再生する
[Node.js] Foreverコマンドでスクリプトをバックグラウンドで動かす
先人の皆様に感謝を込めて・・・とても助かりました :pray:

結局foreverで他のファイルを読み取れない原因がよくわからなかった・・・・

nakagawa1017
iOSエンジニアしてます 好きなもの Adobe.Ai.AE.Ps/Sketch/Blender/デジタルファブリケーション
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした