MacでTwitterのタイムラインを読み上げさせる

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 (※必要な場合)

手順詳細

  1. Xcodeをインストールします。
  2. MacPortsをダウンロード、インストールし、最新情報に更新します。
    (※MacPortsの使い方については MacPortsの基本的な使い方とコマンド 等に詳しく解説されています)
  3. MacPortsからnkf、kakasiをインストールします。

    sudo port install nkf
    sudo port install kakasi

  4. CPANを利用してPerl用のモジュール Net::Twitter と Lingua::JA::Regular::Unicode をインストールします。

    sudo perl -MCPAN -e shell
    install Net::Twitter
    install Lingua::JA::Regular::Unicode


    すこし時間がかかります。

  5. Growlを利用する場合、ダウンロード、インストールします。
    .dmgに同梱されているgrowlnotifyをインストールします (growlnotify/growlnotify を /usr/local/bin にコピーします)。
  6. SayKanaをダウンロード、インストールします。
  7. 次のような内容で、任意の名前の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;
    }

  8. 作成したPerlスクリプトに実行権限を与え、任意の場所にコピーします (ここでは/usr/local/binにコピーします)。

    chmod a+x saytwitter.pl
    sudo cp saytwitter.pl /usr/local/bin/


    このPerlスクリプトを実行すれば、自分のTLから直近20件分のつぶやきが、ユーザ名・つぶやき内容の純に読み上げられるはずです。
    Growlを設定している場合は同時に表示されるはずです。

  9. 定期的に読み上げられるように、cronに登録します。
    cron登録用のShellスクリプトを作成します (ここでは saytwitter とします)。

    #!/bin/sh
    
    export PATH=/usr/local/bin:/opt/local/bin:$PATH
    /usr/local/bin/saytwitter.pl

  10. 作成したShellスクリプトに実行権限を与え、任意の場所にコピーします (ここでは/usr/local/binにコピーします)。

    chmod a+x saytwitter
    sudo cp saytwitter /usr/local/bin/

  11. 作成したShellスクリプトをcronに登録します。
    実行のタイミングはご自分の環境に応じて調整ください (@naokisatoname の場合、5分間隔に実行しています)。

    crontab -e


    */5 * * * *  /usr/local/bin/saytwitter

  12. 以上で定期的に自分のTLが読み上げられるようになります。
    読み上げを停止する場合は、登録したcronのJobを削除します。
%d人のブロガーが「いいね」をつけました。