Master -
Yucchi
Since - 2012/05/05
Javaで英文読み上げ
プログラムを実行して効果音が出るのは当り前の時代です。
そこで一歩進んで音声を出すことはできないかと思い調べたところJava Speech API の実装としとしてFreeTTSがあるじゃないか!
今回はテキストエリアに入力された英文を読みあげるだけの単純なものを作ることにした。
Java Speech API を利用する場合、speech.properties ファイルを作成してユーザーのホームディレクトリもしくはJREのlibディレクトリに配置しなければいけない。
これはプログラムを実行するユーザーにとっては面倒なことなのでなくても動くように回避する。
では、いつものように NetBeans を使ってお気楽にいきましょう。
[ File ] > [ New Project... ] を選択
そして [ categories: ] に Java を選択し、[ Project: ] で Java Application を、そして [ Next > ] ボタンを押します。
設定項目を以下のようにして [ Finish ] ボタンを押します。
次に [ Projects ] で speakEnglish を右クリックして [ New ] > [ JFrame Form... ] を選択します。
New JFrame Form ウィンドウの設定項目を記入します。
そして [ Finsh ] ボタンを押します。
JFrame を選択し、[ Properties ] 画面を出します。
title を 英語しゃべるかも? に変更します。
JFrame の上に JPanel を置きます。
Palette より Panel をドラッグアンドドロップします。
同様に Palette より JButton , JTextArea , JLabel を JPanel の上に配置します。
それぞれコンポーネントを右クリックし、[ Properties ] 画面でプロパティ値を設定します。
おっと!
肝心なことを忘れていました。
下記のサイトよりFreeTTS をダウンロードします。
http://sourceforge.net/project/showfiles.php?group_id=42080
ダウンロードしたら lib ディレクトリの中にある jsapi.exe を実行します。(Windows環境)
するとライセンス文書を表示され同意した場合にだけ jsapi.jar ファイルが生成されます。
UNIX環境の場合は jsapi.sh を実行します。
lib ディレクトリの中にある jar ファイルを今回作成するアプリケーションに追加します。
プロジェクトを右クリックして [ Properties ] を選択します。
[ Categories: ] の [ Libraries ] を選択し、[ Add JAR/Folder ] ボタンを押します。
Build Projects on Classpath チェックボックスにチェックが入ってることを確認してください。
これにチェックが入っていると自動で classpath がセットされます。
また、自動生成される外部実行可能Jarファイルに格納されるMANIFESTファイルにも classpath がセットされます。
非常に便利な機能です。
先ほどダウンロードした FreeTTS の lib ディレクトリの中の jar ファイルを追加します。
必要でないものは追加しなくてOKです。
それではソースエディタで speakEnglish.java を開きます
そして下記のように変更します。
次に Synthesizer を
エラーが表示されました。
対処方法が親切に出ます。
適切なものを選択します。
** 参考 : Documentation FreeTTS 1.2 , Java Speech API (JSAPI) 1.0 **
適切なクラスをインポートしたのでエラーはなくなりました。
次にシンセサイザを作成します。
エラーだらけですね。
でも、さっきと同じで必要なクラスをインポートするだけです。
本当に楽ですね。(^^)
ちゃんと適切なクラスがインポートされました。
英文を読みあげるメソッドを追加します。
メインメソッドにGUI画面を生成するコードを記述します。
( このコードは間違ってます。後でわかります )
public static void main(String[] args) {
speakEnglish_View frame2 = new speakEnglish
_View();frame2.pack();
frame2.setVisible(true);
frame2.createSynthesizer();
}
エラーが出てしまいましたが後回しにします。
speakEnglish_View クラスを抽象クラスにします。
抽象クラスの特徴はまずインスタンス化できないということです。
つまり拡張クラス化されることに存在意義があります。
( 下記のコードは間違ってます。 )
GUI ビルダー画面に切りかえて各コンポーネントのイベントを設定します。
jButton1 を右クリックして [ Event ] > [ Action ] > [ actionPerformed ] を選択します。
ソースコードエディタが開いてここに処理コードを記入するよううながします。
下記のように処理コードを記入します。
ボタンが押されたらテキストエリアの文字列を読み上げる処理です。
同様に jButton2 も処理コードを記入します。
ボタンが押されたらテキストエリアをクリアするだけの処理です。
それではビルドしてみましょう。
プロジェクトを右クリックで [ Build ] をクリックします。
出力ウィンドウにエラーが表示されました。
エラーが指摘されているところをチェックするとクラスの宣言が間違ってました(^^;
これを下記のように修正して再ビルドします。
あちゃー・・ またエラーです。
でも大丈夫です。
ちゃんとエラーの場所と内容を教えてくれます。
どうやら抽象クラスをインスタンス化しようとしてました。
これを下記のように修正すればOKですね。
これで全て解決するはずです。
三度目の正直とやらで再ビルド
ちゃんとビルドできました。(^^)
それではプログラムを動かして確認してみましょう。
プロジェクトを右クリック、[ Run ] をクリックします。
期待通りにアプリケーションが立ち上がりました。
テキストエリアに Hello World. と入力して、[ 英語しゃべって! ] ボタンを押します。
おお!ちゃんとしゃべってくれます!
テキストエリアのクリアも [ クリア ] ボタンでできるし無事完成です。
英語しゃべるかも?
英文を読み上げている音声の品質は私にはなんとも言えません。
だって英語話せないし、よく解りませんから。
でも、機械が言葉をしゃべるなんて素敵なことですよね(^^)