« Twitterクライアントをつくる6 | トップページ | Twitterクライアントをつくる8 »

2011年5月 5日 (木)

Twitterクライアントをつくる7

twitterクライアントとしての基本機能が取り敢えず形になった。いよいよ、やりたい事その1に着手できる。ではやりたい事その1。

  • 合成音声で読み上げる

合成音声を出力する仕組みを一から作るなんて途方も無い作業になるので当然既存の成果物を利用します、というかRubygemからいくつか調べておいたのさ。

Text To Speech 略してTTSってのがそういった機能を提供してくれるので、これをキーワードにしてgemを検索。幾つか引っかかってきましたが、そのなかでも日本語ではAquesTalk/Rubyというのがあるじゃあないですか。

サンプルを見ても簡単に使えそうだし。よし、これでgemいれてAquesTalkでしゃべらせればイケルぜ!ということで早速gemをインストールだ!

$ gem install aqtk -r
ERROR:  Could not find a valid gem 'aqtk' (>= 0), here is why:
          Found aqtk (0.1.5), but was for platform mswin32

プラットフォームが違うヨォォォォォゥぅぅぅッッ orz
あんまりだぁァァァァァッ orz

こちとらx86-mingw32プラットフォームなんだYO!!!
チキショー使えるようにしてやる!

ということでAquesTalkをmingw32で使えるようにするお話

では、早速AquesTalkのサイトへ飛んでみる。
ふむふむ、ダイナミックリンクライブラリってやつで提供されてるわけですな。

dllか・・・。10年くらい前に少しだけc++で使うコードを書いたことがあったようななかったような・・・。
何か嫌な記憶があった気がしたが、よく覚えていない。結局、最後まで完成しなかったんだよな、あの時。

なんか始める前からいきなりブルーな気分になってしまったが、ともかくRubyでdllを使うやり方を調べてみよう。

んで見つけたのがコレ。FFIというライブラリです。
うん、コレ良さそう。プラットフォーム対応も広そうだし、サンプルを見たらコレは簡単に使えそうだし(二度目)。ということで早速インストール。

$ gem install ffi -r

コピペでサンプルを実行してみるとあっさり動いた。おー、(・∀・)イイネ!!

よし、これを使うことに決定。評価版のAquesTalk2とAqKanji2Koeを落として準備完了。先ずはAPIの少ないAqKanji2Koeから実装だ。

attach_function 'AqKanji2Koe_Create', [ :string, :pointer ], :pointer

よし、呼び出してみよう

c:/Ruby192/lib/ruby/gems/1.9.1/gems/ffi-1.0.7-x86-mingw32/lib/ffi/library.rb:147:in `attach_function': Function 'AqKanji2Koe_Create' not found in [AqKanji2Koe.dll] (FFI::NotFoundError)
        from test_ffi.rb:10:in `<module:AqKanji2Koe>'

        from test_ffi.rb:4:in `<main>'

なんでだYO!!!
マニュアルをもう一度読みなおしても名前間違っていないし。
なんでカナ?といろいろ調べてみるが手がかりつかめず。仕方が無いのでdll viewrでdllを覗いてみるとAPIの名前が違うじゃあないか!

書きなおして、

attach_function 'AqKanji2Koe_Create', '_AqKanji2Koe_Create@8', [ :string, :pointer ], :pointer

再度実行したら問題無し。
他のdllも見てみたがAqKanji2Koeだけおかしなことになっていた。地雷を踏みまくりだな。
それともコレは一般的なdllの知識なのだろうか。

FFIの使い方がよく分からないが勘でなんとか書き上げてみた。動いているので問題なかろう。では使い方。

Aquestのサイトからwindows版AquesTalk2とAqKanji2Koeの評価版をダウンロード。system32あたりにdllをコピー。辞書ファイルやphontファイルはカレントディレクトリ下にコピー。
後は下のソースをrequireして

aqtk2 = Aqtk2::Aqtk2.new
aqtk2.say("ハロー、ワールド\(^o^)/")

プラットフォームの話をしていてナンだが、今のところ、AquesTalkや他のプラットフォームには対応していません。暫くしたら書こうと思います。

しかし、Rubyでmoduleを使ったコード初めて書いたけどこんなでいいのか。FFIもよくわかっていないし。dllの知識も。コールバックって何?。
それにしても、こんなにあっさりできてしまうなんてRubyはスゴいな。コードはそのうちgem化するかも。

(追記:2011/05 もう一度調べてみたらAquesTalkのライブラリは開発するだけでもお金払ってライセンス買わないといけないようなので辞めました。でも、個人利用だからOKかな。よく分からないので一応コードも消しときます。半年位前に調べたときはフリーだった気がしたのだけどなあ。勘違いかもしれんけど。Aquestのライセンスについてはココ を御覧ください)。

これでAquesTalk2はOKとして、このままだと日本語は問題ないが英語を読ませるとアルファベットとしてしか認識してくれないようなので(というかもしかしてAqKanji2Koeとかのフィルターの問題?この辺りの知識が怪しい)Helloだとエイチイーエルエルオーと読んでくれる。
英語のTTSも試してみるかな。espeakとかfestival ttsとか。日本語ではOpen Jtalkも試してみたいな。

|

« Twitterクライアントをつくる6 | トップページ | Twitterクライアントをつくる8 »

Twitterクライアントをつくる」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1201593/39873681

この記事へのトラックバック一覧です: Twitterクライアントをつくる7:

« Twitterクライアントをつくる6 | トップページ | Twitterクライアントをつくる8 »