javaaudiotext-to-speechfreetts

FreeTTS, Java, Linux: Workaround for "LINE UNAVAILABLE: Format is ..."


When I run FreeTTS examples, I get this error:

LINE UNAVAILABLE: Format is pcm_signed 16000.0 Hz 16 bits 1 channel big endian

In this post, Freetts problem in Java
someone claims it's a known Linux/Java sound bug and has a workaround, linking to http://forums.sun.com/thread.jspa?threadID=5189363 .

But this link does not work anymore since Oracle screwed it. Archive.org seems not to have this page archived.

Does anyone have the workaround / patch for FreeTTS?

Thanks, Ondra


Solution

  • Hmm, I had better luck googling after asking the question, so...: http://workorhobby.blogspot.com/2011/02/java-audio-freetts-line-unavailable.html A big thanks to the author.

    Update: Actually, this is not a nice workaround since it will keep FreeTTS on hold until the line is free.

    FWIU, the mentioned patch had better solution - not demanding exclusive access or such.

    Update: I've compiled a FreeTTS troubleshooting page.


    A program based on FreeTTS, the free text-to-speech engine for Java, was getting occasional errors

    "LINE UNAVAILABLE: Format is ..."
    

    Turns out there is no Java Exception or other mechanism to detect this error that occurs inside the FreeTTS library. All you get is the message on System.out, so there is no good way to react programatically.

    Workaround: Configure the FreeTTS audio player to attempt accessing the audio device more than once until it succeeds. In this example, a short delay of 0.1 seconds is used to not miss an opportunity to grab the audio device; we keep trying for 30 seconds:

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

    If the audio device is permanently used by another program, there is of course no way to get access. Under Linux, this command will display the ID of the process that is currently holding the audio device, so you can then try to get rid of the offending program:

    /sbin/fuser /dev/dsp