Search code examples
javascriptgwtresponsivevoice

Sound isn't played


I need to use a text to speech library. I decided to use https://responsivevoice.org/ . The integration is fairly easy, however, since my project uses GWT it is - obviously - not so straight forward.

Here is my java code that is a minimal proof of concept class:

import com.google.gwt.core.client.Callback;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.ScriptInjector;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.*;

public class InverseVoiceTrainer extends SimplePanel implements ClickHandler {

    Button playBtn;

    public InverseVoiceTrainer() {
        ScriptInjector.fromUrl("https://code.responsivevoice.org/responsivevoice.js").setCallback(
                new Callback<Void, Exception>() {
                    @Override
                    public void onSuccess(Void result) {
                        GWT.log("ResponsiveVoiceJS loaded.");
                    }
                    @Override
                    public void onFailure(Exception reason) {
                        GWT.log("ResponsiveVoiceJS loading FAILED!");
                    }
                }).inject();

        playBtn = new Button("Play");
        playBtn.addClickHandler(this);
        this.add(playBtn);
    }

    @Override
    public void onClick(ClickEvent event) {
        GWT.log("Onclick pressed");
        playWord("This is a test message...");
    }


    public static native void playWord(String s) /*-{
        console.log("playWord - 1");
        responsiveVoice.speak(s);
        console.log("playWord - 2");
    }-*/;
}

So, looking into the console log I can see the following:

ResponsiveVoice r1.5.3
SuperDevModeLogger.java:71 ResponsiveVoiceJS loaded.
SuperDevModeLogger.java:71 Onclick pressed
InverseVoiceTrainer.java:40 playWord - 1
InverseVoiceTrainer.java:42 playWord - 2

Which tells me that (a) ResponsiveVoice seems to have been correctly loaded and (b) the sound should have been played. However, I do not hear anything and my sound volume is hearable. So, what is going wrong here?


Solution

  • Well, this might be not the best answer, but it worked for me.

    First, just link the responsivevoice.js in hosting html page:

    <script type="text/javascript" language="javascript" src="https://code.responsivevoice.org/responsivevoice.js"></script>
    

    Then remove the ScriptInjector part of your code.

    The last change is to add $wnd in playWord() method:

    $wnd.responsiveVoice.speak(s);
    

    Tested. Worked.