MutationObserverとSpeechSynthesisを使うシンプルな方法が既に紹介されていたが動作が不安定だったのでChrome拡張として自分で作り直した。
SpeechSynthesisに長文を連続で送りつけると読み上げが止まってブラウザの再起動が必要になる。この辺りは中で呼んでいるAPIの仕様の領域なのでまだよくわかっていないが、TLの流速に合わせて調節する必要がありそうだ。
TweetDeckのページ全体がJavaScriptによって動的に生成されているので、ページの読み込みのあとにMutationObserverのターゲットを指定する必要がある。愚直にsetTimeoutを使った。新しいツイートの受信以外にもMutationObserverを発火させる要因がなにかあるようだが、まだわかっていない。
読み上げの内容についても、リプライは読むのか、ハッシュタグは読むのか、URLは読むのか、画像はどうするのかなど使い方に応じて検討すべき点がある。これらは設定で変えられるようにしたい。