client.js 2.0 KB

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