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

sifue's blog

プログラマな二児の父の日常

JavaFXとRxJavaの勉強のためにSocket通信対応したMac用棒読みちゃんクローンを作ってみた

sifue/bouyomisan · GitHub

あけましておめでとうございます。

丁度冬休みということもあって、Mac用の棒読みちゃんクローンを作ってみました。

インストールバイナリもソースコード自体もgithubで配布中。あと、ソースコードはMITライセンスです。 

f:id:sifue:20150104003203p:plain

f:id:sifue:20150104003205p:plain

見た目はこんな感じ。

使ったライブラリとしては、

  • JavaFX (Java8からデフォルトになったJavaの新UI)
  • RxJava (ReactiveExtensionsのJava版)
  • gradleのmacAppBundle (Mac用の.appファイルを作ってくるバンドル)
  • kuromoji (日本語形態素解析ライブラリ)
  • Netty 4系 (高速なTCP通信が可能なサーバー)

実装した機能としては

  • ニコニコの読み上げ文化などに対応した、単語や正規表現による辞書置換
  • 漢字のかなへの読み上げの変換
  • Socket通信を利用した読み上げ
  • 棒読みちゃんとおなじAquesTalkを利用するためのUIを提供

です。過去読み上げしてくれるMac用のアプリはいくつかあったのですが、棒読みちゃん互換のSocket通信読み上げに対応したものがなかったので自分で作ったというのが軽易です。

 

ここからは開発の感想です。ここ1年以上ずっとScala書いてるので久しぶりのJavaプログラミングはいろいろ懐かしいものがありました。ただラムダやStreamを使おうとしてみるもののイマイチぱっとしなかったりという感じで、そこはScalaの方が圧倒的に便利です。

まずJavaFXについてです。過去Swing、SWTと触ってきましたが何が特に非同期処理の部分のところが専用のTaskやpropertyのbindを使わなきゃいけなくなっていて結構面倒くさい感じになっています。その他の部分はUIのAPIはかなり素直な作りになっており、初心者にはわかりやすい仕組みになっているのではないかと思います。

個人的に何がすごかったかというと、JavaFX Scene Builderです。こいつが使いやすすぎる。これのためにJavaFXを使ってもいいといっても過言ではない感じでした。fxmlをIDEで協調しながら編集した際にも問題なく利用することができました。

f:id:sifue:20150104004024p:plain

あと、RxJava。元々いろいろ情報は知っていたのですが柔軟なイベントハンドリングをするためのライブラリ。オブザーバーパターンでさえ、様々な実装を用意してくれています。非常に便利なことができるライブラリですが、正直イベントが鬼のように飛びまくるようなUIでは便利ですが、ちょっとしたアプリぐらいであれば、間違った使い方をしてしまうのが少しこわいなと思う所あります。

個人的には、Subjectが様々なバリエーションがあって感銘をうけました。


java - How can PublishSubject and BehaviorSubject be unsubscribed from? - Stack Overflow

 

GradleのmacAppBundleは、Oracleが.appファイルの作り方を紹介してくれているやつをそのままプラグイン化してくれたもの。kuromojiやNettyは過去何度か形態素解析TCP/UDPサーバーを作ってみるということをやっていたので、特に問題なく利用することができました。どちらもバージョンが上がってどんどん洗練されている気がします。

 

このMac用の棒読みちゃん、棒読みさんを今後も少しずついじりながら機能拡張していきたい所です。

 

追伸

この冬休みずっとFF14とダークソウル2をやっています。真成2層練習パーティが中々集まらないそんなTitan鯖。