PHPやJavaScriptなどの覚え書き、たまに愚痴、反省など。
twitterのつぶやきを取得して音声出力(MacOS限定)
- 15行目のダブルクォーテションをシングルクォーテションに変更しました。
- 49行目の正規表現を修正しました。
ご迷惑をおかけしてすいません。
はじめに!!
以下はMacOSX限定です。
さらに、初めのうちはかなり笑えますが、それ以上のものは得られません。役にも立ちません。
一回目はかなり笑えます。そこだけは保証します。
このスクリプトは?
タイムラインから「つぶやき」を取得して音声で読み上げます。
音声は女性の声ですが、かなり棒読みです。
ところどころ改善の余地はありそうなのですが、それは皆さんにお任せします。
動作環境
- MacOSX 10.5以上(開発は10.6で行いましたが10.5でも動作するはずです。)
- Perlおよび以下のPerlモジュール
- Net::Twitter::Lite
- XML::DOM
- LWP::Simple
- Yahoo日本語形態素解析APIを使用していますので、アプリケーションIDの取得も必要です。
- SayKana
インストール方法
1)まずはじめに、SayKanaをダウンロードしてインストールしてください。
インストール後は、ドキュメントに従って音声が出力されることをご確認願います。
2)以下のPerlモジュールをインストールしてください。
- Net::Twiter::Lite
- XML::DOM
- LWP::Simple(これはプリインストールかもしれません。)
私の環境では、CPANシェルで問題なくインストールできました。
3)以下のソースをデスクトップ等に設置して、パーミッションを755にしてください。
3)twitterアカウントのアカウント名およびパスワードを12行目および13行目に入力してください。
4)YahooアプリケーションIDを取得して15行目に記述してください。
ソース
#!/usr/bin/perl -wT
undef %ENV;
use strict;
use Encode;
use LWP::Simple;
use Net::Twitter::Lite;
use XML::DOM;
my $twt_user = '';
my $twt_pass = '';
my $yahoo_id = '';
my $api_url = 'http://jlp.yahooapis.jp/MAService/V1/parse?appid=%s&sentence=%s&results=ma';
my $saykana = "/usr/local/bin/saykana '%s'";
my $twt = Net::Twitter::Lite->new(
username => $twt_user,
password => $twt_pass
);
my $r = $twt->friends_timeline();
my $n = 0;
foreach (@$r) {
my $txt = encode_utf8($_->{'text'});
my $url = sprintf($api_url, $yahoo_id, &enc($txt));
my $xml = get($url);
my $kana = &xml2kana($xml);
print $kana."\n";
system(sprintf($saykana, $kana));
}
sub enc($) {
my $str = shift;
$str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
$str =~ tr/ /+/;
return $str;
}
sub xml2kana($) {
my $xml = shift @_;
my $parser = new XML::DOM::Parser;
my $doc = $parser->parse ($xml);
my $list = $doc->getElementsByTagName('reading');
my @kana;
for (my $i=0; $i<$list->getLength; $i++) {
my $text = $list->item($i)->getFirstChild->getNodeValue;
$text =~ s/'//g;
if ($text =~ /^[0-9]+$/) {
$text = "<NUMK VAL=".$text.">";
} elsif ($text =~ /^\s+$/){
$text = ',';
}
$text =~ s/\//\\\//g;
push @kana, $text;
}
return encode_utf8(join("/", @kana)).",,,";
}
その他
- 空白はコンマに変換して一瞬だけスリープが入るようにしています。
- つぶやきとつぶやきの間にはコンマを3つ挿入して長めのスリープが入るようにしています。
- シングルクォーテションはsaykanaコマンドにおいてアクセントを意味する記号であることとセキュリティ上の配慮により削除しています。
本来は「。」であるが妥当なのですが、テキストエディタで本スクリプトを編集した際にsaykanaコマンドでエラーが出るため、半角の記号で代用しました。(UTF-8-MACによる問題と思われますが、くわしく検証していません。)
(追記)
よく考えたらUTF-8-MACは関係ないかも、いずれにしろJeditで「。」を入力した場合とvimで「。」を入力した場合で何かが違うみたい。(両方ともUTF-8なんですけど。)
ソースをご覧になるとわかりますが、別にtwitterじゃなくても別のものをしゃべらすのも、それほど難しくないので、適当にお楽しみください。
ライセンス
SayKanaおよびYahoo APIのライセンスは厳守していただけますようお願いいたします。
気に入ってくれた方は、ブログ等で紹介してくだされば、十分うれしい限りです。
| この記事は miya によって 2009 年 9 月 7 日 5:11 AM に投稿されました, 未分類 以下に保存されています。 RSS 2.0 を通してコメントをフォローする。 コメントを残すか、ご自分のサイトからトラックバックできます。 |
トラックバックはありません。
Additional comments powered by BackType


about 6 months ago
はじめまして。
あまりにも初心者で場違いかもしれませんが、アドバイスいただければと思います。
ワタシは、盲学校の方々を対象にTwitterのつぶやきを配信できたらなぁと思ってここに辿り着きました。
現在、Mac 10.6 を持っています。
正直、「Mac」と「Twitter」と「つぶやき」くらいしか、ワタシに分かる言葉がなくて、タイトルのようなことをしたいと願っているのですが、難しくて何が分からないかも分からない状態です。
ワタシも音声出力できるようになるには、どのような手順を踏めば良いでしょうか・・・?
稚拙でへんなコメントですみません。
—-
さくら
about 6 months ago
さくら様、はじめまして。
コメントいただきありがとうございます。
コマンドライン操作というのが必要なので、プログラマー以外の方に簡単に説明するのはとても難しいです。
(本当にごめんなさい。)
ただ、「盲学校の方々を対象にTwitterのつぶやきを配信」というのはとても興味があるのですが。。。
ちなみに、本文中でも書いている通り、実用ベースで行うには解決するべき問題が大量にあるので、このままでは役に立たないと思います。
お役に立てずに本当にすいません。
about 6 months ago
返信いただきありがとうございました。
他の方法で頑張ってみます。
—-
さくら