NanoPi NEOに100均スピーカーを繋いでみた

以前書いたNanoPi NEOがTwitterを声でツブヤクンデスの関連記事。

NanoPi NEO2 スピーカー接続 1
他所様のウェブサイトの100均スピーカーの記事でよく見るセリアのマルチメディアスピーカー。大手の100均が扱っているスピーカーの中では最もマシに鳴りそうなやつ。地味好きなオッサンなので今回は白を買ったけど、黒やその他弩ハデな色が数種類揃っている。

NanoPi NEO2 スピーカー接続 2
大して変わらないけど袋から出してみた。シングルスピーカーだけど一応接続部はステレオミニプラグになってる。

NanoPi NEO2 スピーカー接続 3
NanoPi NEO2に接続してみた。

NanoPi NEO2 スピーカー接続 4
NanoPi NEO/NEO2に生えているオーディオ出力は上の図の赤い四角で囲ったところ。USBコネクタの横の6つの穴の基板の端寄り3つ。
他のGPIOピンヘッダ用の穴は2.54mmピッチだけどオーディオ用の6穴だけは2mmピッチなのでピンヘッダはそれ用を使うか、2.54mm用のピンヘッダからピンだけ抜いてハンダ付けするか。(強度は不足するけど)

ステレオミニプラグは先端からL(左)、R、(右)、GND(グランド)で、NanoPi NEO/NEO2側はL,G,Rなのでx3のジャンパワイヤを使用するなら一箇所交差。

なお、購入したスピーカーはアンプ無しでNanoPi NEO2側はLINE-OUTなので鳴ることは微塵も期待できない。

ヤバっ、全然聞こえんわ!(あたりまえ)

LINE-INのあるオーディオ機器につなぎましょう。
てか、USBスピーカーつないだ方が楽だわ。

NanoPi NEO2 スピーカー接続 5
上の画像はUSBスピーカーじゃなくてUSBのDACとそのイヤホン出力にスピーカーを繋いだ。USB DACは特殊なものでなければNanoPi NEOに繋ぐだけでUSBスピーカーと同じ扱いで認識される。スピーカーはイヤホン用の出力だとやはりあまり大きな音では鳴らない。最大音量でようやく呟く程度の音量。

100均スピーカーはWindows PCのヘッドホン出力(LINE-OUTじゃないよ)に繋いでWindowsでもTwitterを声でツブヤクンデスの出力用にした。ただし、こちらもボリューム最大でようやく近くで聞き取れる程度。まぁ大音量で喋ったら怖いしこれで十分。

関連記事:

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
1
2
3
4
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セクションを探す)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
;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\ の下に置く。

↑のやり方はTwitterOAuthの古いバージョンでは有効だが、TwitterOAuthの2.0以降ではcomposerで指示通りにTwitterOAuthをインストールしないとcaBundleが無いだののエラーで困るかも。

ツブヤクンデス作成

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?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);
  }
}
?>

TwitterOAuth 2.0以降ではTwitterOAuthをcomposerでインストールすることになる。(でないといろいろ困ることに) composerでTwitterOAuthをインストールした場合は3行目のPathが違ってくるのでそこだけ変更。少なくともTwitterOAuth 3.1までは3行目のPath以外は変更なしで動く。

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

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

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

1
2
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

1
2
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c C:\Users\foobar\プログラム\twitter\tsubuyaku.bat", vbhide
または
1
2
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分間に追加されるツイート数が多すぎる場合は調整が必要。

関連記事:

Up