Javascript base64ToArrayBuffer错误:未能执行';atob&x27;在';窗口&x27;。(网络音频API)
因此,我对网络音频API非常陌生,4天前才听说过它(尽管从那时起,我花了大约50个小时对它进行研究和实验)。我也是javascript的新手 情境:我正在尝试开发一个脚本,该脚本将从API(被编码为base64字符串)获取Google的TTS返回,并将其传输到arrayBuffer,以便在Web音频API中使用,以便我可以通过一些节点发送它 我已经得到了谷歌TTS API集成到我的网站的回报。当我在计算机上的测试服务器上测试脚本时,我可以听到audioContext以轻微静态的形式激活。然而,我的一个base64ToArray字符串出现了一个错误,我似乎无法诊断或修复它 以下是错误: 未捕获的DomeException:未能在“窗口”上执行“atob”:要解码的字符串编码不正确。 在base64ToArrayBuffer(16:31) (10时23分) 这是代码。为了这篇文章,我只保留了base64字符串的一部分。还有一个旁注:我尝试通过包含数据URI格式化base64String,以及仅包含base64String—这两种方法都不起作用 任何帮助都将受到感谢Javascript base64ToArrayBuffer错误:未能执行';atob&x27;在';窗口&x27;。(网络音频API),javascript,html,base64,web-audio-api,Javascript,Html,Base64,Web Audio Api,因此,我对网络音频API非常陌生,4天前才听说过它(尽管从那时起,我花了大约50个小时对它进行研究和实验)。我也是javascript的新手 情境:我正在尝试开发一个脚本,该脚本将从API(被编码为base64字符串)获取Google的TTS返回,并将其传输到arrayBuffer,以便在Web音频API中使用,以便我可以通过一些节点发送它 我已经得到了谷歌TTS API集成到我的网站的回报。当我在计算机上的测试服务器上测试脚本时,我可以听到audioContext以轻微静态的形式激活。然而,我
var isPlaying = false;
var audioContext;
var avaVoice;
var gainNode;
var reverbNode;
var pannerNode;
var updateTime = 200;
var global = global || window;
var avaVoiceDataUri = base64ToArrayBuffer('UklGRuC6DABXQVZFZm10IBAAAAABAAIAAHcBAADKCAAGABgAYmV4dFoCAABNdWx0aW1lZGlhIGludGVyZmFjZSBzb3VuZCBlZmZlY3QuIFVJIEh1ZCBtb2Rlcm4gYW5kIFNjaWVudGlmaWMuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');
var impulseResponse = base64ToArrayBuffer("data:audio/wav;base64,UklGRhCjBwBXQVZFZm10IBAAAAABAAIARKwAAJgJBAAGABgAZGF0YeyiBwAAAAAAAADRBwDKBgCwAQBA+/8y6v/yuP8JAQA2R/");
function base64ToArrayBuffer(base64) {
var binaryString = window.atob(base64);
var len = binaryString.length;
var bytes = new Uint8Array(len);
for (var i = 0; i < len; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
return bytes.buffer;
}
function initSound() {
audioContext = new AudioContext();
avaVoice.crossOrigin = "anonymous";
avaVoice.loop = false;
var source = audioContext.createMediaElementSource(avaVoice);
gainNode = audioContext.createGain();
gainNode.gain.value = 0.5;
reverbNode = audioContext.createConvolver();
var reverbSoundArrayBuffer = base64ToArrayBuffer(impulseResponse);
audioContext.decodeAudioData(reverbSoundArrayBuffer,
function(buffer) {
reverbNode.buffer = buffer;
},
function(e) {
alert("Error when decoding audio data" + e.err);
});
// Connect the audio chain together
source.connect(gainNode);
gainNode.connect(reverbNode);
reverbNode.connect(audioContext.destination);
avaVoice.play();
var intervalId = setInterval(updateTime);
}
window.addEventListener("click", function(){
isPlaying = true
});
initSound();
var isplay=false;
听力语境;
声音;
var gainNode;
var混响节点;
var pannerNode;
var-updateTime=200;
var global=全局| |窗口;
var avaVoiceDataUri=Base64 ToArrayBuffer(“UKLGRG6DABXQVZFZM10IBaaaaaaaaaaaaaaahcbaadkcaagabgaymv4dfocabendw0aw1lzglhgLighludgVyzmfjzbzb3Vuzcblzly3quifvjieh1Zcbtb2rlcm4gyw5kifnjawvuvudglmawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
var PulseResponse=base64ToArrayBuffer(“数据:音频/wav;base64,UKLGRHCJBWBXQVZFZM10IBAAAAAAAAAAKWAGJBAAGABGGF0YEYIBWAAAAAAAAAAADRBWDKBGCWAQBA+/8y6v/yuP8JAQA2R/”;
函数base64到ArrayBuffer(base64){
var binaryString=window.atob(base64);
var len=binaryString.length;
var字节=新的Uint8Array(len);
对于(变量i=0;i
您的base64无效
在我看来,你的结尾缺少了一个A
。如果你加上它,它就可以解码了
另外请注意,如果您使用的是atob
,则不会包含数据URI部分
如果您一开始就有一个数据URI,那么应该使用Fetch API来获取Blob,这样就可以包含MIME类型。然后可以直接从中解码音频数据。另请参见:base64字符串只是实际字符串的一小部分。我不想把整件事都贴出来,因为它太大了。我可能会尝试使用您提到的fetchapi,看看是否有效。谢谢而且,我从来没有用Fetch得到过一个blob。在我的代码上下文中,它到底是什么样子的?我一直在研究它,但我找不到任何人在类似的情况下使用它。再次感谢!