nodistでnpmを最新版にバージョンアップするには

nodistでnpmを最新版にバージョンアップするには

最新版のNode.jsをインストール

nodist latest

現在のnodeのバージョンにあったnpmを使用する

nodist npm match

Google Homeに話をさせる

castv2-clientのインストール

castv2-clientをインストールします。

npm install castv2-client

Windowsの場合は、

npm install castv2-client --no-optional

google-tts-apiのインストール

google-tts-apiをインストールします。

npm install google-tts-api --save

Google Homeに話をさせるプログラム

Google Homeに話をさせるプログラムです。

環境に合わせて、変数ipの値を変更してください。

// Google-HomeのIPアドレス
const ip = '192.168.97.2';

次の変数を変更することで、話す言葉を変更できます。
Google TTS APIの制限により、変数textは最大200文字までです。

// 読み上げる文字列
const text = 'こんにちは';
// 言語
const lang = 'ja-JP';
// 読み上げ速度
const speed = 1;

以下、プログラムです。

const googleTTS = require('google-tts-api');
const Client = require('castv2-client').Client;
const DefaultMediaReceiver = require('castv2-client').DefaultMediaReceiver;

// 読み上げる文字列
const text = 'こんにちは';
// 言語
const lang = 'ja-JP';
// 読み上げ速度
const speed = 1;
// Google-HomeのIPアドレス
const ip = '192.168.97.2';

const get_TTS_URL = (text, lang, speed) => {
    return googleTTS(text, lang, speed).then(function (url) {
        return url;
    }).catch(function (err) {
        console.error(err.stack);
        return '';
    });
};

const say = (host, content) => {
    const client = new Client();
    client.connect(host, function () {
        client.launch(DefaultMediaReceiver, function (err, player) {
            if (err) {
                console.log(err);
                return;
            }

            player.on('status', function (status) {
                console.log(`status broadcast playerState=${status.playerState}`);
            });

            const media = {
                contentId: content,
                contentType: 'audio/mp3',
                streamType: 'BUFFERED'
            };
            player.load(media, { autoplay: true }, function (err, status) {
                client.close();
            });
        });
    });
    client.on('error', function (err) {
        console.log(`Error: ${err.message}`);
        client.close();
    });
};

async function main() {
    const url = await get_TTS_URL(text, lang, speed);
    if (url == '') return;
    say(ip, url);
}

main();

Ubuntuにnode.jsの最新版をインストールするには

node.jsのサイトにインストール方法が書かれています。

Node.js v9 を利用するには

curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash -
sudo apt-get install -y nodejs

Node.js v8 を利用するには

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs

Google Homeの名前とIPアドレスを検出する方法

Google Homeの名前とIPアドレスを検出する方法です。

[Signagify 3] Node.js で Sender アプリ作って mDNS + CastV2 で Chromecast とお話 – Qiita」を参考にしました。

ちなみに、Google HomeアプリでIPアドレスを確認できます。

  1. Google Homeアプリを起動します。
  2. アプリのホーム画面の左上にあるメニューをタップします。
  3. 「デバイス」→「設定」→「情報」にIPアドレスが表示されています。

Google-Homeの検出

multicast-dnsを使ってGoogle-Homeを検出します。

multicast-dnsのインストール

次のコマンドを実行して、multicast-dnsをインストールします。

npm install multicast-dns

Google-Homeの名前とIPアドレスを出力します。

var mdns = require('multicast-dns')();

mdns.on('response', function (response) {
    let name = '';
    let ip = '';
    for (const additional of response.additionals) {
        if (additional.type == 'TXT') name = additional.name;
        if (additional.type == 'A') ip = additional.data;
    }
    if (name != '') console.log(`${name}(${ip})`);
});

mdns.query({
    questions: [{
        name: '_googlecast._tcp.local',
        type: 'PTR'
    }]
});

次のコマンドでプログラムを実行します。

nodejs detect.js

実行すると、次のように出力されます。

Google-Home-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX._googlecast._tcp.local(192.168.XX.X)