FreeTTSを使ってJavaプログラムで音声合成する

 

早稲田大学 人間科学部 菊池英明
 

(2003/11/17) 公開(プログラミングII)
(2005/01/24) HTMLに変換

 

■音声合成アプリケーションの作成

ここでは「音声合成」を使ったアプリケーションプログラムを作ってみましょう。  

Sunが、この「音声合成」や「音声認識」などをJavaプログラムから利用するために、"Java Speech API"というアプリケーションプログラムインタフェース(アプリケーションプログラム作成用に用意されたインタフェース(この場合、クラス))を用意しています。
  (参考:http://java.sun.com/products/java-media/speech/
 

この中に、TTSを行うためのクラス群があります。
  (参考:http://freetts.sourceforge.net/docs/index.php

これを使って上に説明したTTSのプログラムを作ります。
まずは、お手本のプログラムをダウンロードして、デモを実行してみましょう。
  (参考:http://freetts.sourceforge.net/docs/index.php#what_is_freetts
 

□FreeTTSのインストールとデモ(JTime)の実行
   このデモは、入力した時間の文字を音声合成により音声に変換して出力するものです。
          (参照: http://freetts.sourceforge.net/docs/api/index.html

 

 

□MyTTS.javaの作成

FreeTTSのデモディレクトリにある"JTime.java"を改変して、入力したテキストをTTSするプログラム"MyTTS.java"を作成しましょう。(FreeTTSディレクトリ下の"license.terms"に、ソースコード改変に関する注意事項が記されています。目を通してください。)

JTimeクラスは、標準入力(通常キーボードからの入力)より得た"HH:MM"という形式のテキストを、時間に直して読み上げるプログラムです。
JTimeクラスのmainメソッドを見てみましょう。

public static void main(String[] argv) {
    try {
        JTime jtime = new JTime(); //JTimeクラスのインスタンスを作成
        jtime.speakNow(); //(1)まず現在の時刻を発声
        jtime.interactiveMode(); //(2)入力された時刻を発声
        jtime.close(); //(3)JTimeクラスの音声合成準備を終了
    }catch (Exception e) {
        e.printStackTrace();
    }
    System.exit(0); //アプリケーションを終了
}

引数で指定された時間を表す文字列を、TimeUtilsクラスのtimeToStringメソッドで、言葉に変えています。このような便利なクラスもあります。この結果がnullでない、つまり変換が成功していれば、音声合成を担うSynthesizerクラスのインスタンスsynthesizerのspeakPlainTextメソッドで、その文字列を音声合成します。Synthesizerクラスの詳細については、下記のドキュメントを参照してください。
       (参考: http://freetts.sourceforge.net/docs/api/index.html )

さて、このプログラムを改変して、入力した単語・文を発声させるにはどうすればいいでしょうか?

まず、このプログラムを"MyTTS.java"の名前で保存して、プログラム内の"JTime"
クラスの部分を"MyTTS"に変えましょう。動作確認のために、この時点でJTime.javaと同じ動きがMyTTS.javaでも行われるか、見ておきましょう。

次に、timeToSpeechメソッドで、文字列を時間の形で音声合成する部分を、文字列そのまま音声合成するように変えましょう。そのほか、文字列の入力を求める部分など、適宜変更しておきましょう。具体的には、最低限以下のように改変すれば、文字列をそのまま音声合成するようになります。(プログラム内の"JTime"クラスの部分を"MyTTS"に変える必要はあります)
 

public void interactiveMode() {
    try {
        while (true) {
            String text;
            BufferedReader reader = new BufferedReader
                (new InputStreamReader(System.in));
            //System.out.print("Enter time (HH:MM): ");
            System.out.print("Enter text: ");
            System.out.flush();
            text = reader.readLine();
            if ((text == null) || (text.length() == 0)) {
                break;
            } else {
                timeToSpeech(text);
            }
        }
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}

//public void timeToSpeech(String time) {
public void timeToSpeech(String text) {
    //String theTime = TimeUtils.timeToString(time);
    //if (theTime != null) {
    if (text != null) {
        synthesizer.speakPlainText(text, null);
    } else {
        // throw new IllegalArgumentException("Bad time format");
        //System.out.println("Bad time format. The format should be HH:MM");
        System.out.println("Text is empty.");
    }
}

 

さて、入力した文字を音声にして出力するアプリケーションを作ることができましたか?
以上のように、こうした技術があらかじめ部品になっていれば、自分のプログラムの中で、いろいろなことができるようになります。部品を探していろいろなプログラムづくりに挑戦してみましょう。


 

Copyright ©2004 KIKUCHI Hideaki All rights reserved.