Ваш подход с использованием второго буфера почти правильный. Вам просто нужно использовать абсолютное время начала, а не относительное. Чтобы получить абсолютное время и текущее время звукового контекста и продолжительность звука:
// Play first sound now
var source1 = context.createBufferSource();
source1.buffer = response;
source1.start(context.currentTime); // This is the same as source1.start();
// Play second sound with a delay
var source2 = context.createBufferSource();
source2.buffer = response;
source2.start(context.currentTime + response.duration);
Этот подход обеспечивает воспроизведение без пауз (если ваши файлы без пауз).
Вы можете обернуть это в простойфункция:
function play(context, buffer, delay=0) {
var source = context.createBufferSource();
source.buffer = buffer;
source.start(context.currentTime + delay);
return source;
}
...
// Play the sound twice, one after another
play(context, response, 0);
play(context, response, response.duration);