コンテンツへスキップ

NVIDIA JetsonでGoogle Home Notifierの音声変更(Voice Text Web APIへ)

NVIDIA Jetson NanoへのGoogle Home Notifier導入は、  こちら

google-tts-apiからHOYA社のVoice Text Web APIへ

Google Home Notifierは、テキストをgoogle-tts-apiを用いて、音声変換を実施しております。十分に内容は把握できますし、実利用には支障はないのですが、HOYA社より優れたWeb APIが公開されているので、HOYA社のVoice Text Web APIを用いた音声に変更を実施します。HOYA株式会社 VoiceText Web API

  1. HOYA社Voice Text Web APIの利用登録
  2. 「voicetext」のインストール
  3. google-home-notifierソースコード修正

前提条件

導入手順

1.HOYA社Voice Text Web APIの利用登録

HOYA株式会社 VoiceText Web APIの「無料利用登録」より利用登録を実施して下さい。利用登録後に、API KEYがメールで送付されて来ます。

2.「voicetext」のインストール

以下のコマンドで、「voicetext」をインストールします。

root@jetson:~# cd google-home-notifier/
root@jetson:~/google-home-notifier# npm update
root@jetson:~/google-home-notifier# npm install voicetext
npm WARN deprecated superagent@0.18.2: Please note that v5.0.1+ of superagent removes User-Agent header by default, therefore you may need to add it yourself (e.g. GitHub blocks requests without a User-Agent header).  This notice will go away with v5.0.2+ once it is released.
google-home-notifier@1.2.0 /root/google-home-notifier
└── voicetext@0.0.7  extraneous

npm WARN google-home-notifier@1.2.0 No repository field.
root@jetson:~/google-home-notifier# npm install -g npm
/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
/usr/local/bin/npx -> /usr/local/lib/node_modules/npm/bin/npx-cli.js
/usr/local/lib
├── ansi-regex@2.1.1
├── aproba@2.0.0
├── aws4@1.8.0
├── bin-links@1.1.3
├── bluebird@3.5.5
├── byte-size@5.0.1
├── cacache@12.0.3
├── call-limit@1.1.1
├── chownr@1.1.2

3.google-home-notifierソースコード修正

「google-home-notifier.js」ファイルの修正

以下を参考に2箇所追加および1箇所コメントアウト(削除)を実施します。

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;

//Add (((((((((((
var VoiceTextWriter = require('./VoiceTextWriter');
var voiceTextWriter = new VoiceTextWriter();
//Add ))))))))))

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) {
//Delete ((((((((((
//  googletts(text, language, 1, 1000, googlettsaccent).then(function (url) {
//    onDeviceUp(host, url, function(res){
//      callback(res)
//    });
//  }).catch(function (err) {
//    console.error(err.stack);
//  });
//Delete )))))))))
//Add (((((((((
	voiceTextWriter.convertToText(text).then(function(result, reject){
        onDeviceUp(host, result, function(res){
            callback(res)
        });
    }).catch(function onRejected(error){
		console.error(error);
	});
//Add )))))))))
};

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;

「VoiceTextWriter.js」ファイルの新規作成

  • 「@APIKEY@」を利用登録時に受信したAPIKEYに変更
  • 「@WEBPAHT@」にWEBサーバの公開フォルダに格納する音声ファイルを指定
    例:/var/www/html/voice-text.wav
  • 「@URL@」にWEBサーバの音声ファイルへアクセスする際のURLを指定
    例:http://192.168.0.200/voice-text.wav
var fs = require('fs');
var VoiceText = require('voicetext');
var voice = new VoiceText('@APIKEY@');
var OUT_PATH = '@WEBPAHT@';
var OUTPUT_URL = '@URL@';

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)
	.emotion_level(2)
        .speed(100)
	.volume(120)
	.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;

VoiceText Web APIマニュアルを参考に、speedやvolumeなどのオプション指定を変更して、好みの音声に変更して下さい。設定ファイル変更時には、Google Home Notifierの再起動が必要となります。

created by Rinker
NVIDIA
¥19,000 (2021/08/19 16:46:56時点 Amazon調べ-詳細)
created by Rinker
¥11,550 (2024/03/29 05:08:48時点 楽天市場調べ-詳細)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA