Spaces:
Sleeping
Sleeping
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.") | |
} | |
} |