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("! " + oArgs(0) + "! ");

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

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

2017年6月11日追記:
逆にダミーテキストが読まれることがあるようなのでちょっと変更した(speech.js 4行目)。

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分間に追加されるツイート数が多すぎる場合は調整が必要。

関連記事


コメントを残す

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