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のかわいい声では応答してくれないのですが、『声色が変わるだけでユーザーの反応が明らかに変わる』というのはいい発見でした。
提供される便利さは変わらないので技術者としては「ふーん」な感じかもしれませんが、ユーザーとしてはこういう細かい気遣いが大事なのかもしれませんね。
この記事が気に入ったらサポートをしてみませんか?