見出し画像

Google Homeにいろんな言葉を話させてみた。

Google Home miniを手に入れたのだけど
面白い事させようかなと思って、いろいろな国の言葉でおしゃべりさせることにした。
簡単そうに聞こえるけど、事前準備が必要。
もちろんRaspberry Piがあることが前提なのだ。

必要なモノ
・Raspberry Pi
・Network環境
・Google Home
必要なソフト
・"Google-home-notifier"
・"Node.js"

今回はこれに加えAmazon Echo dotを使ってます。

Raspberry PiはGoogle Homeと同じネットワークに存在することが必要(グローバルアドレス貰って外からアクセスすることも可能ですが)

Raspberry piにGoogle-home-notifierやNode.jsを導入
ネット上にいろいろ出てますのでそれを参考にしてください。
そんなに難しくないはずです。

言語を切り替えられるようにする仕掛けを作る
.~/google-home-notifier/gooogle-home-notifier.js
をカスタマイズすることで対応します。
抜粋)
var language; //追加
var device = function(name, lang) { // lang = 'en'を変更
device = name;
language = lang;
return this;
};
var ip = function(ip, lang ) { //lang = 'en'を変更
deviceAddress = ip;
language = lang;
return this;
}

var googletts = require('google-tts-api');
var googlettsaccent;  //追加
var accent = function(accent){
googlettsaccent = accent;
return this;

呼び出し側のJsファイルを作る
今回はそばにあるAmazon dot echo君に曲をかけてもらってからセリフをしゃべるようにしてみました。
テキスト(本文)とロケールIDとしゃべらせるまでの待ち時間(ms)を設定することで。いろいろな国の言葉で話してくれます。
1回の命令で話せる語長が限られているので、苦肉の策もあります。

Alexaにミッションインポッシブルのテーマをかけさせつつ、IMからの指令をGoogle Homeが語るというデモンストレーション
IMからの指令はMission Impossible (1966) s02e04 Episode Script The Bankより抜粋しました。
最初の呼びかけのフェルプス君の部分はUS Englishその後の指令の内容はUK Englishになっています。
ご承知の通り、非同期でJavascriptは実行されますので、時間と順序の調整が面倒で、かなりの時間がこちらの調整作業にとられました。


Source codeです
const googlehome = require('./google-home-notifier');
function Talking(text, lang, delay){
const p = new Promise((resolve, reject)=>{
setTimeout(() => {
googlehome.device("Google-Home", lang);  //google homeのデバイス名指定
googlehome.ip("192.168.nnn.nnn", lang);  // Google homeのIPアドレス
googlehome.notify(text, function(res){
console.log(res);
});
resolve();
},delay)
});
return p;
}

Talking("alexa? ミッションインポッシブルのテーマをかけて?", 'ja', 0)
.then(() => Talking("Good morning, Mr.Phelps.", 'en', 20000))
.then(() => Talking("The man you're looking at is Alfred Blezig, director of the Socialist People's Bank in the East Zone, but secretly a fanatic who has never given up working for a supreme fascist state.", 'en-gb', 6500))
.then(() => Talking("The mission, should you decide to accept it, is to stop Belzig and prevent the over $3 million which he has appropriated from falling into the hands of his new Nazi Party.", 'en-gb', 16500))
.then(() => Talking("As always, should you or any of your IM Force be caught or killed, the secretary will disavow any knowledge of your actions.", 'en-gb', 16000))
.then(() => Talking("This record will self-destruct when it reaches the final groove.Good luck, Jim.", 'en-gb', 12000));


この記事が気に入ったらサポートをしてみませんか?