Thanks Driven Life

日々是感謝

twittering-mode + saykana で Timeline を読み上げるっぽいもの

saykana必須 なので、一応 MacOSX 用です。
まだほとんどできてないんですけどね。
動きとしては

  1. twittering-mode で新着 tweets が来たら起動
  2. 「ユーザ1」</>「tweet」<next>「ユーザ2」</>「tweet」<next>「ユーザ3」</>「tweet」<next>というよくわからないフォーマットで文字列を生成
  3. そいつを外部スクリプトである saykana_wrapper (名前も適当)に投げる
  4. 発言「誰さんの発言:ほげほげ!」みたいな

フォーマットに関しては、かなりやっつけです。正直なんでもいいです。受け取り側で認識さえすれば。
ちなみに以下が emacs 側。こいつを.emacs なり、emacs が認識するファイルに書けばおk

(add-hook 'twittering-new-tweets-hook
          (lambda ()
            (let ((n (1- twittering-new-tweets-count))
                  (s ""))
              (while (<= 0 n)
                (setq s
                      (concat s
                              (cdr (nth 8 (nth n twittering-timeline-data))) ;; ユーザ名
                              "</>"
                              (cdr (nth 1 (nth n twittering-timeline-data))) ;; tweet
                              "<next>"))
                (setq n (1- n)))
              (start-process "twittering-saykana" nil "saykana_wrapper" s))))

8 がユーザ名で、1 が tweet とかいちいち調べましたからね。
twittering-mode で既に getter があるかなーと思ったんですけど、よくわからんかったです。

start-process は非同期で外部プログラム実行ですね。以下が saykana-wrapper です。ruby です。

#!/usr/bin/env ruby                                                             
# -*- coding: utf-8 -*-                                                         

timeline = ARGV.join.split('<next>')

timeline.each do |tl|
  user,tweet = tl.split('</>')
  t = `echo #{tweet} | mecab -Owakati | mecab -Oyomi | sed -e 's/ハ/ワ/g'`
  `saykana '#{user}さんのはつげん'`
  `saykana '#{t.strip}'`
end

saykana は 「11月」とかはいい感じで呼んでくれるのですが
それ以外の漢字は読めないので、カタカナに変換して saykana に渡しています。


一応動いてくれてはいますが、やはりやっつけで書いたのでかなりおかしいです。

  • @hoge とか RT とかの対処(消すなり「〜さん宛」に直すとか
  • 英字をそのまま呼んでしまう (gongo → ジーオーエヌジーオー)
  • そのまま読むのでhttp 〜が長い場合はうざすぎる

saykanji *1 っぽく作ると発音はよくなるでしょう。いずれパクります。
あと、URLなどのいらん箇所も省けばいいと思う。すぐできるけどめんどいから今はやらん。
他にもいろいろあるけど、どうせお遊びなので気にしない気にしない。誰か直して。


ちなみに、Windows であればソフトークだったりがあるけど、Linux って say コマンドっぽいのあったかなー


追記 2010/01/17 17:24
id:hayamiz さんのコメントにより、以下な感じで直せました。

(add-hook 'twittering-new-tweets-hook
          (lambda ()
            (let ((tweets twittering-timeline-data)
                  (s ""))
              (setq s (with-output-to-string
                        (while tweets
                          (princ (twittering-format-status (car tweets)
                                                           "%S</>%t<next>"))
                          (setq tweets (cdr tweets)))))
              (start-process "twittering-saykana" nil "saykana_wrapper" s))))

あとは Ruby 側をちゃんとすればいいかなー