Javascript base64ToArrayBuffer错误:未能执行';atob&x27;在';窗口&x27;。(网络音频API)

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以轻微静态的形式激活。然而,我

因此,我对网络音频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—这两种方法都不起作用

任何帮助都将受到感谢

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。在我的代码上下文中,它到底是什么样子的?我一直在研究它,但我找不到任何人在类似的情况下使用它。再次感谢!