|
@@ -80,12 +80,17 @@
|
|
audioStreamSource.connect(analyser);
|
|
audioStreamSource.connect(analyser);
|
|
|
|
|
|
const bufferLength = analyser.frequencyBinCount;
|
|
const bufferLength = analyser.frequencyBinCount;
|
|
|
|
+
|
|
|
|
+ const domainData = new Uint8Array(bufferLength);
|
|
const timeDomainData = new Uint8Array(analyser.fftSize);
|
|
const timeDomainData = new Uint8Array(analyser.fftSize);
|
|
|
|
|
|
|
|
+ let lastSoundTime = Date.now();
|
|
|
|
+
|
|
const detectSound = () => {
|
|
const detectSound = () => {
|
|
const processFrame = () => {
|
|
const processFrame = () => {
|
|
if (recording && !loading) {
|
|
if (recording && !loading) {
|
|
analyser.getByteTimeDomainData(timeDomainData);
|
|
analyser.getByteTimeDomainData(timeDomainData);
|
|
|
|
+ analyser.getByteFrequencyData(domainData);
|
|
|
|
|
|
// Calculate RMS level from time domain data
|
|
// Calculate RMS level from time domain data
|
|
const rmsLevel = calculateRMS(timeDomainData);
|
|
const rmsLevel = calculateRMS(timeDomainData);
|
|
@@ -98,6 +103,16 @@
|
|
}
|
|
}
|
|
|
|
|
|
visualizerData = visualizerData;
|
|
visualizerData = visualizerData;
|
|
|
|
+
|
|
|
|
+ if (domainData.some((value) => value > 0)) {
|
|
|
|
+ lastSoundTime = Date.now();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (recording && Date.now() - lastSoundTime > 3000) {
|
|
|
|
+ if ($settings?.speechAutoSend ?? false) {
|
|
|
|
+ confirmRecording();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
window.requestAnimationFrame(processFrame);
|
|
window.requestAnimationFrame(processFrame);
|
|
@@ -203,6 +218,7 @@
|
|
rounded-full"
|
|
rounded-full"
|
|
on:click={async () => {
|
|
on:click={async () => {
|
|
dispatch('cancel');
|
|
dispatch('cancel');
|
|
|
|
+ stopRecording();
|
|
}}
|
|
}}
|
|
>
|
|
>
|
|
<svg
|
|
<svg
|