WindowsでもTwitterを声でツブヤクンデス

Twitter

前回、シングルボードコンピューターのNanoPi NEO/NEO2とOpen JTalkを使って音声合成でTwitterをつぶやいて貰ったが、今回はWindowsでTwitterをつぶやいて貰う。
NanoPi NEO/NEO2ではOSにTTSが付いていないのでOpen JTalkを使用したが、WindowsにはTTSが載っているので今回はそれを使う。その方が圧倒的に簡単だし。

WindowsでTwitterを読み上げるのは既にあるじゃん?っていうのはあるけど自分で好き放題できる方がいいのでベースとなるものを作ってみた。

Windowsのことを解っている人には余計なお世話だろうけど、一応ファイルの置き場所を決める。
今回は C:\User\foobar\プログラム\twitterとする。「foobar」の部分は既存のユーザー(自分)に置き換えて欲しい。
C:\Program Files\ とかじゃないの?と思われるかもだけど「バックアップはユーザーフォルダを丸ごと抜き取るだけにしたい」という個人的な趣味。

テキストを読み上げ本体

新規ファイル作成
C:\User\foobar\プログラム\twitter\speech.js
var oArgs = WScript.Arguments;
var tts = WScript.CreateObject("SAPI.SpVoice");
// WScript.Echo(oArgs(0));
tts.Speak("!cont! " + oArgs(0));

1行目で引数を取って配列に入れる。
2行目はTTSの準備。
3行目はコメント化してあるけど、第一引数を表示(確認用)。あれっ?配列の要素oArgs(0)じゃなくてoArgs[0]じゃね?この場合はoArgs(0)なのよ。
4行目はTTSに第一引数を読ませる。

TTSの読み上げの最初が抜けて途中からになるようなのでダミーの"!cont! "を読み上げるテキストの前に付けている。

speech.jsファイルを保存。
[Win]+[R]で入力欄に
C:\User\foobar\プログラム\twitter\speech.js "読み上げテスト"
と、入力して[Enter]で実行して「よみあげてすと」という声が聞こえれば成功。

PHPの準備

Windows用 PHP準備 1
Windows用のPHPをhttp://windows.php.net/downloadからダウンロードする。
上の画像の赤い四角(x64 Non Thread Sage)は64bit用。32bit用なら一番上(x86 Non Thread Sage)でいい。

Zipファイルを解凍してフォルダ名を例えばphp-7.1.5-nts-Win32-VC14-x64のようなものからphp-7.1.5x64などに変更する。(任意)
php-7.1.5x64フォルダをC:\User\foobar\プログラム\の下に置く。つまり先に作ったtwitterフォルダと並ぶ。(これも好みの問題なので任意)

Windows用 PHP準備 2
エクスプローラーの左列のツリーで「PC」を右クリックして「プロパティ」を選択。

Windows用 PHP準備 3
左列の「システムの詳細設定」を選択。

Windows用 PHP準備 4
上部の[詳細設定]タブを選択。
[環境変数]ボタンを押す。

Windows用 PHP準備 5
Pathの行を選択。
[編集]ボタンを押す。

Windows用 PHP準備 6
既に何らかの変数値が入っている筈なのでその後に続けて入力する。(次)

Windows用 PHP準備 7
;C:\User\foobar\プログラム\php-7.1.5x64
; (セミコロン)の後にPHPを置いたPathを指定する。セミコロン忘れたらダメ。既に書いてるけどfoobarの部分は自分のユーザー名に置き換える。
[OK]を押す。

Windows用 PHP準備 8
登録し終わって、もう一度Pathの行を選択して[編集]ボタンを押すとこのように表示される筈。
入力した内容が間違っていたら2行目を選択して[編集]を押す。今後いつかPHPを使わなくなったら2行目を選択して[削除]を押す。

PHPの準備はあと少し。
C:\User\foobar\プログラム\php-7.1.5x64にphp.ini-developmentというファイルがあるのでコピーしてphp.iniというファイル名にする。
php.iniを編集。(ファイル半ばのDynamic Extensionsセクションを探す)

;extension=php_curl.dll
;extension=php_mbstring.dll

↑この2行の先頭の ; (セミコロン)を削除↓

extension=php_curl.dll
extension=php_mbstring.dll

またはファイルのPath付きで指定

extension=/User/foobar/プログラム/php-7.1.5x64/ext/php_curl.dll
extension=/User/foobar/プログラム/php-7.1.5x64/ext/php_mbstring.dll

これでPHPの準備完了

TwitterOAuthの準備

PHPでTwitterを簡単に利用するためのTwitterOAuthを入手する。これは前回書いたのと一緒。
GitHubのtwitteroauthのページの右上の方にある緑色の[Clone or download]ボタンでmaster.zipをダウンロードする。
master.zipを解凍する。
twitteroauth-masterというフォルダ名をtwitteroauthに変更する。
twitteroauthを C:\User\foobar\プログラム\twitter\ の下に置く。

ツブヤクンデス作成

基本的には前回と同じ。WindowsのTTSのHarukaは英単語をスペルでなくある程度単語として読んでくれるので前回のようにアルファベッド除去は行わない。ただし、引き続きURLは読まないようにする。

新規ファイル作成
C:\User\foobar\プログラム\twitter\tsubuyakundesu.php

<?php
//mb_internal_encoding("UTF-8");
require_once("./twitteroauth\autoload.php");
use Abraham\TwitterOAuth\TwitterOAuth;

date_default_timezone_set('Asia/Tokyo');

$idfile = './tweet_id_stamp.txt';
$id = file_get_contents($idfile);
$id_old = $id;

//以下4行に取得したTwitterのAPI用のキーやトークンを入れる
$consumerKey = 'xxxxxxxxxxxxxxxxxxxxxxxxx';
$consumerSecret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$accessToken = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$accessTokenSecret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

//認証
$connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);

//タイムライン取得
$timeline = $connection->get('statuses/home_timeline', ['count' => '10']);

// var_dump($timeline);

//タイムラインを逆にする
$timeline = array_reverse($timeline);

foreach($timeline as $tw){
//    echo $tw->id . "\n";
//    echo date('Y-m-d H:i:s', strtotime($tw->created_at)) . "\n";

  $id = file_get_contents($idfile);

  if ($tw->id > $id){
    $id = $tw->id;
    // echo $tw->user->name . "\n";
    $twname =  preg_replace("/[^ァ-ンぁ-んァ-ンーa-zA-Z0-9一-龠0-9]+/u",'' , $tw->user->name);
    echo $twname . "\n";
    exec(".\\speech.js $twname");

    //echo preg_replace('/https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:@&=+$,%#]+/', '', $tw->text) ."\n";
    $speech = preg_replace('/https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:@&=+$,%#]+/', '', $tw->text);
    $speech = str_replace('Twitter', 'ツイッター', $speech);
    $speech = preg_replace('/^RT \@.*?:/', 'リツイート', $speech);
    $speech = preg_replace("/[^ァ-ンぁ-んァ-ンーa-zA-Z0-9一-龠0-9\-\s!]+/u",'' ,$speech);
    $speech = preg_replace('/(\r\n|\r|\n)/', '!', $speech);
    echo $speech . "\n";
    exec(".\\speech.js \"$speech\"");

    file_put_contents($idfile, $tw->id);
  }
}
?>

TwitterのAPIを利用するためのキーとかアクセストークンの取得についてはこの記事ではやらないので「twitter api アクセストークン」あたりのキーワードでググって取得して欲しい。

タイムラインの最新のツイートのIDを保存するファイルを新規作成。ダミーのIDとして0を入力して保存。
C:\User\foobar\プログラム\twitter\tweet_id_stamp.txt

上のPHPファイルを実行するためのバッチファイルを新規作成。
C:\User\foobar\プログラム\twitter\tsubuyaku.bat

cd C:\Users\foobar\プログラム\twitter
C:\Users\foobar\プログラム\php-7.1.5x64\php.exe C:\Users\foobar\プログラム\twitter\tsubuyakundesu.php

1行目は要らないと思うが念の為。
バッチファイルを(ダブルクリックなどで)実行してTwitterが読み上げられることを確認。
ただし、バッチファイルをダブルクリックだと文字が正しく表示されない可能性が高いのでコマンドプロンプトを開いて
cd \User\foobar\プログラム\twitter\
php .\tsubuyakundesu.php
の方が良いかも。

上のバッチファイルを実行するとコマンドプロンプト画面が開く。つまり、このままだとTwitterの読み上げが実行される度に画面にコマンドプロンプト窓が開くことになる。絶対に邪魔な筈。
そこで、窓が開かないようにVBSのラッパーファイルを新規作成する。
C:\User\foobar\プログラム\twitter\wrapper.vbs

Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c C:\Users\foobar\プログラム\twitter\tsubuyaku.bat", vbhide
または
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c C:\Users\foobar\プログラム\php-7.1.5x64\php.exe C:\Users\foobar\プログラム\twitter\tsubuyakundesu.php", vbhide

vbhideで隠しちゃうというただそんだけ。

タスクスケジューラー登録

Windows XPの頃のタスク登録は比較的直感でわかるようなものだっだのだが、Windowsのバージョンが進むにつれどんどん改悪されて、今では自力で満足に設定するのがほぼ無理というくらいワケがわからない状態。普通は逆じゃないですかね?
常識的な設定をすると「動かんやんけ💢」になるのでWindows10なら以下の真似をして貰うのが良いかと。

タスクスケジューラー登録 1
「コントロールパネル」から「管理」を開き、「タスクスケジューラー」を実行。
右列の「タスクの作成」を選択。

タスクスケジューラー登録 2
左上の「全般」タグを選択(初期状態)。
「名前」は任意。何かしらは入力しないとダメ。わかりやすいものを。
「説明」も任意。
基本的には「ユーザーがログオンしているときのみ実行する」にしておく。

タスクスケジューラー登録 3
左上の「トリガー」タグを選択。
新しいタスクなので何も登録されていない筈。
[新規]を選択。

タスクスケジューラー登録 4
「1回」を選択。開始は数分後の未来よりも以前を指定。(過去可)
「繰り返し間隔」はプルダウンで5分間を選択してから5を消して2に変える。または任意で好みの間隔を指定。
「継続時間」は無制限とする。
「有効」にチェックがあることを確認。

タスクスケジューラー登録 5
上部の「操作」タグを選択。
新しいタスクなので何も登録されていない筈。
[新規]を選択。

タスクスケジューラー登録 6
「プログラム/スクリプト」欄に C:\User\foobar\プログラム\twitter\wrapper.vbs を指定。
「開始(オプション)」に C:\User\foobar\プログラム\twitter\ を指定。
下の[OK]を押す。

タスクスケジューラー登録 7
左列で「タスクスケジューラーライブラリ」を選択。
中央列で先程登録した「ツブヤクンデス」を選択。
右列で「実行」を押してTwitterが読み上げられることを確認。
ただし、直前の読み上げ以降にタイムラインに新しいツイートが追加されていないと当然読み上げられないのでツイートの多いアカウントを幾つかフォローするか、先に作成したC:\User\foobar\プログラム\twitter\tweet_id_stamp.txtを開いてひと桁減らすとか0にするとかして保存。それから[実行]ボタンを押す。

タスクスケジューラー登録 8
数分待ってから
左列で「タスクスケジューラ(ローカル)」を選択。
中央列の中段で登録済みのタスク「ツブヤクンデス」の行をスクロールして探し、次回の実行時間を確認する。
次回の実行時間を過ぎてから「最新の情報に更新」(2つあるボタンどちらでも可)を押す。
中央列の中段で登録済みのタスク「ツブヤクンデス」の行をスクロールして探し、その左側のを押す。
実行時間を確認して実行結果が成功であることを確認。かつタイムラインにツイートが追加されている場合にはTwitterが読み上げられること。

これで、取りあえずは2分おきにタイムラインに追加された新しいツイートを読んでくれる筈。2分間に追加されるツイート数が多すぎる場合は調整が必要。

霧がかかったような白っぽい画像の修正

先日、CASIO EXILIM EX-Z920っていうカメラの記事を書いたけど、このカメラで撮った写真がとにかく白っぽい。霧の中で撮影したんかいってほど。
カメラの液晶で確認して撮った時点では解らなくてPCに転送して画像を開いてようやく「白っぽいやんけヽ(`Д´)ノ」って気付くんだけど、このカメラはJPEG出しなので厳密な意味ではもう救いようがない。

とはいえ、実際はデジカメの画像は等倍そのまま無加工でハイってわけじゃないだろうから、加工する際にちょっとごまかす。

白っぽい画像を修正 1
ダイソーの商品の記事を作るときに撮った写真。全体的にとても白っぽい。

白っぽい画像を修正 2
今回は画像編集ソフトのGIMPを使用したが、ヒストグラム見ながら弄る機能の付いている画像編集ソフトならおそらく同様でいける筈。または「ノーマライズ」機能があるアプリなら以下の作業を勝手にやってくれるかと。

GIMPで画像を表示した(または範囲選択した)状態でメニューから「色」のプルダウンメニューを開く。
「トーンカーブ」を選択する。

白っぽい画像を修正 3
トーンカーブの調整窓が開く。
左下から右上に伸びる線が現在のトーンカーブ(直線だけど)。
それとは別に灰色で下側が塗りつぶされたグラフがある。これが画像中の画素の明度(現在は明度チャンネルが開いているので)。 左が暗い側、右が明るい側。左の方に大きな山があるが更に左は高さが0の部分で直線になっている。ここが白っぽさの原因。黒が締まらない。

白っぽい画像を修正 4
カーソルを左下に合わせて下りマウスの左ボタンを押す。(クリックじゃなく押し続ける)

白っぽい画像を修正 5
灰色のグラフの山の始まり部分より少し右まで右にスライドさせてマウスの左ボタンを離す。
山の端ぎりぎりだと黒が締まらないし山の中腹までスライドすると暗部が真っ黒に潰れるので好みになる範囲で調整。
画像が全体的に暗いなという場合は、明るい側(グラフ右側)も同様に。
また、画像ではトーンカーブが直線だが、曲線にすることもできるので中間部分の明るさの遷移を変えたければ触る。(けど下手に触ると訳が解らんくなる)

白っぽい画像を修正 6
机の天板の木目が完全に潰れない程度で黒が締まった感じになった。解るかしら?

白っぽい画像を修正 7
左半分が加工前、右半分が修正後。

白っぽい画像を修正 8
今度は逆、左半分が加工後、右半分が加工前。

画像の霧は晴れたけど天板の木目部分の色ノイズ凄いな。

撮影した画像が白っぽくなるの解ってるんだからカメラでJPEG出力する前に自動で加工してよ。っていうかヒストグラムで見て暗い部分の山の始まりが右より過ぎな状態で画像出力処理しちゃうのってカメラのバグだよね。
カシオ大丈夫?

ガメラレーダーとXバンドレーダー

産経ニュースに何故か今頃ガメラレーダーの記事が出ていた。
今やるならとっくに運用中のFPS-5より置換え中のJ/FPS-7の方でしょとも思うが、北朝鮮を監視ということだと探知距離の長いJ/FPS-5でいいのか・・

例によってGoogleマップで見てみた。ついでにXバンドレーダーも。

J/FPS-5 ガメラレーダー

下甑島分屯基地 (鹿児島県薩摩川内市 下甑島) 2008年運用開始

佐渡分屯基地 (新潟県佐渡市) 2009年運用開始

大湊分屯基地 (青森県むつ市大湊 釜臥山) 2010年運用開始 (J/FPS-5B)

与座岳分屯基地 (沖縄県糸満市 与座岳) 2011年運用開始 (J/FPS-5C)

建物自体がグリンと回ることができるように出来てるってのが男子の心をくすぐるよね。

J/FPS-20, AN/FPS-6, J/FPS-2という旧レーダーからの置き換えが進んでいるJ/FPS-7はJ/FPS-5より価格が半額と安く性能もそこそこ?みたいな扱いにされてるけど、情報が全然無い。
情報が無いっていうのは個人的には過小評価方向に怪しいと思っている。(というか、J/FPS-5が本当に超重要施設なら所在地含めてあまりに隠されてなさすぎ)

Xバンドレーダー

車力分屯基地C地区 (青森県つがる市) 2007年AN/TPY-2運用開始

経ヶ岬通信所(米陸軍) (京都府京丹後市) 2014年AN/TPY-2運用開始

Xバンドレーダーは車で引っ張っていけるトレーラータイプでかなり小型。とはいえ、Googleマップには十分に写る大きさの筈だが、それらしいものが全く見えない。ついでにいうと存在する筈の周囲の建物も見えない。隠されてるってことだぁね。(見当外れの場所出してたらスンマセン)