漢なら日本語を喋れ!

郵便受けをポーリングしたら、郵政公社からの事務連絡が届いていた。不在時の配達通知かと 思って見ると、この間田舎に送った時計をちゃんとお届けしましたと言う報告だった。

発送した翌日には、母から「いいもの贈ってもらってありがとう」と、電話を貰っていたので 随分と、通知が間延びした感じを受けた。やっぱり、サーフェースメールは、電子には勝てない か。でも、雨の中でも風の中でも、もくもくと郵便配達をしてる人を思うと、贅沢な 愚痴になってしまい、申し訳ない。

電子メールは早く着くのが当たり前と思っていると、足元をすくわれる事がある。某所にこちら からメールすると即座に届くんだけど、反対方向からのメールは、何故か一晩かかってやってくる。 丁度その時は、急いでいたので、先方の管理者に連絡を取ってもらったら、直ぐにメールが 流れてきた。きっと、何かのトラブルが有ったんだろうと、気を許していたんだ。

しかし、その後も、何度も同様な事があり、某所からの返信を早急には期待しない事にした。 勿論、返信する人の怠慢でない事は、ヘッダーを見て確認済み。どこでメールが滞留してる かと言うと、先方のメールサーバー。今時、uucpなんですかねぇ。だったら、希少だなあ。

日本語の読み上げ(Windows編)

やっぱり、漢なら日本語を喋って欲しいぞ。幾らコンピュータと言えども。と言う事で、再び 日本語を喋るソフトを探してみた。

有料版&&Windows用なら、山程ある。けど、ご自由にお使い下さいってのは、なかなか無いのね。 こんな状況だけど、AquesTalk - テキスト音声合成ミドルウェア に ライブラリーをfreeで公開されているのを見つけた。有償版では、Linux版とかMac版も有った。

面白そうなので、どんなものか、ちょいと試したみた。 今何時なんてのを綺麗に読み上げてくれるし、羊が一匹、羊が二匹 ... メリーさんの羊 ... 羊が三十匹 ... 羊が転んだ なんてのも、上手に言ってくれる。こりゃ、楽しいわい。

でも、サンプルプログラムは、VC++ だったので、こりゃ、退散ですかね。 それに、もう一つの難点は、独自の記法でデータを渡してあげなければならない点。漢字から ひらがなの記法にするのは、自分でやらなければならない。ちょいと面倒そう。

日本語の読み上げ(Unix編)

unix用のものは、希少で、やっと一つ見つけた。

yomi WWW page (in Japanese) 新潟工科大学だから、NIT になるのかな。MITとお隣さんみたいで、カッコいいなあ。

早速頂いてきて、指示書通り、make; sudo make install 。 Makefileのデフォが、FreeBSDと 言うのには、思わず、「よう、ご同輩」と、声をかけたくなるほど、嬉しい。入れたマシンは 例によって、FreeBSD 7.2 on VMWARE on WindowsXP だ。

kakasiなんて懐かしいです。昔、お世話になりました。ああ、そうか、AquesTalkでひらがなが 要求される場合にも、kakasi+α で、何とかなりそうね。kakasiのWindows版が有ればですが。

早速、鳴らして、じゃなくて、喋らせてみよう。(例によって、ja_JP.eucJP上で)

[sakae@nil ~]$ yomi > say.man
[sakae@nil ~]$ yomi say.man
yomi version 0.16
File [null] is not found.
File [O] is not found.
 .....
   -h: このメッセージ
File [null] is not found.
File [i] is not found.

あら、鳴らないよ。再帰が失敗したか、なんてのは冗談で、同ページから落としてきた kashiwazaki-2.au を、/dev/audio に食わせてみると、ちゃんと 「今日の柏崎...」って 喋るんで、ハードやOSの不良では無さそうだ。さあ、debugモードへ突入しまーす。

[sakae@nil ~]$ yomi -d say.man > out
yomi version 0.16
Usage: yomi [options] [file1] ([file2] ...)
  .....
/usr/local/bin/auconn -r   -Pr0 Y O M I null  V E R S I O N null  re e te n 1 6
null    > /dev/audio
/usr/local/bin/auconn -r   -Pr0 U S A G E ko ro n null  Y O M I null  da i ka tt
su ko O P T I O N S da i ka ttsu ko to zi ru null  da i ka ttsu ko F I L E 1 da
i ka ttsu ko to zi ru null  sho u ka ttsu ko da i ka ttsu ko F I L E 2 da i ka t
tsu ko to zi ru null  do ttsu to do ttsu to do ttsu to sho u ka ttsu ko to zi ru
 null    > /dev/audio
   .....

鳴るほど!! kakasiとyomiで、音のフォントに変換して、それを、auconn で、catし、/dev/audioへ 送り込んでいるんだ。

[sakae@nil ~]$ csh -f out
File [null] is not found.
File [O] is not found.
 ....
[sakae@nil ~]$ sh out
File [null] is not found.
File [O] is not found.
 ....

csh から起動しても sh から起動しても、鳴らないなあ。

実験は続くよ

だったら、ちょいと実験してみる。音のフォントを拾って、組み立ててみる。

[sakae@nil /usr/local/share/yomi/data/au]$ auconn ko.au ba.au ya.au si.au de.au su.au >~/koba.au
File [null] is not found.
File [ko.au] is not found.
[sakae@nil /usr/local/share/yomi/data/au]$ ls -l ~/koba.au
-rw-r--r--  1 sakae  kuma  0  7 11 10:28 /home/sakae/koba.au

サイズがZERO じゃ、鳴るはず無いよね。

[sakae@nil /usr/local/share/yomi/data/au]$ auconn ./ko.au ./ba.au ./ya.au ./si.au ./de.au ./su.au >~/koba.au
File [null] is not found.
[sakae@nil ~]$ ls -l koba.au
-rw-r--r--  1 sakae  kuma  9823  7 11 10:29 koba.au
[sakae@nil ~]$ cat koba.au > /dev/audio

こちらは鳴ったぞ。何か、フォントの場所を正しく見つけられないのかな? デフォでインストールしたはずだから、

[sakae@nil ~]$ cat /usr/local/share/yomi/lib/auconnrc
# au data file の path list
# shige
# 09/01 2000
# .auconnrc
#
# $Id: auconnrc.temp,v 1.5 2001-11-02 12:26:20+09 shige Exp $
#
path    /usr/local/share/yomi/data/au
path    /usr/local/share/yomi/data/misc
path    :

ext     .au:.AU:

nullfile    null

なにか、音フォントの設定が旨くいって無いっぽい。こういうのは、専門家にまかせよう。

取り合えずの回避策

先の実験から、フォントを拾いあげてそれを組み立てれば良い事が分かったので、そんな スクリプトをでっち上げてみる。このスクリプトの入力は、yomi -d text > out した、out ファイルを使うものとしてます。まあ、実験ですから。。。旨く言ったら、パイプで 受けるようにするだけです。

infile = 'out'
fontdir= '/usr/local/share/yomi/data/au'

def say(s)                     # say a line
  fs = s.split(/\s+/)
  sp = fs.size - 3
  com = ["auconn"]
  fs[3 .. sp].each do |f|       # scan sound font only
    com << "./#{f}.au"          # add sount font
  end
  com << ">" << "/dev/audio"    
  system com.join(" ")          # make command line and exec it
end

def main(infile, fontdir)
  all = File.readlines(infile)
  Dir.chdir( fontdir)
  all.each do |al|
    say(al)
  end
end

main(infile, fontdir)

久しぶりに、スクリプトを書いたよ。後は、yomi-lib.plを改造して、カッコ、コッカと 発声するようにすればいいか。perlは、超久しぶりだなあ。

謝辞

こういう、楽しいソフトを公開してくださって感謝します。また、同ページの階層を一つ 上がったUNIXのページにある gnuplotも、非常に貴重なページで、ためになります。ありがとうございました。