Исключение с Freetts при использовании кевина или мброла - PullRequest
7 голосов
/ 21 марта 2010

Я пытаюсь запустить программу, используя 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();
        }
    }
}

Ответы [ 4 ]

2 голосов
/ 18 февраля 2011

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
2 голосов
/ 21 марта 2010

Кажется, что «Чтобы включить поддержку 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 голос
/ 05 июля 2017

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

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

1 голос
/ 24 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...