标签:
- 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