Reputation: 11
How Do I Make the Mary TTS 5.2 Library Compatible with JDK 11?
As I mentioned in the title, I need to voice a text received with the help of a CDI Bean in Turkish. This is built for a sound button that will work when the button is clicked on a web page. The problem is that Mary TTS is compatible with JDK 8 but I am using Jakarta specification and working with JDK 11. After downloading it from Mary TTS's web page, I ran it with JDK 8. The result was very good. But I couldn't get it to work in my project.
CDI Bean Code:
protected int bytesRead = 0;
public void guvenlikKodSeslendir() {
try {
// MaryTTS arayüzünü oluşturun
MaryInterface maryTts = new LocalMaryInterface();
// Türkçe yerel ayarını yükleyin
maryTts.setLocale(new Locale("tr"));
//Kullanılacak ses modelini ayarlayın
maryTts.setVoice("dfki-pavoque-neutral");
// Seslendirilecek metni ayarlayın
String text = "Merhaba, dünya!";
// Metni seslendirin ve ses dalgası verisini alın
AudioInputStream audio = maryTts.generateAudio(str);
// Ses dalgasını çalacak bir SourceDataLine oluşturun
try (SourceDataLine line = AudioSystem.getSourceDataLine(audio.getFormat())) {
line.open(audio.getFormat());
line.start();
byte[] buffer = new byte[4096];
int bytesRead = 0;
while ((bytesRead = audio.read(buffer)) != -1) {
line.write(buffer, 0, bytesRead);
}
line.drain();
line.stop();
}
} catch (IOException | LineUnavailableException | MaryConfigurationException | SynthesisException e) {
e.printStackTrace();
}
}
The code from the facelet page will be replaced with the "str" statement. I've corrected it for clarity.
I downloaded Mary TTS version 5.2 from mary.defki.de. I start the file "marytts-server.bat" in the "bin" folder. I also have JDK 11 version on my computer. When I start the file in this way without changing the path variable, the following error message is displayed in the console window. Output:
Java version "11.0.18" 2023-01-17 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.18+9-LTS-195)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.18+9-LTS-195, mixed mode)
MARY server 5.2 starting as a HTTP server...WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedClass$3$1 (file:/C:/Users/MFC/Documents/marytts-5.2/lib/marytts-client-5.2-jar-with-dependencies.jar) to method java.lang.Object.finalize()
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.reflection.CachedClass$3$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
started in 4.966 s on port 59125
The above error message does not occur if JDK 8 is used.
I would like to summarize the example by making a standard class with a main method so that the subject can be better understood. Class Code:
package tr.com.fatih.beans;
import java.io.IOException;
import java.util.Locale;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import marytts.LocalMaryInterface;
import marytts.exceptions.MaryConfigurationException;
import marytts.exceptions.SynthesisException;
public class MaryTTSExample {
public static void main(String[] args) {
try {
LocalMaryInterface maryTts = new LocalMaryInterface();
maryTts.setLocale(new Locale("tr"));
maryTts.setVoice("dfki-pavoque-neutral");
String text = "Merhaba, bu bir deneme metnidir.";
AudioInputStream audio = maryTts.generateAudio(text);
try (SourceDataLine line = AudioSystem.getSourceDataLine(audio.getFormat())) {
line.open(audio.getFormat());
line.start();
byte[] buffer = new byte[4096];
int bytesRead = 0;
while ((bytesRead = audio.read(buffer)) != -1) {
line.write(buffer, 0, bytesRead);
}
line.drain();
line.stop();
}
} catch (IOException | IllegalArgumentException | LineUnavailableException | MaryConfigurationException | SynthesisException e) {
e.printStackTrace();
}
}
}
NetBeans gives me a warning when I run the code.
Output:
marytts.exceptions.MaryConfigurationException: Cannot start MARY server
at marytts.LocalMaryInterface.<init>(LocalMaryInterface.java:66)
at tr.com.fatih.beans.MaryTTSExample.main(MaryTTSExample.java:16)
Caused by: java.lang.Exception: Problem starting module Synthesis
at marytts.server.Mary.startModules(Mary.java:151)
at marytts.server.Mary.startup(Mary.java:297)
at marytts.server.Mary.startup(Mary.java:204)
at marytts.util.MaryRuntimeUtils.ensureMaryStarted(MaryRuntimeUtils.java:72)
at marytts.LocalMaryInterface.<init>(LocalMaryInterface.java:64)
... 1 more
Caused by: marytts.exceptions.MaryConfigurationException: Cannot build unit selection voice 'dfki-ot'
at marytts.unitselection.UnitSelectionVoice.<init>(UnitSelectionVoice.java:218)
at marytts.unitselection.UnitSelectionSynthesizer.startup(UnitSelectionSynthesizer.java:94)
at marytts.modules.Synthesis.startupSynthesizers(Synthesis.java:73)
at marytts.modules.Synthesis.startup(Synthesis.java:65)
at marytts.server.Mary.startModules(Mary.java:149)
... 5 more
Caused by: marytts.exceptions.NoSuchPropertyException: Cannot read file `voices\dfki-ot\halfphoneFeatures_ac.mry'. Check property `voice.dfki-ot.featureFile' in configuration files
at marytts.server.MaryProperties.needFilename(MaryProperties.java:389)
at marytts.unitselection.UnitSelectionVoice.<init>(UnitSelectionVoice.java:107)
... 9 more
Exception in thread "Thread-1" java.lang.IllegalStateException: MARY system is not running
at marytts.server.Mary.shutdown(Mary.java:371)
at marytts.server.Mary$2.run(Mary.java:290)
Upvotes: 0
Views: 257