- MaryTTS,主要面向使用西文的语音合成。
- 最新版
5.1.2,支持德语,西班牙语,美式英语,法语,意大利语,瑞典语,俄语,土耳其语和泰卢固语的语音合成。- 本记录使用的是
5.1版- 最新版的运行环境是
jdk7+,而5.1版则是jdk6也行
java进行本地的文本转语音的合成,不依赖网络(类似讯飞在线服务的方式)。综上所述,最后找到的就这个开源库,但是我在阅读如何使用的时候,由于蹩脚的英语,遇到了几个坑,最好好在还是解决了如何使用这个燃眉之急,所以这里就做个记录。
5.1版的,所以在github上的relese标签中,下载相应的版本的源代码。bin目录,执行marytts-component-installer脚本,linux或osx执行sh结尾的,win执行bat结尾的。这个shell打开了下载语言和语音工具软件。展开的界面中,左边是语言,右边是语音。
hsmm格式的,它的大小在1~2M左右,还一种是unit-selection格式,它的大小会在100M以上。具体的使用方法下面会展开项目依赖的jar:
maryTTS 的jar包极其依赖
语言包
支持该语言的语音包
项目结构搭建
拷贝下载的lib目录作为其项目的环境依赖,如果通过工具下载额外的语言和语音文件,其也会自动打包成jar格式的文件并自动保存到lib下。
lib的目录结构一般就这样 
对于unit-selection,可以查看下lib下,是否存在Voices的文件夹,如果有的话需要配置环境变量 mary.base 指向 lib的父文件夹
MaryInterface接口进行功能的使用。一般本地使用的话,使用LocalMaryInterface 实现类。MaryInterface 可用于指定声音文件,或则根据语言自动加载相应的声音文件。demo.java的使用package name.icoder.marytts;
import marytts.LocalMaryInterface;
import marytts.MaryInterface;
import marytts.exceptions.MaryConfigurationException;
import marytts.exceptions.SynthesisException;
import marytts.modules.synthesis.Voice;
import marytts.util.data.audio.AudioPlayer;
import javax.sound.sampled.AudioInputStream;
import java.util.Locale;
import java.util.Set;
/**
Created by evilgod528 on 15/3/30.
*/
public class demo {
private static MaryInterface marytts;
private static AudioPlayer player;
static {
try {
System.setProperty("mary.base","/Users/*****/Documents/build/idea/everyIT/maryTTS");
marytts = new LocalMaryInterface();
Set<String> voices = marytts.getAvailableVoices();
marytts.setVoice(voices.iterator().next());
player = new AudioPlayer();
} catch (MaryConfigurationException e) {
e.printStackTrace();
}
}
//不能连续的播放声音
public static void main(String[] args) {
//英语
marytts.setLocale(Locale.US);
speakText("Good Morning");
//法语
// marytts.setLocale(Locale.FRENCH);
// Voice voice = Voice.getVoice(Locale.FRENCH, new Voice.Gender(“male”));
// marytts.setVoice(voice.getName());
// marytts.setVoice("upmc-pierre-hsmm");
// System.out.println(marytts.getVoice());
// System.out.println(marytts.getVoice());
//
// speakText(“Bonjour”);
//德语
// marytts.setLocale(Locale.GERMAN);
// speakText(“gutten Morgen”);
}
public static void speakText(String text){
if(marytts==null){
throw new RuntimeException("声音合成器初始化失败,无法合成声音");
}
try {
AudioInputStream audio = marytts.generateAudio(text);
player.setAudio(audio);
player.start();
player.join();
} catch (SynthesisException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void speakText(AudioInputStream audio){
if(marytts==null){
throw new RuntimeException("声音合成器初始化失败,无法合成声音");
}else if (audio==null){
throw new RuntimeException("声音文件不存在");
}
try {
player.setAudio(audio);
player.start();
player.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static AudioInputStream getTextVoice(String text){
AudioInputStream audio = null;
if(marytts==null){
throw new RuntimeException("声音合成器初始化失败,无法合成声音");
}
try {
audio = marytts.generateAudio(text);
} catch (SynthesisException e) {
e.printStackTrace();
}
return audio;
}
}
原文:http://my.oschina.net/evilgod528/blog/396167