diff src/chat.js @ 14:47b00cce8b53

stt
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 29 Jul 2025 00:12:05 -0600
parents 65bd7e245c63
children 3a80ddafe5a4
line wrap: on
line diff
--- a/src/chat.js	Thu Jul 24 22:47:48 2025 -0600
+++ b/src/chat.js	Tue Jul 29 00:12:05 2025 -0600
@@ -71,7 +71,7 @@
 function fixTextarea(textarea) {
 	textarea.style.height = 'initial';
 	textarea.style.height = (textarea.scrollHeight+2) + 'px';
-	textarea.scrollIntoViewIfNeeded(false);
+	textarea.parentNode.scrollIntoViewIfNeeded(false);
 }
 
 function askAi() {
@@ -82,3 +82,42 @@
 	fixTextarea(input);
 	showWaitingAiIcon();
 }
+
+
+function setText(text) {
+	let textarea = document.querySelector('textarea');
+	textarea.value = text;
+	fixTextarea(textarea);
+}
+
+let recorder = null;
+let chunks;
+
+function startRecording() {
+	chunks = [];
+	function record(stream) {
+		recorder = new MediaRecorder( stream, { mimeType: 'audio/webm;codecs=opus' } );
+		recorder.ondataavailable = function(event) {
+			chunks.push(event.data);
+		};
+		recorder.onstop = function(event) {
+			recorder = null;
+			let blob = new Blob(chunks, { type: 'audio/webm' });
+			let formData = new FormData();
+			formData.append('audio', blob, 'recording.webm');
+			ajax('stt.js',formData);
+			document.querySelector('button[record]').textContent = 'Record';
+		};
+		recorder.start();
+	}
+	navigator.mediaDevices.getUserMedia({ audio: { channelCount: 1 } }).then(record);
+	document.querySelector('button[record]').textContent = 'Stop Recording';
+}
+
+function toggleRecording() {
+	if( recorder === null ) {
+		startRecording();
+	} else {
+		recorder.stop();
+	}
+}