コンテンツへスキップ

2020年01月31日  めざましじゃんけん 結果

フジテレビ めざましテレビ めざましじゃんけん の結果を保証したり、全ての結果が記載を保証するものではありません。

2020年01月31日のめざましじゃんけんの結果をベストエフォートで公開します。


じゃんけん結果システムイメージ

Goo(グー) Choki(チョキ) Pa(パー)

めざましテレビ|めざましじゃんけんーフジテレビ

めざましじゃんけん結果
回次結果対戦相手
1月31日
(金曜日)
【4戦目】07時58分#斎藤工 さん
【3戦目】07時35分#綾野剛 さん #松田龍平 さん
【2戦目】06時58分#黒瀬翔生 アナウンサー #久慈暁子 アナウンサー
【1戦目】05時58分まちかどじゃんけん

2020年01月30日  めざましじゃんけん 結果

フジテレビ めざましテレビ めざましじゃんけん の結果を保証したり、全ての結果が記載を保証するものではありません。

2020年01月30日のめざましじゃんけんの結果をベストエフォートで公開します。


じゃんけん結果システムイメージ

Goo(グー) Choki(チョキ) Pa(パー)

めざましテレビ|めざましじゃんけんーフジテレビ

めざましじゃんけん結果
回次結果対戦相手
1月30日
(木曜日)
【4戦目】07時58分山﨑賢人さん
【3戦目】07時35分松下奈緒さん
【2戦目】06時58分黒田光輝さん、檜山光成さん
【1戦目】05時58分まちかどじゃんけん

2020年01月29日  めざましじゃんけん 結果

フジテレビ めざましテレビ めざましじゃんけん の結果を保証したり、全ての結果が記載を保証するものではありません。

2020年01月29日のめざましじゃんけんの結果をベストエフォートで公開します。


じゃんけん結果システムイメージ

Goo(グー) Choki(チョキ) Pa(パー)

めざましテレビ|めざましじゃんけんーフジテレビ

めざましじゃんけん結果
回次結果対戦相手
1月29日
(水曜日)
【4戦目】07時58分未定
【3戦目】07時35分未定
【2戦目】06時58分未定
【1戦目】05時58分まちかどじゃんけん

2020年01月28日  めざましじゃんけん 結果

フジテレビ めざましテレビ めざましじゃんけん の結果を保証したり、全ての結果が記載を保証するものではありません。

2020年01月28日のめざましじゃんけんの結果をベストエフォートで公開します。


じゃんけん結果システムイメージ

Goo(グー) Choki(チョキ) Pa(パー)

めざましテレビ|めざましじゃんけんーフジテレビ

めざましじゃんけん結果
回次結果対戦相手
1月28日
(火曜日)
【4戦目】07時58分生じゃんけん!#ミルクボーイ
【3戦目】07時35分#梅澤美波 さん #遠藤さくら さん #賀喜遥香 さん #久保史緒里 さん #齋藤飛鳥 さん
【2戦目】06時58分#仲里依紗 さん
【1戦目】05時58分まちかどじゃんけん

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調べ-詳細)

2020年01月27日  めざましじゃんけん 結果

フジテレビ めざましテレビ めざましじゃんけん の結果を保証したり、全ての結果が記載を保証するものではありません。

2020年01月27日のめざましじゃんけんの結果をベストエフォートで公開します。


じゃんけん結果システムイメージ

Goo(グー) Choki(チョキ) Pa(パー)

めざましテレビ|めざましじゃんけんーフジテレビ

めざましじゃんけん結果
回次結果対戦相手
1月27日
(月曜日)
【4戦目】07時58分#酒主義久 アナウンサー #生田竜聖 アナウンサー
【3戦目】07時35分#今田美桜 さん
【2戦目】06時58分#上杉柊平 さん
【1戦目】05時58分まちかどじゃんけん

NVIDIA Jetson Nano の動作温度

Raspberry Piを導入した際に、高負荷時の動作が遅かったので、温度を疑い、見事に高温からくるCPUクロック速度の制御が行われておりました。
参考記事:Raspberry Pi 熱対策 ファン導入

NVIDIA Jetson Nano導入時より温度の履歴を取得しておりました。

NVIDIA Jetson Nanoのセンサー情報取得

/sys/devices/virtual/thermal/thermal_zone[0-9]/type にセンサタイプ、
/sys/devices/virtual/thermal/thermal_zone[0-9]/temp に温度が記載されています。

$ cat /sys/devices/virtual/thermal/thermal_zone[0-9]/type
AO-therm
CPU-therm
GPU-therm
PLL-therm
PMIC-Die
thermal-fan-est
$ cat /sys/devices/virtual/thermal/thermal_zone[0-9]/temp
45500
35500
36000
33500
100000
35750

それぞれの内容を調べたのですが、以下の説明しか入手出来なかったです。
とりあえず、CPU温度とGPU温度の履歴を収集しました。
AO: always on,
PLL: phase locking loop,
PMIC: power management IC,
Tdiode: temperature of thermal diode in chip,
Tboard: temperature of board read from a thermal diode on board.

CPU温度とGPU温度をDBへ保存する際に利用したPHPスクリプト

//ログのファイル名
define("SENDGRID_API_LOG_NAME","jetson-temp");
//DB
define("DB_HOST","@DB_IP@:3307");
define("DB_USER","@USER@");
define("DB_PASS","@PASS@");
define("DB_DBNAME","@DB_NAME@");
define("DB_TABLENAME1","@TABLE_NAME@"); 

//温度取得ファイル名 CPU
define("FILE_NAME1","/sys/devices/virtual/thermal/thermal_zone1/temp");
//温度取得ファイル名 GPU
define("FILE_NAME2","/sys/devices/virtual/thermal/thermal_zone2/temp");

function addDBRecord($table, $datetime, $value1, $value2) {
    ##$mysqli = new mysqli($host_name, $user_name, $password, $database_name);
    $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_DBNAME);

    /* 接続状況をチェックします */ 
    if (mysqli_connect_errno()) {
        logger("Connect failed: ".mysqli_connect_error(),"INFO");
        exit();
    }
    echo "DB接続";

    // SQL(INSERT)を作成
    $sql = "INSERT INTO $table (
	    DATETIME, CPUTHERM, GPUTHERM
	        ) VALUES (
	        '$datetime', $value1, $value2
		)";
        
    $mysqli->query($sql);
    $mysqli->close();
}


function logger($text, $level) {
	$datetime = date('Y-m-d H:i:s');
	$date = date('Ym');
	$file_name = __DIR__ . "/log/".SENDGRID_API_LOG_NAME."-{$date}.log";
	$text = "{$datetime} [{$level}] {$text}" . PHP_EOL;
	echo $text;
	if(!(file_exists($file_name))){
		touch($file_name);
		chmod($file_name, 0777);
	}
	return error_log(print_r($text, TRUE), 3, $file_name);
}

//function logger($text, $level)

logger("Start Jetson temperature","INFO");

$datetime = date("Y/m/d H:i:s");

// ファイルを配列に格納し、さらに変数に格納
$lines1 = file(FILE_NAME1);
$temp1 = (float) $lines1[0] / 1000;
$lines2 = file(FILE_NAME2);
$temp2 = (float) $lines2[0] / 1000;

//echo $datetime;
//echo $lines[0];
#addDBRecord($table, $time, $value1) {
addDBRecord(DB_TABLENAME1,$datetime,$temp1,$temp2);

logger("End Raspi temperature : DATETIME: {$datetime}, CPU-TEMP: {$temp1}, GPU-TEMP: {$temp2}","INFO");

NVIDIA Jetson NanoのCPU温度・GPU温度の蓄積結果

平日の結果です。4回のめざましじゃんけんに合わせて、温度が高くなっています。
ただし、60℃以下ですし、ファンの導入は行っておりません。
Raspberry Piの発熱量と比べると非常に優秀です。

created by Rinker
NVIDIA
¥19,000 (2021/08/19 16:46:56時点 Amazon調べ-詳細)

めざましじゃんけん結果速報の安定動作に向けて

そろそろ、めざましじゃんけん広場を活性化させたいのですが、肝心のめざましじゃんけん速報の信頼性が十分に上がっておりません。

2020年も開始し、3週分のめざましじゃんけんが実施されました。
3週目なのですが、2回の結果速報不備が発生しました。
1件目は、実は先週の土曜日から発生しており、1月18日と20日の結果配信に一部不備が発生しました。
2件目は、めざましじゃんけんの対戦者の表示に不備が発生しました。

1件目は、Raspberry Piのフィリーズ。2件目は、ツイッター情報を本番でテキスト処理するので、想定されていないケースで失敗し、結果速報が正確に行えなくなります。

修正内容とJenkins

めざましじゃんけん結果画像検出システム実装方式の変更内容。
端的に説明すると、今まで、独立して動いていた2系統のシステムを統合的に動作させます。
Raspberry Piでシステムを稼働させ、システムの稼働率を上げるためにNVIDIAのJetson Nanoを導入しました。その際に、それぞれのシステムを独立して動作させておりました。しかし、片系にしか入らない処理があったり、シングルボードのシステムの信頼性ではシステム稼働率には大きな影響を与えました。

関連記事:めざましじゃんけん システム大規模改修

今までの実装

  • 起動方法は、Raspberry Pi with Intel NSC2およびNVIDIA Jetson NanoのそれぞれのCronで定期処理
    それぞれのシステムで定期実行させて、平行実行させておりました
  • Raspberry Piでテレビの電源ON/OFFを操作
  • じゃんけん結果後の処理は、結果を早く取得したシステムで実施
    • 通常はJetson Nanoが実施、結果取得結果が異なる場合は、アラートメール

これからの実装

  • Intel NUCのJenkinsより統合管理、Raspberry Pi with Intel NSC2とJetson Nanoは、じゃんけん結果の取得と登録に専念。(じゃんけん予想も実施させています)
  • テレビON処理失敗時には、Nature Remoを利用した電源操作もバックアップとして導入

悩んでいるところ

以下、2点を悩んでおります。

  • Jenkinsサーバーの冗長化
  • Raspberry Piの推論部分のIntel NUCへの移管

Jenkinsのノードの冗長化は、Raspberry Piに担当させて見ようかなと考えております。Raspberry Piの推論部分ですが、Intel NUCに移管しようかと考えております。Intel NSC2とIntel NUCの組み合わせでの機械学習も試してみたいところ。

WEBアクセスの負荷もあるので、まずは、性能情報を監視しして、どうするか考える予定です。

Intel Neural Compute Stick 2
created by Rinker
NVIDIA
¥19,000 (2021/08/19 16:46:56時点 Amazon調べ-詳細)

突然、全く関係ない話題!!
DQウォークの上級職公開がこんなに待ち遠しいとは!?

Dragon Quest Walk、DQウォーク、ドラゴンクエスト ウォーク

少し前から、ゲーム内でも告知されていますが、1月28日(火)のアップデートで、上級職がアップデートされるようですね。

周りの人も、ポケモンGOからドラクエウォークに乗り換えた人、ポケモンGOと疎遠になり、ドラクエウォークは頑張って続けている人。たくさんのユーザーがいるように思います。DQウォークの画面でウロウロしている人も結構見かけますし。

 

賢者が楽しみ

今後の上級職も楽しみですが、やはり賢者が一番楽しみです。回復にも回れるキャラクターが増えるので、助かります。

レンジャーとバトルマスター

あと、公開されているのは、レンジャーとバトルマスターですね。

 

2020年01月20日週 めざましじゃんけん 結果

フジテレビ めざましテレビ めざましじゃんけん の結果を保証したり、全ての結果が記載を保証するものではありません。

2020年01月20日週 のめざましじゃんけんの結果を公開します。


じゃんけん結果システムイメージ

Goo(グー) Choki(チョキ) Pa(パー)

めざましテレビ|めざましじゃんけんーフジテレビ

めざましじゃんけん結果
回次結果対戦相手
1月25日
(土曜日)
【2戦目】08時21分#木下康太郎 アナウンサー
【1戦目】07時38分#ネプチューン
1月24日
(金曜日)
【4戦目】07時58分#大泉洋 さん #小池栄子 さん
【3戦目】07時35分#渋野日向子 選手 #鈴木愛 選手
【2戦目】06時58分#YOU さん
【1戦目】05時58分まちかどじゃんけん
1月23日
(木曜日)
【4戦目】07時58分おかずクラブ
【3戦目】07時35分中村俊介さん、桑名愛斗さん
【2戦目】06時58分安嶋秀生さん、平塚翔馬さん
【1戦目】05時58分まちかどじゃんけん
1月22日
(水曜日)
【4戦目】07時58分生じゃんけん!ミルクボーイ
【3戦目】07時35分山下美月さん
【2戦目】06時58分モーニング娘
【1戦目】05時58分まちかどじゃんけん
1月21日
(火曜日)
【4戦目】07時58分軽部真一アナウンサー
【3戦目】07時35分佐々木蔵之介さん 広末涼子さん
【2戦目】06時58分仲間由紀恵さん
【1戦目】05時58分まちかどじゃんけん
1月20日
(月曜日)
【4戦目】07時58分<生じゃんけん!>井上清華アナウンサー
【3戦目】07時35分横山裕さん
【2戦目】06時58分森七菜さん
【1戦目】05時58分まちかどじゃんけん