Исключение с Freetts при использовании кевина или мброла

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

  

Системное свойство "mbrola.base" не определено. Не будет использовать голоса MBROLA.
  LINE UNAVAILABLE: формат pcm_signed 16000,0 Гц 16 бит 1 канал с прямым порядком байтов

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();
        }
    }
}
7 голосов | спросил manugupt1 21 MarpmSun, 21 Mar 2010 15:05:58 +03002010-03-21T15:05:58+03:0003 2010, 15:05:58

4 ответа


0

Похоже, что «чтобы включить поддержку 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

ответил John Kane 21 MarpmSun, 21 Mar 2010 23:11:02 +03002010-03-21T23:11:02+03:0011 2010, 23:11:02
0

http://workorhobby.blogspot.com/2011/02 /Java-аудио-FreeTTS-линии 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
ответил Ondra Žižka 18 FebruaryEurope/MoscowbFri, 18 Feb 2011 02:12:17 +0300000000amFri, 18 Feb 2011 02:12:17 +030011 2011, 02:12:17
0

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

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

Вот контрольный пример

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;
    }
}
ответил i30817 24 MaramWed, 24 Mar 2010 08:52:29 +03002010-03-24T08:52:29+03:0008 2010, 08:52:29
0

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

    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>

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

ответил Manindar 5 J000000Wednesday17 2017, 08:09:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132