Soundmanager2不会加载来自谷歌翻译的声音

时间:2013-05-29 09:33:58

标签: soundmanager2

我想说一些文字;如果我在浏览器中输入格式正确的网址,我可以从google translate tts获取音频文件(mp3)。

但是如果我尝试创建它,我只会在firebug中看到404错误。

我使用它,但它失败了:

soundManager.createSound( 
  {id:'testsound', 
   autoLoad:true,
   url:'http://translate.google.com/translate_tts?ie=UTF-8&tl=da&q=testing'}
 );

我已经使用wget预先获取了固定的语音提示,因此它们与页面在同一个Web服务器上作为本地mp3文件。但我想说一个动态的提示。

2 个答案:

答案 0 :(得分:1)

我看到这是很久以前的问题了,但我遇到了类似的问题,我能够让它适用于Chrome和Firefox,但使用音频标签。

这是我制作的演示页面

http://jsfiddle.net/royriojas/SE6ET/

这是为我制作技巧的代码......

var sayIt;

function createSayIt() {

    // Tiny trick to make the request to google actually work!, they deny the request if it comes from a page but somehow it works when the function is inside this iframe!

    //create an iframe without setting the src attribute
    var iframe = document.createElement('iframe');

    // don't know if the attribute is required, but it was on the codepen page where this code worked, so I just put this here. Might be not needed.
    iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-pointer-lock');
    // hide the iframe... cause you know, it is ugly letting iframes be visible around...
    iframe.setAttribute('class', 'hidden-iframe')

    // append it to the body
    document.body.appendChild(iframe);

    // obtain a reference to the contentWindow
    var v = iframe.contentWindow;

    // parse the sayIt function in this contentWindow scope
    // Yeah, I know eval is evil, but its evilness fixed this issue...
    v.eval("function sayIt(query, language, cb) { var audio = new Audio(); audio.src = 'http://translate.google.com/translate_tts?ie=utf-8&tl=' + language + '&q=' + encodeURIComponent(query); cb && audio.addEventListener('ended', cb);  audio.play();}");

    // export it under sayIt variable
    sayIt = v.sayIt;
}

我想我能够通过那个限制。他们可能会在将来修复这个黑客,我不知道。我实际上希望他们不要......

你也可以尝试使用Text2Speech HTML5 api,但它还很年轻......

IE 11无法使用此黑客攻击,未来一段时间我可能会尝试修复它

答案 1 :(得分:0)

即使您将此视为404错误,您实际上也遇到了跨域限制。

来自404的一些响应标题也将为您提供正在发生的事情的线索:

X-Content-Type-Options:nosniff
X-XSS-Protection:1; mode=block

所以,你将无法做到这一点,因为谷歌没有(也可能永远不会)允许你这样做。

为了动态加载音频,您需要通过设置proxy on your own server来解决此x-domain限制,该{{3}}将从Google的服务器下载最终用户请求的任何文件(通过wget或其他任何东西)并吐出任何来自谷歌的数据。

我曾用于重现问题的代码:

soundManager.setup({
    url: 'swf',
    onready: function() {
        soundManager.createSound({
            id:'testsound', 
            autoLoad:true,
            url:'http://translate.google.com/translate_tts?ie=UTF-8&tl=da&q=testing'
        });
    }
});

您的代码应如下所示:

soundManager.createSound({
    id:'testsound', 
    autoLoad:true,
    url:'/audioproxy.php?ie=UTF-8&tl=da&q=testing' // Same domain!
});

问候并祝你好运!