umjammer です、 社内の Tech ML に同僚が Java Native Access 面白そうだよと投稿したのを見て、私も Java Native Interface (JNI) はよく触る方なので興味をそそられました。試してみようと今までに JNI で書いた物を JNA に適用することにしました。 題材としては、日本語をしゃべってくれる AquesTalk を JNI でラップしたライブラリを以前作ったことがあったので、それを使用します。 AquesTalk は C のライブラリでヘッダーファイルは以下のように定義されています。 C Header http://vavi-sound.googlecode.com/svn/trunk/vavi-speech/etc/include/AquesTalkDa.h それを JNA の方法にのっとって Java のクラスに変換します。 JNA http://vavi-sound.googlecode.com/svn/trunk/vavi-speech/src/main/java/vavi/speech/aquestalk/jna/AquesTalkDa.java 以前書いた JNI だとこんな感じでした。 JNI http://code.google.com/p/vavi-sound/source/browse/trunk/vavi-speech/src/main/jni/win32/AquesTalkWrapper.c AquesTalk のライブラリが簡単なメソッドの構造なので JNA に適用するのは簡単でした。 JNI と違い C のコードを一切書かなくて済むので楽ですね。 できたところで日本語をしゃべらせようとしましたが、AquesTalk は単語辞書を持っていませんので、漢字を読むことができません。ついでなので形態素解析を使用して漢字も読めるようにしてみました。さらについでに Java Speech API 1.0 にも対応させてみました。形態素解析は sen を使用しました。 JSPAI + 形態素解析 http://code.google.com/p/vavi-sound/source/browse/trunk/vavi-speech/src/main/java/vavi/speech/aquestalk/jsapi/AquesTalkSynthesizer.java 今までのコードはこちら JNA 化している最中に気づいたのですが AquesTalk ってあれの中の人だったんですね。

    synthesizer.speakPlainText("ゆっくりしていってね", null);
    synthesizer.speakPlainText("漢字も読めるよ", null);

AquesTalk は Windows 用を使用したのですが、実は開発は Mac で行っています。wine で AquesTalk 動かせちゃいます。 最後に、 調べていくうちに JNAerator なるものを見つけました。C のヘッダーファイルを食わせて JNA に変換してくれるものみたいです。複雑な C のコードもこれだと楽ができるかもしれません。 AquesTalk2 なるものもリリースされています。Mac や iPhone のライブラリまであります。音声も自分で作れるみたいです。いろいろ楽しいことになりそうです。