4

在带有 FreeTTS 的 Java 程序中使用 MBROLA 声音...

我正在使用 Java 开发一个简单的文本到语音转换程序。我决定使用 FreeTTS,但声音并不是我真正想的那样,无论如何我都希望使用女性声音。所以我开始环顾四周,并决定使用 MBROLA 来改变我的文字转语音程序的声音。

我读到“FreeTTS 可以使用 MBROLA 声音”,但我到处搜索,找不到如何设置 MBROLA 以及需要哪些文件的明确指南。有许多关于 MBROLA 的论坛与 FreeTTS 一起工作,但似乎没有人知道他们在做什么。

所以问题:

  1. 需要下载哪些文件?
  2. 将这些包含到我的程序中的步骤?
  3. 使用 MBROLA 语音的简单 FreeTTS 示例?
4

3 回答 3

13

对上述问题的回答:

1. 需要下载哪些文件?

  1. 带有所有库的FreeTTS (freeTTS 1.2.2-bin) -在此处下载
  2. MBROLA zip 文件夹mbr301d.zip
  3. 可以在MBROLA网站上找到的声音

1.1 FreeTTS(在 freetts-1.2.2-bin/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 zip 文件夹将包括:

  • mbrola.exe
  • mbr302a (文件夹)
  • 自述文件.txt

1.3声音是压缩文件夹,其中包括一个名为“ us1 ”或“ af1 ”等的文件夹。


2. 将这些包含到我的程序中的步骤?

注意:我的计算机上也安装了MBROLA Toolit,但我不确定它是否对程序有影响,但我怀疑它不会。编辑:我已经测试过是否需要 MBROLA 工具包才能与 FreeTTS 一起运行 MBROLA,结果证明不需要它。

  1. 提取freetts-1.2.2-bin
  2. 将库复制到您的项目并包含在构建路径中
  3. 解压 mbr301d.zip 文件夹
  4. 将“mbr301d”重命名为“mbrola”
  5. 将声音解压缩到您命名为“mbrola”的文件夹中

完成后,您的 mbrola 文件夹应如下所示:

  • [mbr302a] -文件夹
  • [us1] -文件夹(名称取决于您下载的语言)
  • mbrola.exe -文件
  • readme.txt -文件

您可以将所有语言放在此文件夹中,它们只会从您的 Java 程序中调用。


3. 使用 MBROLA 语音的简单 FreeTTS 示例?

我见过很多人得到这个错误:

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")

下面是一个在 FreeTTS 程序中使用 MBROLA 声音的简单示例。请注意,必须先完成上述步骤,然后才能使用。如果未设置基础,只需将语音名称更改为“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 现在应该一起工作了!这段代码是直接从我的电脑上复制的,并且在放在这里之前已经过测试。

于 2014-10-07T12:56:19.410 回答
2

感谢这个论坛上的回复,我终于能够让它工作了。在 Windows 10 上;我执行了以下步骤以使其正常工作:

  1. 下载免费的 TTS 库并将它们包含在我在 Eclipse 中的 Java 项目中。
  2. 下载mbr301d.zip,将其解压到我项目中名为 mbrola 的文件夹中
  3. 从http://www.tcts.fpms.ac.be/synthesis/mbrola/mbrcopybin.html下载 us1、us2、us3 和 en1 的 mbrola 数据库
  4. 直接在 mbrola 文件夹中提取上一步下载的语音 DB zip - 不要更改文件夹的名称。
  5. 包括以下代码片段以使用它:
    System.setProperty("mbrola.base", "ABSOLUTE_PATH_TO_mbrola_directory_ending_with_/");
    voiceManager = VoiceManager.getInstance();
    voice = voiceManager.getVoice("mbrola_us1");
    
    注意:如果您的语音数据库文件夹名称是 us1;那么您应该将其添加为“mbrola_us1”;如果是 en1,那么它应该是 "mbrola_en1"。这实际上对我有用。
于 2017-01-17T07:14:28.830 回答
1

请从这里找到工作示例:

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";
}

于 2015-03-01T06:35:48.680 回答