async function startCall() { const uuid = generateUUID() const socket = new WebSocket(`ws://127.0.0.1:8000/ws/${uuid}`) socket.onopen = () => { startRecording() } socket.onclose = event => console.log('WebSocket disconnected', event) socket.onerror = error => alert('Something was wrong. Try again later.') socket.onmessage = event => playResponse(event.data) const audioContext = new AudioContext() await audioContext.audioWorklet.addModule('volume-meter-processor.js') const node = new AudioWorkletNode(audioContext, 'volume-meter-processor') navigator.mediaDevices.getUserMedia({audio: true}).then(stream => { const source = audioContext.createMediaStreamSource(stream) source.connect(node) node.connect(audioContext.destination) // для отладки }) node.port.onmessage = event => { const audioData = event.data // предположим, что это уже Blob или MediaStream const reader = new FileReader() reader.readAsDataURL(audioData) reader.onloadend = () => { const base64Audio = reader.result.split(',')[1] socket.send(JSON.stringify({audio: base64Audio})) } } } async function startRecording() { try { if (!window.audioContext) { window.audioContext = new AudioContext() await window.audioContext.audioWorklet.addModule('volume-meter-processor.js') window.audioNode = new AudioWorkletNode(window.audioContext, 'volume-meter-processor') window.audioNode.port.onmessage = event => { const audioData = event.data const blob = new Blob(audioData, { type: 'audio/webm' }) const reader = new FileReader() reader.readAsDataURL(blob) reader.onloadend = () => { const base64Audio = reader.result.split(',')[1] socket.send(JSON.stringify({ audio: base64Audio })) } } } const stream = await navigator.mediaDevices.getUserMedia({ audio: true }) const source = window.audioContext.createMediaStreamSource(stream) source.connect(window.audioNode) window.audioNode.connect(window.audioContext.destination) console.log("Recording started") } catch (error) { console.error("Error accessing microphone:", error) alert("Cannot access microphone. Please check permissions.") } }