【问题标题】:Sound isn't played没有播放声音
【发布时间】:2017-10-06 17:25:55
【问题描述】:

我需要使用文本到语音库。我决定使用 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) 声音应该已播放。但是,我什么也听不到,而且我的音量是可以听到的。那么,这里出了什么问题?

【问题讨论】:

    标签: javascript gwt responsivevoice


    【解决方案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);
    

    经过测试。工作。

    【讨论】:

    • 这表明问题出在 ScriptInjector 调用中 - 它应该调用 .setWindow(ScriptInjector.TOP_WINDOW),然后 JSNI 方法应该以 $wnd. 为前缀,就像你的答案显示的那样。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 2020-08-19
    相关资源
    最近更新 更多