Spaces:
Build error
Build error
/** | |
* src/utils/audioUtils.js | |
* Audio playback. | |
* | |
* created by Lynchee on 7/16/23 | |
*/ | |
const unlockAudioContext = (audioContext) => { | |
if (audioContext.state === 'suspended') { | |
const unlock = function() { | |
audioContext.resume().then(function() { | |
document.body.removeEventListener('touchstart', unlock); | |
document.body.removeEventListener('touchend', unlock); | |
}); | |
}; | |
document.body.addEventListener('touchstart', unlock, false); | |
document.body.addEventListener('touchend', unlock, false); | |
} | |
} | |
// play a single audio chunk | |
const playAudio = (audioContextRef, audioPlayer, url) => { | |
if (!audioContextRef.current) { | |
audioContextRef.current = new (window.AudioContext || window.webkitAudioContext)(); | |
unlockAudioContext(audioContextRef.current); | |
} | |
return new Promise((resolve) => { | |
audioPlayer.current.src = url; | |
audioPlayer.current.muted = true; // Start muted | |
audioPlayer.current.onended = resolve; | |
audioPlayer.current.play().then(() => { | |
audioPlayer.current.muted = false; // Unmute after playback starts | |
}).catch(error => { | |
if (error.name === 'NotSupportedError') { | |
alert(`Playback failed because: ${error}. Please check https://elevenlabs.io/subscription if you have encough characters left.`); | |
} else { | |
alert(`Playback failed because: ${error}`); | |
} | |
}); | |
}); | |
} | |
// play all audio chunks | |
export const playAudios = async (audioContextRef, audioPlayer, audioQueue, setIsPlaying) => { | |
while (audioQueue.current.length > 0) { | |
let data = audioQueue.current[0]; | |
let blob = new Blob([data], { type: 'audio/mp3' }); | |
let audioUrl = URL.createObjectURL(blob); | |
await playAudio(audioContextRef, audioPlayer, audioUrl); | |
audioQueue.current.shift(); | |
} | |
// done playing audios | |
setIsPlaying(false); | |
} | |