torutkのブログ

ソフトウェア・エンジニアのブログ

Javaでテキストをしゃべらせる

はじめに

システムがカットオーバーされると、それまで運用してきた旧システムは撤去することとなります(基幹系では新システムがトラブルになった場合の備えとして残しておくことがあるかもしれません)。情報システム関連の仕事には、この旧システムの撤去もあります。サーバーを収容するラックは耐震上がっちり設置されているので、これを取り外して普通の床面に戻すのは工事が必要で、取り外したものを運び出すには運送が必要です。このような作業はITエンジニアでは行えないので、それぞれ施工会社や輸送会社などにお願いすることとなります。そのためには見積もり、手配、現地の下調べなどのお仕事があります。

先々月に異動になった部署では、カットオーバーする新システムのインフラストラクチャーの見積もり、手配、据え付けなどを行うのですが、それに伴う旧システムの撤去も扱っていたのです。

というところで、ここしばらくこの見積もりのためにExcelと戯れ、いろいろな会社さんに見積もりをお願いするといったことをしています。まいった、門外漢度120%な仕事です。フルスタックエンジニアどころかフルライフサイクルエンジニア(造語)になってしまいそう( ;∀;)。

これまでずっとソフトウェア開発に携わり、社内でも勉強会を主催してソフトウェア技術の発信や啓蒙、などの活動をしてきたので、異動した部署や今の仕事の内容とは関わらず、ソフトウェア関係の質問をいろいろ聞かれます。こうした相談事には個人ベースで乗っていくのがエンジニアの姿と確信していますし、今の組織に所属し続けるとしてソフトウェア開発から縁が切れないようにするにも必要なことと思っています。で、今回は給湯室で「Javaでテキストをしゃべらせたいんだけど、英語でいいから」という相談が舞い込みました。

Javaのプログラムでテキストをしゃべらせたい

1998〜1999年ごろに、Javaでとあるシミュレーターを開発したときに、音声合成を実装していました。そのときは、Java Speech APIという音声認識・合成のためのAPIと、Java Speech APIを実装する音声認識・合成エンジン(このときはIBMのViaVoice)を使いました。まだJavaAPI標準を決めるJCPが設立される前なので、Java Speech APIにはJSR番号はありません。

さて、あれからもう17年がたっているのかぁ、今はどうなっているのだろう?と調べてみました。

まずAPIについて、Java Speech APIは健在で、いくつか実装系があるようです。
また、JSR 113: Java Speech API 2.0 という仕様改訂版が2009年にリリースされていました。

そこで、まず音声合成Java Speech API(1.0または2.0)の実装を探してみました。

Java Speech APIの実装系あれこれ

J.A.R.V.I.S.(Java-Speech-API)

https://github.com/lkuza2/java-speech-api
Googleサービスを使って音声認識・合成と翻訳までやってしまうという実装系です。マイクロフォンから音声をキャプチャしてWAVEファイルに変換、Google音声認識サービスを使ってテキスト化することと、テキストをGoogle音声合成サービスを使ってMP3にするなどの機能が用意されています。
インターネット接続が前提になると思われるので今回は対象外ですが、興味深いですね。
ライセンスはGPL3のようです。

TalkingJava SDK with Java Speech API implementation

http://www.cloudgarden.org/JSAPI/index.html
Windows OS上で、SAPI4/SAPI5互換の音声合成音声認識を行うとあります。
非商用利用は無償。2010-01-01 Ver.1.7.0リリース

SAPI(Speech API)とは、Microsoft音声認識・合成エンジンとそのAPIです。最近のWindows OSには標準で搭載されているようです。

FreeTTS

http://freetts.sourceforge.net/docs/index.php
音声合成の実装系です。音声認識はないようです。Javaで実装されており、クロスプラットフォームなライブラリです。しゃべる言語は英語だけの模様。旧Sun Microsystems社とカーネギーメロン大学の共同開発です。
BSDライセンス。2009-03-09 Ver.1.2.2リリース

The Festival Speech Synthesis System

http://www.cstr.ed.ac.uk/projects/festival/
C++で実装されたエンジンをJavaから呼び出します。C++は、GCC 4でビルドするのでWindowsの場合Cygwinを使うとあります。
X11ライセンス(商用利用OK)。2015-01-06 Ver.2.4リリース

Java Speech API以外の情報メモ

Webサービスでの音声認識・合成

メジャーなものでは、GoogleIBM Watsonの2つが音声認識・合成のサービスを提供しています。

WindowsのSAPI5

sapi.dllを介して実現します。

次のブログで紹介されている、2行のWSHスクリプトを記述して実行すると音声合成が簡単に実現できました。
Windowsバッチで,手軽に日本語テキストを自動読み上げ(Text To Speech)する方法 …WSHでSAPIやSpeech.SpVoiceを使う音声合成の手順とサンプルコード - 主に言語とシステム開発に関して

Javaから利用するなら、COMブリッジ(com4j)を使うと簡単ではないかと思います。ただし、Windowsでしか動かないプログラムになってしまうので、Windowsのみでよい!という戦略があるときのみの対処です。

Javaからしゃべらせてみる

英語でしゃべるのでよく、音声認識はなくてもよく、インターネット接続環境が不要で、商用利用可能なライブラリとなると、FreeTTSが今のところ候補になります。

参考になりそうな記事・ブログ等を調べました。

FreeTTSを使ってJavaでしゃべるプログラムの作成は、次のWikiに書いています(現在執筆中)。

FreeTTSを使ってJavaプログラムからしゃべらせる - ソフトウェアエンジニアリング - Torutk