Demo Update 31
This commit is contained in:
@@ -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>
|
||||||
Reference in New Issue
Block a user