Demo Update 31

This commit is contained in:
2025-03-30 11:54:32 -04:00
parent e646a2a47b
commit 48daa8bf0e

View File

@@ -511,31 +511,29 @@
// Create audio source from stream // Create audio source from stream
const source = audioContext.createMediaStreamSource(mediaStream); const source = audioContext.createMediaStreamSource(mediaStream);
// Create ScriptProcessor for audio processing // Load and register the audio worklet
const bufferSize = 4096; await audioContext.audioWorklet.addModule('/static/js/audio-processor.js');
audioProcessor = audioContext.createScriptProcessor(bufferSize, 1, 1);
// Process audio data // Create the audio worklet node
audioProcessor.onaudioprocess = (event) => { const workletNode = new AudioWorkletNode(audioContext, 'audio-processor');
// Listen for messages from the processor
workletNode.port.onmessage = (event) => {
if (!isListening || isAiSpeaking) return; if (!isListening || isAiSpeaking) return;
const input = event.inputBuffer.getChannelData(0); // Process audio data
const audioData = convertFloat32ToInt16(input); const audioData = event.data.audioData;
sendAudioChunk(audioData); const audioInt16 = convertFloat32ToInt16(audioData);
sendAudioChunk(audioInt16);
}; };
// Connect the nodes // Connect the nodes
source.connect(audioProcessor); source.connect(workletNode);
audioProcessor.connect(audioContext.destination); workletNode.connect(audioContext.destination);
} }
// Clean up audio resources // Clean up audio resources
function cleanupAudio() { function cleanupAudio() {
if (audioProcessor) {
audioProcessor.disconnect();
audioProcessor = null;
}
if (mediaStream) { if (mediaStream) {
mediaStream.getTracks().forEach(track => track.stop()); mediaStream.getTracks().forEach(track => track.stop());
mediaStream = null; mediaStream = null;
@@ -718,6 +716,26 @@
loadingDiv.style.display = 'none'; loadingDiv.style.display = 'none';
} }
}); });
class AudioProcessor extends AudioWorkletProcessor {
constructor() {
super();
}
process(inputs, outputs) {
// Get input data
const input = inputs[0];
if (input.length > 0 && input[0].length > 0) {
// Post the audio data to the main thread
this.port.postMessage({
audioData: input[0]
});
}
return true; // Keep the processor alive
}
}
registerProcessor('audio-processor', AudioProcessor);
</script> </script>
</body> </body>
</html> </html>