2017-10-06 208 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.'爲前綴,就像你的答案顯示的那樣。 –