FreeTTS で text to speech をやりたいが、日本語には対応していないっぽい。
自力でちょっと対応させてみる。

古池や蛙飛込む水の音

音声ファイル: 古池や蛙飛込む水の音

まぁまぁうまくいってる気がする。
ソースコードはこんな感じ。


import javax.sound.sampled.*;
import com.sun.speech.freetts.*;
import com.sun.speech.freetts.audio.*;
 
public class Basho {
 
  public static void main(String[] args) {
 
    // 古池や蛙飛びこむ水の音 by 松尾芭蕉
    String message = "Foo ru eat k yah, car was to be koh muh me zu no oh toe.";
 
    VoiceManager vm = VoiceManager.getInstance();
    
    Voice v = vm.getVoice("kevin16");
    v.setVolume(1.0f); // 0 to 1.0
    v.setRate(v.getRate() / 2.0f); // 半分の速さに
    v.setAudioPlayer(new SingleFileAudioPlayer("20071103_basho", AudioFileFormat.Type.WAVE));
 
    v.allocate();
    v.speak(message);
    v.deallocate();
    v.getAudioPlayer().close();
  }
 
}

かなり無理矢理だが、けっこういいかも。
昔、教えてもらったフレーズは "Full in care, car was to become Ms. Note." だったが、これはうまく発音してくれなかったので、良い発音になるようにチューニングした(^_^;

日本語文を発音用英文へ変換

それなりに汎用化してみた。

音声ファイル:
なつくさや つわものどもが ゆめのあと
あらうみや さどによこたう あまのがわ
このねこはとてもかわいい。This cat is so cute.
この pen は very いいかんじです Yo!
あいうえお かきくけこ さしすせそ......

ソースコードはこんなの。力技。
文字列を渡すとそれなりの発音用英文に変換してくれる。
とりあえず、ひらがなの一部分のみ対応。


import java.util.*;
import javax.sound.sampled.*;
import com.sun.speech.freetts.*;
import com.sun.speech.freetts.audio.*;
 
public class BashoTranslator {
 
  public static void main(String[] s){
    
    String[] message = {
      "なつくさや つわものどもが ゆめのあと",
      "あらうみや さどによこたう あまのがわ",
      "このねこはとてもかわいい。This cat is so cute.",
      "この pen は very いいかんじです Yo!",
      "あいうえお かきくけこ さしすせそ たちつてと なにぬねの はひふへほ まみむめも や ゆ よ らりるれろ わ ゐ ゑ を ん がぎぐげご ざじずぜぞ だぢづでど ばびぶべぼ ぱぴぷぺぽ",
    };
    
    for(int i=0; i<message.length; i++){
    
      String src = message[i];
      System.out.println(src);
      
      BashoTranslator bt = new BashoTranslator();
      String dst = bt.translate(src);
      System.out.println(dst);
      
      VoiceManager vm = VoiceManager.getInstance();
      Voice v = vm.getVoice("kevin16");
      v.setVolume(1.0f); // 0 to 1.0
      v.setRate(v.getRate() / 2.0f); // ちょっと遅く
      v.setAudioPlayer(new SingleFileAudioPlayer("20071103_bashot_" + i, AudioFileFormat.Type.WAVE));
      v.allocate();
      v.speak(dst);
      v.deallocate();
      v.getAudioPlayer().close();
    }
  }
  
  private static final Map<String, String> m;
  
  static {
    m = new HashMap<String, String>();
    m.put("あ","ah");
    m.put("い","e");
    m.put("う","wool");
    m.put("え","eay");
    m.put("お","oh");
    m.put("か","car");
    m.put("き","key");
    m.put("く","ku");
    m.put("け","k");
    m.put("こ","koh");
    m.put("さ","sar");
    m.put("し","c");
    m.put("す","sue");
    m.put("せ","say");
    m.put("そ","so");
    m.put("た","tar");
    m.put("ち","tick");
    m.put("つ","two");
    m.put("て","tea");
    m.put("と","toe");
    m.put("な","na");
    m.put("に","need");
    m.put("ぬ","nue");
    m.put("ね","ney");
    m.put("の","no");
    m.put("は","ha");
    m.put("ひ","he");
    m.put("ふ","foo");
    m.put("へ","hey");
    m.put("ほ","ho");
    m.put("ま","ma");
    m.put("み","me");
    m.put("む","muh");
    m.put("め","may");
    m.put("も","mo");
    m.put("や","yah");
    m.put("ゆ","you");
    m.put("よ","yo");
    m.put("ら","lar");
    m.put("り","lee");
    m.put("る","lu");
    m.put("れ","ray");
    m.put("ろ","low");
    m.put("わ","were");
    m.put("ゐ","e");
    m.put("ゑ","eay");
    m.put("を","war");
    m.put("ん","unn");
    m.put("が","ga");
    m.put("ぎ","gee");
    m.put("ぐ","goo");
    m.put("げ","gay");
    m.put("ご","go");
    m.put("ざ","the");
    m.put("じ","zee");
    m.put("ず","zu");
    m.put("ぜ","zey");
    m.put("ぞ","zo");
    m.put("だ","da");
    m.put("ぢ","zi");
    m.put("づ","zu");
    m.put("で","dead");
    m.put("ど","doh");
    m.put("ば","ba");
    m.put("び","be");
    m.put("ぶ","boo");
    m.put("べ","bay");
    m.put("ぼ","bo");
    m.put("ぱ","pa");
    m.put("ぴ","pee");
    m.put("ぷ","pooh");
    m.put("ぺ","pay");
    m.put("ぽ","po");
  }  
  
  public BashoTranslator(){
    
  }
  
  public String translate(String s){
    
    StringBuffer dst = new StringBuffer();
    for(int i=0; i<s.length(); i++){
      char c = s.charAt(i);
      if(c < 128){
        // 英語扱い
        dst.append(c);
      }else{
        // 日本語扱い
        String d = m.get("" + c);
        if(d != null){
          dst.append(d);
        }
        dst.append(" ");
      }
    }
    return dst.toString();
  }
  
}

コンソール出力結果:


なつくさや つわものどもが ゆめのあと
na two ku sar yah  two were mo no doh mo ga  you may no ah toe 
Wrote synthesized speech to 20071103_bashot_0.wav
あらうみや さどによこたう あまのがわ
ah lar wool me yah  sar doh need yo koh tar wool  ah ma no ga were 
Wrote synthesized speech to 20071103_bashot_1.wav
このねこはとてもかわいい。This cat is so cute.
koh no ney koh ha toe tea mo car were e e  This cat is so cute.
Wrote synthesized speech to 20071103_bashot_2.wav
この pen は very いいかんじです Yo!
koh no  pen ha  very e e car unn zee dead sue  Yo!
Wrote synthesized speech to 20071103_bashot_3.wav
あいうえお かきくけこ さしすせそ たちつてと なにぬねの はひふへほ まみむめも や ゆ よ らりるれろ わ ゐ ゑ を ん がぎぐげご ざじずぜぞ だぢづでど ばびぶべぼ ぱぴぷぺぽ
ah e wool eay oh  car key ku k koh  sar c sue say so  tar tick two tea toe  na need nue ney no  ha he foo hey ho  ma me muh may mo  yah  you  yo  lar lee lu ray low  were  e  eay  war  unn  ga gee goo gay go  the zee zu zey zo  da zi zu dead doh  ba be boo bay bo  pa pee pooh pay po 
Wrote synthesized speech to 20071103_bashot_4.wav

「みゃ」とか「っ」とか漢字とか対応すれば、それなりにはなるかも。

tags: zlashdot Text2Speech FreeTTS Java Text2Speech

Posted by NI-Lab. (@nilab)