4

FreeTTS を使用して Java プログラムで MBROLA 音声を使用する...

私はJavaで簡単なテキスト読み上げプログラムに取り組んでいます。FreeTTSを使うことにしましたが、思っていたのとは違う声で、とにかく女性の声を使いたいと思っていました。そこで私は周りを見回し、MBROLA を使用してテキスト読み上げプログラムの音声を変更することにしました。

「FreeTTS は MBROLA の音声を使用できます」と読みましたが、あらゆる場所を検索しましたが、MBROLA をセットアップする方法と、そのために必要なファイルが明確なガイドを見つけることができませんでした。FreeTTS と連携して MBROLA に関する多くのフォーラムがありますが、MBROLA が何をしているのかを誰も知らないようです。

だから質問:

  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 (フォルダー)
  • readme.txt

1.3ボイスは、' us1 ' または ' af1 ' などの名前の単一のフォルダーを含む圧縮フォルダーです。


2. これらをプログラムに組み込む手順は?

注: MBROLA Toolkitもコンピューターにインストールしましたが、プログラムに影響があるかどうかはわかりませんが、影響はないと思われます。編集: FreeTTS と一緒に MBROLA を実行するために 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.basembrola ファイルがコンピューター上のどこにあるかを示しており、プロパティが正しい場所を指していないと、このエラーが発生します。

このエラーが発生した 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 に答える
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 に答える