2017-10-06 237 views
0

我需要使用文本到语音库。我决定使用https://responsivevoice.org/。然而,整合相当容易,因为我的项目使用GWT,显然 - 并不那么直截了当。声音未播放

这里是我的Java代码,概念类的最小证明:

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"); 
    }-*/; 
} 

因此,寻找到控制台日志,我可以看到以下内容:

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

告诉我,( a)ResponsiveVoice似乎已经正确加载并且(b)声音应该已经播放。但是,我什么也听不到,我的音量是可以忍受的。那么,这里出了什么问题?

回答

1

嗯,这可能不是最好的答案,但它对我有用。

首先,刚刚在托管HTML网页链接responsivevoice.js

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

然后删除代码的ScriptInjector一部分。

最后一个变化是在playWord()方法添加$wnd

$wnd.responsiveVoice.speak(s); 

测试。工作。

+0

这指出问题出现在'ScriptInjector'调用中 - 它应该调用'.setWindow(ScriptInjector.TOP_WINDOW)',然后JSNI方法应该以'$ wnd.'为前缀,就像你的答案显示的那样。 –