読者です 読者をやめる 読者になる 読者になる

読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

ツイートを読み上げるスクリプト

Twitterのフォロー数が多くなって、遡って読むことが多くなりました。それも一興ですが、本来、つぶやきのように流れていくのがTwitter。遡って読まなければいいじゃんと言われたらそれまでですが、それでいい情報を逃すのももったいないので、読み上げスクリプトを書きました。Mac OS専用です。(すいません。)

# -*- coding: utf-8 -*-
#
# Murmur tweets
# Author: ICHIKAWA, Yuji
# Copyright (C) 2012 ICHIKAWA, Yuji (New 3 Rs) All rights reserved.

require 'rubygems'
require 'tweetstream'

# initialize

# http://mitukiii.jp/2012/06/04/face-character-regexp/
TEXT = 'a-zA-Z0-9ぁ-ヶ亜-�a-zA-Z'
TEXT_PATTERN = /[#{TEXT}]/
NOT_TEXT_PATTERN = /[^#{TEXT}]/
FACE_PATTERN = /(#{NOT_TEXT_PATTERN}*[\(](?:(?!#{TEXT_PATTERN}{3,}).){2,}[\)]#{NOT_TEXT_PATTERN}*)/

LDIG_DIR = 'XXX' # ldigの絶対パスを入れて下さい。

voices = {
    ja: ['Kyoko'],
    cs: ['Zuzana'],
    da: ['Ida'],
    de: ['Anna', 'Steffi', 'Yannick'],
    en: ['Agnes', 'Kathy', 'Princess', 'Vicki', 'Victoria', 'Alex', 'Bruce', 'Fred', 'Junior', 'Ralph'],
    es: ['Diego', 'Monica'],
    fi: ['Mikko'],
    fr: ['Audrey', 'Sebastien', 'Thomas', 'Virginie'],
    id: ['Damayanti'],
    it: ['Alice', 'Paolo', 'Silvia'],
    nl: ['Claire', 'Xander'],
    no: ['Stine'],
    pl: ['Ageta'],
    pt: ['Joana'],
    ro: ['Simona'],
    sv: ['Alva', 'Oskar'],
    tr: ['Aylin'],
    vi: [],
    ar: ['Maged'],
    el: ['Alexandros', 'Melina'],
    sk: ['Laura'],
    th: ['Narisa'],
    no: ['Stine'],
    hu: ['Eszter'],
    hi: ['Lekha'],
    ro: ['Milena'],
    zh: ['Ting-Ting'],
    :"zh-min-nan" => ['Ya-Ling'],
    ko: ['Narae', 'Yuna']
}

TweetStream.configure do |config|
    config.consumer_key = ENV['CONSUMER_KEY']
    config.consumer_secret = ENV['CONSUMER_SECRET']
    config.oauth_token = ENV['ACCESS_TOKEN']
    config.oauth_token_secret = ENV['ACCESS_TOKEN_SECRET']
    config.auth_method = :oauth
end


TweetStream::Client.new.sample do |status|
# TweetStream::Client.new.userstream do |status|
    next if status.text.include? 'http:'
    text = CGI.unescapeHTML status.text.gsub(/RT .*|@\w+|#\S+/, '')
    if text =~ /[\p{hiragana}\p{katakana}]/
        lang = :ja
        text.gsub!(/[!w!〜w?]/, ' ')
        text.gsub!(FACE_PATTERN, ' ')
    else
        result = `#{LDIG_DIR}/ldig.py -m #{LDIG_DIR}/model.latin ./tweet.txt 2>/dev/null`
        if result =~ /^\t(\w+)/
            lang = $1.to_sym
        end
    end
    File.open('./tweet.txt', 'w') do |f|
        f.write text
    end
    puts text
    voice = voices[lang]
    `say #{if lang == :ja then '-r 260' end} -v #{voice[rand(voice.length)]} "#{text}"` if voice and not voice.empty?
end
  • TwitterのOAuthトークンが必要です。
  • 自分のTLではなくてサンプルストリームを使っていたら、言語判定をして音声を選びたくなりました。言語判定は、Language Detection with Infinity-Gramを利用させていただきました。
  • インストールしていない言語は無視されます。言語別の音声は「システム環境設定…」=>「音声入力と読み上げ」=>「テキスト読み上げ」=>「システムの声」=>「カスタマイズ…」で選択してインストールしてください。
  • 顔文字判定にはhttp://mitukiii.jp/2012/06/04/face-character-regexp/を利用させていただきました。