MBROLA голоса с FreeTTS - Windows

Использование голосов MBROLA в программе Java с FreeTTS...

Я работаю над простой программой преобразования текста в речь на Java. Я решил использовать FreeTTS, но голоса не совсем то, о чем я думал, и я все равно хотел использовать женский голос. Поэтому я начал осматриваться и решил, что буду использовать MBROLA, чтобы изменить голос моей программы преобразования текста в речь.

Я читал, что "FreeTTS может использовать голоса MBROLA", но я искал везде и не мог найти четкого руководства, как настроить MBROLA и какие файлы необходимы для этого. Есть много форумов по MBROLA, работающих вместе со FreeTTS, однако также кажется, что никто из людей не имеет ни малейшего представления о том, что они делают.

Итак, вопросы:

  1. Какие файлы нужно скачать?
  2. Шаги, чтобы включить их в мою программу?
  3. Простой пример FreeTTS с использованием голосов MBROLA?

3 ответа

Решение

Ответы на вопросы выше:

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. ZIP-папка MBROLA будет содержать:

  • mbrola.exe
  • mbr302a (папка)
  • readme.txt

1.3 Голоса - это сжатые папки, в которые входит одна папка с именем " us1 " или " af1 " и т. Д.


2. Как включить их в мою программу?

ПРИМЕЧАНИЕ. У меня на компьютере также была установлена ​​программа MBROLA Tooklit, однако я не уверен, оказывает ли она влияние на программу, но подозреваю, что это не так. РЕДАКТИРОВАТЬ: я проверил, чтобы увидеть, нужен ли набор инструментов MBROLA для запуска MBROLA вместе с FreeTTS, и оказывается, что он не нужен.

  1. Извлечь Фреэттс-1.2.2-бин
  2. Скопируйте библиотеки в свой проект и включите в путь сборки
  3. Разархивируйте папку mbr301d.zip
  4. Переименуйте mbr301d в mbrola
  5. Разархивируйте голоса в папку, которую вы назвали "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 находятся на вашем компьютере, и без указания свойства на правильное местоположение вы получите эту ошибку.

Пользователям NON-MBROLA, которые получают эту ошибку: просто удалите mbrola.jar из библиотек, на которые есть ссылки, если вы используете только FreeTTS

Чтобы установить 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 теперь должны работать вместе! Этот код был скопирован прямо с моего компьютера и был протестирован, прежде чем поместить его здесь.

Благодаря ответам на этом форуме я наконец-то смог заставить его работать. На окнах 10; Я сделал следующие шаги, чтобы заставить его работать:

  1. Загрузите библиотеки freeTTS и включите их в мой проект Java в eclipse.
  2. Скачайте mbr301d.zip, распакуйте его в папку с именем mbrola в моем проекте
  3. Загрузите базу данных mbrola для us1, us2, us3 и en1 с http://www.tcts.fpms.ac.be/synthesis/mbrola/mbrcopybin.html
  4. Извлеките загруженные на предыдущем шаге голосовые БД непосредственно в папку mbrola - не меняйте имена папок.
  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". Это действительно помогло мне.

Пожалуйста, найдите рабочий пример здесь:

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

Другие вопросы по тегам