client.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. let socket = new WebSocket("ws://localhost:9001");
  2. let fullSentences = [];
  3. socket.onmessage = function(event) {
  4. let data = JSON.parse(event.data);
  5. let displayDiv = document.getElementById('textDisplay');
  6. if (data.type === 'realtime') {
  7. displayRealtimeText(data.text, displayDiv);
  8. } else if (data.type === 'fullSentence') {
  9. fullSentences.push(data.text);
  10. displayRealtimeText("", displayDiv); // Refresh display with new full sentence
  11. }
  12. };
  13. function displayRealtimeText(realtimeText, displayDiv) {
  14. let displayedText = fullSentences.map((sentence, index) => {
  15. let span = document.createElement('span');
  16. span.textContent = sentence + " ";
  17. span.className = index % 2 === 0 ? 'yellow' : 'cyan';
  18. return span.outerHTML;
  19. }).join('') + realtimeText;
  20. displayDiv.innerHTML = displayedText;
  21. }
  22. // Request access to the microphone
  23. navigator.mediaDevices.getUserMedia({ audio: true })
  24. .then(stream => {
  25. let audioContext = new AudioContext();
  26. let source = audioContext.createMediaStreamSource(stream);
  27. let processor = audioContext.createScriptProcessor(256, 1, 1);
  28. source.connect(processor);
  29. processor.connect(audioContext.destination);
  30. processor.onaudioprocess = function(e) {
  31. let inputData = e.inputBuffer.getChannelData(0);
  32. let outputData = new Int16Array(inputData.length);
  33. // Convert to 16-bit PCM
  34. for (let i = 0; i < inputData.length; i++) {
  35. outputData[i] = Math.max(-32768, Math.min(32767, inputData[i] * 32768));
  36. }
  37. // Send the 16-bit PCM data to the server
  38. if (socket.readyState === WebSocket.OPEN) {
  39. // Create a JSON string with metadata
  40. let metadata = JSON.stringify({ sampleRate: audioContext.sampleRate });
  41. // Convert metadata to a byte array
  42. let metadataBytes = new TextEncoder().encode(metadata);
  43. // Create a buffer for metadata length (4 bytes for 32-bit integer)
  44. let metadataLength = new ArrayBuffer(4);
  45. let metadataLengthView = new DataView(metadataLength);
  46. // Set the length of the metadata in the first 4 bytes
  47. metadataLengthView.setInt32(0, metadataBytes.byteLength, true); // true for little-endian
  48. // Combine metadata length, metadata, and audio data into a single message
  49. let combinedData = new Blob([metadataLength, metadataBytes, outputData.buffer]);
  50. socket.send(combinedData);
  51. }
  52. };
  53. })
  54. .catch(e => console.error(e));