Google Homeの声がかわいくないのでVoiceTextを使ってかわいくしたよ

背景

Google Homeの声がかわいくありません。
もっと若くてキュートな声で喋って貰えるようにしました。

Voice Text Web API

今回はHOYA製のVoice Text Web APIというのを使ってみます。
SHARPのロボホンにも使われている音声合成エンジンです。

1. 上記URLページからメールアドレスを登録する
2. API KEYがメールで届く

google-home-notifierを編集

こちらのページを参考にして、google-home-notifierを編集します。
/* VoiceText */で囲んでいる二か所が編集した部分です。

var Client = require('castv2-client').Client;
var DefaultMediaReceiver = require('castv2-client').DefaultMediaReceiver;
var mdns = require('mdns');
var browser = mdns.createBrowser(mdns.tcp('googlecast'));
var deviceAddress;
var language;
/* VoiceText */
var VoiceTextWriter = require('./VoiceTextWriter');
var voiceTextWriter = new VoiceTextWriter();
/* VoiceText */

var device = function(name, lang = 'en') {
    device = name;
    language = lang;
    return this;
};

var ip = function(ip, lang = 'en') {
  deviceAddress = ip;
  language = lang;
  return this;
}

var googletts = require('google-tts-api');
var googlettsaccent = 'us';
var accent = function(accent) {
  googlettsaccent = accent;
  return this;
}

var notify = function(message, callback) {
  if (!deviceAddress){
    browser.start();
    browser.on('serviceUp', function(service) {
      console.log('Device "%s" at %s:%d', service.name, service.addresses[0], service.port);
      if (service.name.includes(device.replace(' ', '-'))){
        deviceAddress = service.addresses[0];
        getSpeechUrl(message, deviceAddress, function(res) {
          callback(res);
        });
      }
      browser.stop();
    });
  }else {
    getSpeechUrl(message, deviceAddress, function(res) {
      callback(res);
    });
  }
};

var play = function(mp3_url, callback) {
  if (!deviceAddress){
    browser.start();
    browser.on('serviceUp', function(service) {
      console.log('Device "%s" at %s:%d', service.name, service.addresses[0], service.port);
      if (service.name.includes(device.replace(' ', '-'))){
        deviceAddress = service.addresses[0];
        getPlayUrl(mp3_url, deviceAddress, function(res) {
          callback(res);
        });
      }
      browser.stop();
    });
  }else {
    getPlayUrl(mp3_url, deviceAddress, function(res) {
      callback(res);
    });
  }
};

var getSpeechUrl = function(text, host, callback) {
/* VoiceText */
//  googletts(text, language, 1, 1000, googlettsaccent).then(function (url) {
//    onDeviceUp(host, url, function(res){
//      callback(res)
 //   });
//  }).catch(function (err) {
//    console.error(err.stack);
//  });
	voiceTextWriter.convertToText(text).then(function(result, reject){
        onDeviceUp(host, result, function(res){
            callback(res)
        });
    }).catch(function onRejected(error){
		console.error(error);
	});
/* VoiceText */
};

var getPlayUrl = function(url, host, callback) {
    onDeviceUp(host, url, function(res){
      callback(res)
    });
};

var onDeviceUp = function(host, url, callback) {
  var client = new Client();
  client.connect(host, function() {
    client.launch(DefaultMediaReceiver, function(err, player) {

      var media = {
        contentId: url,
        contentType: 'audio/mp3',
        streamType: 'BUFFERED' // or LIVE
	      };
      player.load(media, { autoplay: true }, function(err, status) {
        client.close();
        callback('Device notified');
      });
    });
  });

  client.on('error', function(err) {
    console.log('Error: %s', err.message);
    client.close();
    callback('error');
  });
};

exports.ip = ip;
exports.device = device;
exports.accent = accent;
exports.notify = notify;
exports.play = play;

もともと利用していたgooglettsの音声エンジンからVoiceTextに変更したと理解しました。
googlettsはGoogle翻訳とかページのテキスト読み上げに使われている音声エンジンらしく、Google Homeのオリジナルのものよりも片言みたいです。

お次はgoogle-home-notifierと同じフォルダ階層にVoiceTextWriter.jsという名前で以下のプログラムを保存します。

var fs = require('fs');
var VoiceText = require('voicetext');
var voice = new VoiceText('{VoiceTextのAPI KEY}');
var OUT_PATH = '{Raspberry Piのウェブサーバーのルートフォルダ}/voice-text.wav'
var OUTPUT_URL = 'http://{Raspberry PiのIPアドレス}/voice-text.wav';

class VoiceTextWriter{

	convertToText(text){
	return new Promise(function(resolve,reject){
	voice
	.speaker(voice.SPEAKER.HIKARI)
	.emotion(voice.EMOTION.HAPPINESS)
	.emotion_level(voice.EMOTION_LEVEL.HIGH)
	.volume(150)
	.speak(text, function(e, buf){
	    if(e){
	      console.error(e);
	      reject(e);
	      
	    }else{
	   	 fs.writeFileSync(OUT_PATH, buf, 'binary');
	  	 resolve(OUTPUT_URL);
	    }
	  });
	});
	}
}
module.exports = VoiceTextWriter;

google-home-notifierを呼び出しているjsファイルを実行します。

$ sudo node example.js

実行後に出される例文に従ってcurlコマンドを実行すると、音声が滑らかにかわいくなっていました!

感想

我が家のGoogle Homeは子供に向かって話してくれることが多いのですが、声が変わってからは子供の反応が明らかに変わりました。
「ねぇ!Google!」とGoogle Homeに話しかける回数が劇的に増えました。
(ねぇGoogleで呼ぶとgoogle-home-notifierじゃないのでかわいくない声になるのですが)

まだGoogle Homeを上手に呼べないし、呼べたとしてもVoiceTextのかわいい声では応答してくれないのですが、『声色が変わるだけでユーザーの反応が明らかに変わる』というのはいい発見でした。
提供される便利さは変わらないので技術者としては「ふーん」な感じかもしれませんが、ユーザーとしてはこういう細かい気遣いが大事なのかもしれませんね。

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