2010-03-21 3 views
7

Я пытаюсь запустить программу с использованием freetts. Я могу скомпилировать программу, однако я не могу использовать Кевину или MBROLA голоса я получаю выходное сообщение follwing в концеИсключение с использованием Freetts при использовании кевина или mbrola

Свойства системы «mbrola.base» не определено. Не будет использовать голоса MBROLA.
ЛИНИЯ UNAVAILABLE: Формат является pcm_signed 16000.0 Гц 16 бит 1 канал большой Endian

import javax.speech.*; 
import javax.speech.synthesis.*; 
import java.util.*; 

class freetts { 

    public static void main(String[] args) { 
     try{ 
      Calendar calendar = new GregorianCalendar(); 
      String sayTime = "It is " + calendar.get(Calendar.HOUR) + " " + calendar.get(Calendar.MINUTE) + " " + (calendar.get(Calendar.AM_PM)==0 ? "AM":"PM"); 
      Synthesizer synth = Central.createSynthesizer(null); 
      synth.allocate(); 
      synth.resume(); 
      synth.speakPlainText(sayTime, null); 
      synth.waitEngineState(Synthesizer.QUEUE_EMPTY); 
      synth.deallocate(); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Я не использовал это в течение длительного времени. Но, вы положили все, что вам нужно, в ваш путь к классу? Кроме того, из того, что я помню, было что-то, что вам пришлось поместить в ваш домашний каталог (это была более старая версия), что может быть еще одной причиной проблемы (если вам все еще нужно это делать). Кроме того, могут быть другие переменные среды, которые необходимо установить, например, вам нужно установить переменную MBROLA_HOME. Также были ли вы в состоянии запустить любую из примеров программ, которые пришли с ней? Мне жаль, что я не задавал вопросов, но они помогают сузить проблему. –

+0

извините еще пару, исключение линии недоступно, если вы пытаетесь воспроизводить звуки одновременно, в зависимости от того, что вы делали, чтобы воспроизводить файлы. Можете ли вы показать код, который вы используете для воспроизведения голоса. –

+0

Нам нужно скопировать функции speech.properties. Я уже это сделал. Тем не менее, я не могу привязывать голосовые интерфейсы mbrola с помощью моей программы или по умолчанию к кевину, но я включил пользователя kevin в путь к моей программе. – manugupt1

ответ

2

кажется, что «Для того, чтобы включить FreeTTS поддержка MBROLA, просто скопировать MBROLA/mbrola.jar в Lib/mbrola.jar. Затем, при запуске любого приложения FreeTTS укажите "mbrola.base" каталог как свойство системы:

java -Dmbrola.base=/home/jim/mbrola -jar bin/FreeTTSHelloWorld.jar mbrola_us1" 

Я нашел это на:

http://freetts.sourceforge.net/mbrola/README.html

1

Вторая фраза не имеет ничего общего с mbrola, но с ужасающей звуковой ошибкой java linux, которая все еще не исправлена. Проверьте третий пост здесь: https://forums.oracle.com/forums/thread.jspa?threadID=2206163

Это происходит потому, что FreeTTS «доверяет» sourcedataline, вместо того, чтобы делать обходной путь на этом посту. Ошибка находится в jdk, но ее можно обойти, найдя, где в freetts, что происходит, и вставка обходного решения & перекомпиляции.

Вот это TestCase

package util.speech; 

import java.util.Iterator; 
import java.util.Locale; 
import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.Mixer; 
import javax.sound.sampled.SourceDataLine; 
import org.junit.After; 
import org.junit.AfterClass; 
import org.junit.Assume; 
import org.junit.Before; 
import org.junit.BeforeClass; 
import org.junit.Test; 
import static org.junit.Assert.*; 

public class VoiceTest { 



    public VoiceTest() { 
    } 

    @BeforeClass 
    public static void setUpClass() throws Exception { 
    } 

    @AfterClass 
    public static void tearDownClass() throws Exception { 
    } 

    @Before 
    public void setUp() { 

    } 

    @After 
    public void tearDown() { 
    } 

    @Test 
    public void testDataLineAvailableAndBuggyInJDK() throws LineUnavailableException { 
     boolean failedSimpleGetLine = false; 
     AudioFormat format = new AudioFormat(44100, 16, 2, true, false); 
     SourceDataLine line = null; 
     DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); 
     try { 
      line = (SourceDataLine) AudioSystem.getLine(info); 
     } catch (LineUnavailableException e) { 
      //ok, at least it says so 
      throw e; 
     } 
     try { 
      //if this fails the jdk is very buggy, since it just told us 
      //the line was available 
      line.open(format); 
     } catch (LineUnavailableException e) { 
      failedSimpleGetLine = true; 
     } finally { 
      if (line.isOpen()) { 
       line.close(); 
      } 
     } 



     //now if this is true, test if it's possible to get a valid sourcedataline 
     //or the only bug is adquiring a sourcedataline doesn't throw a lineunavailable 
     //exception before open 
     Assume.assumeTrue(failedSimpleGetLine); 
     line = getSourceDataLine(format); 
     if (line == null) { 
      return; 
     } 

     try { 
      line.open(format); 
     } catch (LineUnavailableException e) { 
      //ok then it is consistent, and there is only one bug 
      fail("Line Unavailable after being adquired"); 
     } finally { 
      if (line.isOpen()) { 
       line.close(); 
      } 
     } 
     fail("line available after first test not managing to adquire it"); 
    } 


    private SourceDataLine getSourceDataLine(AudioFormat format) { 
     try { 
      DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); 
      for (Mixer.Info mi : AudioSystem.getMixerInfo()) { 
       SourceDataLine dataline = null; 
       try { 
        Mixer mixer = AudioSystem.getMixer(mi); 
        dataline = (SourceDataLine) mixer.getLine(info); 
        dataline.open(format); 
        dataline.start(); 
        return dataline; 
       } catch (Exception e) { 
       } 
       if (dataline != null) { 
        try { 
         dataline.close(); 
        } catch (Exception e) { 
        } 
       } 
      } 
     } catch (Exception e) { 
     } 
     return null; 
    } 
} 
+2

Oracle напортачил эту ссылку на форуме, кто-то знает, где она сейчас? –

+0

Или патч/обходной путь. –

+0

IIRC обходной путь должен был открыть dataline (с попыткой поймать, наконец, закрыть). Это необходимо, потому что некоторые datalines сообщают, что они поддерживают формат, но когда вы на самом деле пытаетесь их открыть, они взрываются. Конечно, это отстой. – i30817

2

http://workorhobby.blogspot.com/2011/02/java-audio-freetts-line-unavailable.html

Большое спасибо автору.


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

"LINE UNAVAILABLE: Format is ..." 

Оказывается, нет Java Exception или другой механизм, чтобы обнаружить эту ошибку, происходит внутри библиотеки FreeTTS. Все, что вы получаете, - это сообщение на System.out, поэтому нет хорошего способа реагировать программно.

Обход проблемы: настройте аудиопроигрыватель FreeTTS, чтобы попытаться получить доступ к аудиоустройству более одного раза, пока это не удастся. В этом примере используется короткая задержка в 0,1 секунды, чтобы не упустить возможность захватить аудиоустройство; мы продолжаем пытаться в течение 30 секунд:

System.setProperty("com.sun.speech.freetts.audio.AudioPlayer.openFailDelayMs", "100"); 
System.setProperty("com.sun.speech.freetts.audio.AudioPlayer.totalOpenFailDelayMs", "30000"); 

Если аудиоустройство постоянно используется другой программой, нет, конечно, не способ получить доступ. Под Linux, эта команда отобразит идентификатор процесса, который в настоящее время проводит аудиоустройство, так, то вы можете попытаться избавиться от программы нарушившей:

/sbin/fuser /dev/dsp 
1

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

package com.mani.texttospeech; 

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; 

/** 
* 
* @author Manindar 
*/ 
public class SpeechUtils { 

    SynthesizerModeDesc desc; 
    Synthesizer synthesizer; 
    Voice voice; 

    public void init(String voiceName) throws EngineException, AudioException, EngineStateError, PropertyVetoException { 
     if (desc == null) { 
      System.setProperty("freetts.voices", "com.sun.speech.freetts.en.us.cmu_us_kal.KevinVoiceDirectory"); 
      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(); 
      for (Voice voice1 : voices) { 
       if (voice1.getName().equals(voiceName)) { 
        voice = voice1; 
        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 { 
     SpeechUtils su = new SpeechUtils(); 
     su.init("kevin16"); 
//  su.init("kevin"); 
//  su.init("mbrola_us1"); 
//  su.init("mbrola_us2"); 
//  su.init("mbrola_us3"); 
     // high quality 
     su.doSpeak("Hi this is Manindar. Welcome to audio world."); 
     su.terminate(); 
    } 
} 

И добавьте ниже зависимостей к вашему pom.xml файл.

<dependencies> 
     <dependency> 
      <groupId>net.sf.sociaal</groupId> 
      <artifactId>freetts</artifactId> 
      <version>1.2.2</version> 
     </dependency> 
    </dependencies> 

Надеюсь, это будет полезно.

+0

Добавление строки System.setProperty ("freetts.voices", "com.sun.speech.freetts. en.us.cmu_us_kal.KevinVoiceDirectory "); И тогда мой код работает хорошо, большое спасибо. – VanThaoNguyen