sayコマンドで日本語を読み上げる

Macのsayコマンドはローマ字しか読めないので、
MeCabで漢字をカタカナにして、カタカナを全角半角,ひらがなカタカナの変換 - ロバの耳でひらがなに変換、さらにromkanでひらがなをローマ字に変換して
ようやくsayに読ませると日本語を読み上げれる。


……発音微妙だったけど


MeCabは入ってるからいいとして、romkanのインストール
http://0xcc.net/ruby-romkan/ から

wget http://0xcc.net/ruby-romkan/ruby-romkan-0.4.tar.gz
tar -zxvf ruby-romkan-0.4.tar.gz

中身からromkan.en.rd romkan.ja.rd romkan.rbをコピーして使う。



同じディレクトリにプログラムを書く
kana-say.rb

#!/usr/bin/env ruby
require 'rubygems'
require 'jcode'
require 'MeCab'
require 'romkan'
require 'kconv'
mecab = MeCab::Tagger.new('-Ochasen')

ARGV.each{ |arg|
  $KCODE = 'u'
  kana = ''
  parsed = mecab.parse(arg)
  parsed.each{|ps|
    w = ps.split(/\t/)[1] # 読み仮名だけ抜き出す
    kana += ' ' + w if w != nil
  }
  puts '読み:' + kana
  
  
  hiragana = kana.tr('a-zA-Zァ-ン0-9', 'a-zA-Zぁ-ん0-9') # ひらがなに変換
  puts 'ひらがな:' + hiragana
  
  $KCODE = 'e'
  roma = ''
  hiragana.toeuc.to_roma.split('').each{|c| # ローマ字に変換
    roma += c if c =~ /[\w\s]/ # 記号を消す
  }
  
  puts 'say:' + roma.toutf8
  `say #{roma.toutf8}` # 読み上げ
}

途中で文字コードを変えまくっているのは、MeCabの辞書はutf8なのにromkanの辞書はeuc-jpだから。


使ってみる

% ruby kana-say.rb 地元でお天気母さんと呼ばれている女性です
読み: ジモト デ オ テンキ カアサン ト ヨバ レ テ イル ジョセイ デス
ひらがな: じもと で お てんき かあさん と よば れ て いる じょせい です
say: jimoto de o tenki kaasan to yoba re te iru josei desu
% ruby kana-say.rb この日、田んぼにお天気母さんこと鈴木文子の姿がありました
読み: コノ ヒ 、 タンボ ニ オ テンキ カアサン コト スズキ アヤコ ノ スガタ ガ アリ マシ タ
ひらがな: この ひ 、 たんぼ に お てんき かあさん こと すずき あやこ の すがた が あり まし た
say: kono hi 、 tanbo ni o tenki kaasan koto suzuki ayako no sugata ga ari mashi ta
% ruby kana-say.rb 今日は2008年12月30日です
読み: コンニチ ハ 2008 ネン 12 ガツ 30 ニチ デス
ひらがな: こんにち は 2008 ねん 12 がつ 30 にち です
say: konnichi ha 2008 nen 12 gatsu 30 nichi desu

スペースを空けているのは、開けないと数字が混ざっている時に読みがおかしくなる為。
数字だけ英語読みになってかっこいい。駄目だこれは