Twitterは便利で楽しいものですが、タイムライン(TL)を追うのはなかなか大変です。
TLはすべて追えなくても気にするべきではない、とはよく言われるものの、他の作業をしていてもTLが気になったり…
そこで、他の作業をしながらTLも追いかけられるように、Macで自分のTLを読み上げる仕組みを作ってみました。
こんな感じで読み上げられます。
動画では写していませんがGrowlを準備しておけばつぶやきも表示されます。
以下、今回作成した仕組みの詳細です。
Perlやコマンドラインは使いますが、おそらく1時間-2時間で構築できると思いますので、よろしければ試してみてください。
質問、コメント等は @naokisatoname まで。
利用したツール等
- Mac OSX 10.6 (Leopard)
- Xcode (MacPortsインストール用)
- MacPorts
- nkf (MacPortsからインストール)
- kakasi (MacPortsからインストール)
- Perl 5.10 (Mac標準)
- Net::Twitterモジュール (CPANからインストール)
- Lingua::JA::Regular::Unicodeモジュール (CPANからインストール)
- sayコマンド (Mac標準)、AQUEST SayKana
- Growl (※必要な場合)
手順詳細
- Xcodeをインストールします。
- MacPortsをダウンロード、インストールし、最新情報に更新します。
(※MacPortsの使い方については MacPortsの基本的な使い方とコマンド 等に詳しく解説されています) - MacPortsからnkf、kakasiをインストールします。
sudo port install nkf sudo port install kakasi
- CPANを利用してPerl用のモジュール Net::Twitter と Lingua::JA::Regular::Unicode をインストールします。
sudo perl -MCPAN -e shell install Net::Twitter install Lingua::JA::Regular::Unicode
すこし時間がかかります。 - Growlを利用する場合、ダウンロード、インストールします。
.dmgに同梱されているgrowlnotifyをインストールします (growlnotify/growlnotify を /usr/local/bin にコピーします)。 - SayKanaをダウンロード、インストールします。
- 次のような内容で、任意の名前のPerlスクリプトを作成します (ここでは
saytwitter.pl
とします)。
USERNAME
をユーザ名に、PASSWORD
をパスワードに置き換えます。
#!/usr/bin/perl use strict; use utf8; use Encode; use Net::Twitter; use Lingua::JA::Regular::Unicode; my $twitter = Net::Twitter->new ( #USERNAME → ユーザ名に置き換え username => "USERNAME", #PASSWORD → パスワードに置き換え password => "PASSWORD" ); #TLを取得 my $array_ref = $twitter->friends_timeline(); foreach my $ref( @$array_ref ) { my $username = $ref->{'user'}{'name'}; my $line = $ref->{'text'}; #Growlにつぶやきを表示させる場合、コメントを外す #qx{ growlnotify -m \"\@$username: $line\" }; &say($username); &say($line); } sub say { my $line = $_[0]; print encode('utf-8', $line) . "\n"; #全角 → 半角 $line = alnum_z2h($line); #シングルクォート、ダブルクォートを削除 $line =~ s/[\"\']//g; #http, httpsから始まる単語を"URL"に変換 (うまく読み上げられないので) $line =~ s/(http:\/\/\S+)|(https:\/\/\S+)\s/URL/ig; #コロンを削除 $line =~ s/[:]/,/g; #@ユーザ名を単に"at"に変換 (うまく読み上げられないので) $line =~ s/\s*[@@][0-9a-zA-Z]+\s*/ at /g; #ハッシュタグを"hash"に変換 (うまく読み上げられないので) $line =~ s/\s*\#\w+\s*/ hash /g; #各種カッコを半角(に変換 $line =~ s/[\(\[\{\<(「{【]/(/g; #各種カッコを半角)に変換 $line =~ s/[\}\]\}\>)」}】]/)/g; #漢字をひらがなに変換し、分かち書きにする my $line_mod = qx{ echo \"$line\" | nkf -e | kakasi -w | kakasi -JH -KH | nkf -w }; #半角英数字、ひらがな、および特定の記号のみ抽出する my $text = ""; for(my $i = 0; $i < length($line_mod); $i++) { if(substr($line_mod, $i, 1) =~ m/[0-9a-zA-Z@!?().,_ \/\n] |[、。ー!?・… ] |\p{Hiragana}/) { $text = $text . substr($line_mod, $i, 1); } } if($text =~ m/(\p{Hiragana}|\p{Katakana}|\p{Han})/){ #名前、つぶやきに日本語が含まれている場合 #漢字からひらがなへの変換で"っ"が重なる場合があるので修正 $text =~ s/っ+/っ/ig; #読み方の調整 #SayKanaの仕様書を参考に、ご自由に調整してください $text =~ s/at/あっと、/g; $text =~ s/hash/はっしゅ。/g; $text =~ s/ ([,.、。!?!?ー])/$1/g; $text =~ s/([!!])/。/g; $text =~ s/([??])/?/g; $text =~ s/ /\//g; $text =~ s/[・…]/、/g; $text =~ s/[\(\)]/,/g; $text =~ s/\/は\//\/わ\//g; $text =~ s/は\//わ\//ig; #英単語・固有名詞の読み方設定 $text =~ s/Windows/うぃんどうず/ig; $text =~ s/Mac/まっく/ig; $text =~ s/Linux/りなっくす/ig; $text =~ s/Twitter/ついったー/ig; $text =~ s/Google/ぐーぐる/ig; #数字の読み方設定 (例えば、"10"を「いちまる」ではなく「じゅう」と読ませるようにしている) $text =~ s/([0-9]+)//ig; #SayKanaで読み上げ system("echo \"$text\" | SayKana"); } else { #名前、つぶやきに日本語が含まれている場合 #sayで読み上げ system("say \"$text\""); } #1秒待機 sleep(1); return; }
- 作成したPerlスクリプトに実行権限を与え、任意の場所にコピーします (ここでは
/usr/local/bin
にコピーします)。
chmod a+x saytwitter.pl sudo cp saytwitter.pl /usr/local/bin/
このPerlスクリプトを実行すれば、自分のTLから直近20件分のつぶやきが、ユーザ名・つぶやき内容の純に読み上げられるはずです。
Growlを設定している場合は同時に表示されるはずです。 - 定期的に読み上げられるように、cronに登録します。
cron登録用のShellスクリプトを作成します (ここでは saytwitter とします)。
#!/bin/sh export PATH=/usr/local/bin:/opt/local/bin:$PATH /usr/local/bin/saytwitter.pl
- 作成したShellスクリプトに実行権限を与え、任意の場所にコピーします (ここでは
/usr/local/bin
にコピーします)。
chmod a+x saytwitter sudo cp saytwitter /usr/local/bin/
- 作成したShellスクリプトをcronに登録します。
実行のタイミングはご自分の環境に応じて調整ください (@naokisatoname の場合、5分間隔に実行しています)。
crontab -e
*/5 * * * * /usr/local/bin/saytwitter
- 以上で定期的に自分のTLが読み上げられるようになります。
読み上げを停止する場合は、登録したcronのJobを削除します。