在一个的FreeTTS Java程序使用MBROLA的声音......
我工作在一个简单的Java 文本到语音程序。 我已经决定使用的FreeTTS,但声音不是真正的我在想什么,我一直在寻找这样用一个女性的声音。 于是,我开始四处寻找,并决定我会用MBROLA改变我的文本到语音程序的声音。
我读的是“可以的FreeTTS使用MBROLA声音”,但我到处找,但没有找到一个明确的指导如何设置MBROLA了,需要做的还等什么文件。 上有MBROLA许多论坛一起工作的FreeTTS,但它似乎也没有任何人有任何想法,他们在做什么。
所以问题:
- 哪些文件需要下载?
- 步骤包括这些到我的程序?
- 使用MBROLA声音简单例子的FreeTTS?
回答上述问题:
1.哪些文件需要下载?
- 与所有的库(1.2.2的FreeTTS彬) 的FreeTTS - 在这里下载
- MBROLA ZIP文件夹mbr301d.zip
- 可在上找到声音 MBROLA网站
1.1 的FreeTTS库(在发现的FreeTTS-1.2.2滨/的FreeTTS-1.2 / LIB):
- cmu_time_awb.jar
- cmu_us_kal.jar
- cmudict04.jar
- cmulex.jar
- cmutimelex.jar
- en_us.jar
- freetts.jar
- 的FreeTTS-jsapi10.jar
- mbrola.jar
1.2 MBROLA拉链夹将包括:
- mbrola.exe
- mbr302a(文件夹)
- readme.txt文件
1.3 声音是包括名为“US1”或“AF1”等的单个文件夹的文件夹压缩
2.步骤包括这些到我的程序?
注:我有MBROLA工具包创建我的计算机上安装过,但我不能确定它是否有该程序的影响,但我怀疑,事实并非如此。 编辑:我已经测试,看看是否需要MBROLA工具箱运行MBROLA旁边的FreeTTS,并且事实证明是不需要的。
- 提取的FreeTTS-1.2.2斌
- 库复制到您的项目,包括在构建路径
- 解压文件夹mbr301d.zip
- 重命名“mbr301d”到“mbrola”
- 解压缩的声音给你一个名为“mbrola”的文件夹
完成上述操作后,您mbrola文件夹应该是这样的:
- [mbr302a] - 夹
- [US1] - 文件夹(名称取决于您下载的语言)
- mbrola.exe - 文件
- readme.txt文件- 文件
你可以把这个文件夹中所有的语言,他们只是从您的Java程序调用。
3.简单的例子的FreeTTS使用MBROLA声音?
我见过很多人得到这个错误:
System property "mbrola.base" is undefined. Will not use MBROLA voices.
该mbrola.base
指的是你的mbrola文件位于您的计算机上,并没有财产被指向到正确的位置,您将收到此错误。
为了谁得到这个错误未MBROLA用户:只要从引用的库,如果你只使用删除的FreeTTS在mbrola.jar
要设置mbrola.base
属性,使用方法:
System.setProperty("mbrola.base", "C:/Path/to/your/mbrola")
下面是一个简单的例子来使用MBROLA的声音在你的程序的FreeTTS。 请注意,上述步骤之前必须完成,这将工作。 简单地改变声音的名称为“mbrola_us1”不会,如果基础没有设置工作!
package com.madmob.test;
import com.sun.speech.freetts.Voice;
import com.sun.speech.freetts.VoiceManager;
public class TestTTS {
VoiceManager freettsVM;
Voice freettsVoice;
public TestTTS(String words) {
// Most important part!
System.setProperty("mbrola.base", "C:/mbrola");
freettsVM = VoiceManager.getInstance();
// Simply change to MBROLA voice
freettsVoice = freettsVM.getVoice("mbrola_us1");
// Allocate your chosen voice
freettsVoice.allocate();
sayWords(words);
}
public void sayWords(String words) {
// Make her speak!
freettsVoice.speak(words);
}
public static void main(String [] args) {
new TestTTS("Hello there! Now M BROLA and Free T T S work together!");
}
}
MBROLA和应该的FreeTTS现在一起工作! 此代码是从我的电脑右键复制,并把它放下来之前已经过测试。
由于在这个论坛的反应,我终于可以让它工作。 在Windows 10; 我进行下面的步骤,使其工作:
- 下载图书馆的FreeTTS并将它们包括在Eclipse我的Java项目。
- 下载mbr301d.zip我的项目中,一个文件夹中提取它命名mbrola
- 下载US1,US2,US3和en1 mbrola数据库从http://www.tcts.fpms.ac.be/synthesis/mbrola/mbrcopybin.html
- 提取直接在mbrola文件夹上一步中下载的声音DB拉链 - 不改变文件夹的名称。
- 包括下面的代码片段使用它:
System.setProperty("mbrola.base", "ABSOLUTE_PATH_TO_mbrola_directory_ending_with_/"); voiceManager = VoiceManager.getInstance(); voice = voiceManager.getVoice("mbrola_us1");
注意: 如果你的声音DB文件夹名称为US1; 那么你应该在上面添加为“mbrola_us1”; 如果是EN1,那么它应该是“mbrola_en1”。 这实际上已经做的伎俩我。
请找到这里工作示例:
https://github.com/sunrise-projects/sphinx4/tree/glass
package com.sunriseprojects.freetts.demo; import java.beans.PropertyVetoException; import java.util.Locale; import javax.speech.AudioException; import javax.speech.Central; import javax.speech.EngineException; import javax.speech.EngineStateError; import javax.speech.synthesis.Synthesizer; import javax.speech.synthesis.SynthesizerModeDesc; import javax.speech.synthesis.Voice; public class SpeechUtils { SynthesizerModeDesc desc; Synthesizer synthesizer; Voice voice; public void init(String voiceName) throws EngineException, AudioException, EngineStateError, PropertyVetoException { if (desc == null) { //default // System.setProperty("freetts.voices", // "com.sun.speech.freetts.en.us.cmu_us_kal.KevinVoiceDirectory"); //have to be setup System.setProperty("freetts.voices", "de.dfki.lt.freetts.en.us.MbrolaVoiceDirectory"); desc = new SynthesizerModeDesc(Locale.US); Central.registerEngineCentral("com.sun.speech.freetts.jsapi.FreeTTSEngineCentral"); synthesizer = Central.createSynthesizer(desc); synthesizer.allocate(); synthesizer.resume(); SynthesizerModeDesc smd = (SynthesizerModeDesc) synthesizer .getEngineModeDesc(); Voice[] voices = smd.getVoices(); Voice voice = null; for (int i = 0; i < voices.length; i++) { if (voices[i].getName().equals(voiceName)) { voice = voices[i]; break; } } synthesizer.getSynthesizerProperties().setVoice(voice); } } public void terminate() throws EngineException, EngineStateError { synthesizer.deallocate(); } public void doSpeak(String speakText) throws EngineException, AudioException, IllegalArgumentException, InterruptedException { synthesizer.speakPlainText(speakText, null); synthesizer.waitEngineState(Synthesizer.QUEUE_EMPTY); } public static void main(String[] args) throws Exception { System.setProperty("mbrola.base", "C:\\lnx1\\home\\ggon\\git-projects\\mbrola"); SpeechUtils su = new SpeechUtils(); //have to be setup on your env su.init("mbrola_us1"); //default //su.init("kevin16"); //su.init("kevin"); //su.doSpeak("Hello world!"); su.doSpeak(SAMPLE); su.terminate(); } final static String SAMPLE = "Wiki said, Floyd Mayweather, Jr. is an American professional boxer. He is currently undefeated as a professional and is a five-division world champion, having won ten world titles and the lineal championship in four different weight classes"; }