const startBtn = document.getElementById("startBtn"); const stopBtn = document.getElementById("stopBtn"); const transcriptDiv = document.getElementById("transcript"); let mediaRecorder; let stream; startBtn.onclick = async () => { stream = await navigator.mediaDevices.getUserMedia({ audio: true }); mediaRecorder = new MediaRecorder( stream, { mimeType: "audio/webm;codecs=opus" } ); console.log( "mime type:", mediaRecorder.mimeType ); mediaRecorder.ondataavailable = async (event) => { console.log( "chunk size:", event.data.size ); if (event.data.size === 0) { return; } try { const formData = new FormData(); formData.append( "file", event.data, "chunk.webm" ); const response = await fetch( "/api/v1/transcribe", { method: "POST", headers: { "X-API-KEY": "bytestrone-whisper-secret" }, body: formData } ); const result = await response.json(); console.log( "transcription result:", result ); if ( result.text && result.text.trim() !== "" ) { transcriptDiv.innerText += result.text + " "; } } catch (err) { console.error( "Upload failed:", err ); } }; mediaRecorder.start(5000); console.log( "Recording started" ); }; stopBtn.onclick = () => { if (mediaRecorder) { mediaRecorder.stop(); } if (stream) { stream.getTracks().forEach( track => track.stop() ); } console.log( "Recording stopped" ); };