我想说一些文字;如果我在浏览器中输入格式正确的网址,我可以从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文件。但我想说一个动态的提示。
答案 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!
});
问候并祝你好运!