const initialMessage = '' const loadingModal = document.getElementById('loadingModal'); const messageHistory = document.getElementById('chatHistory') let mediaRecorder; let audioChunks = []; let socket function makeLoading() { loadingModal.style.visibility = 'visible'; } function stopLoading() { loadingModal.style.visibility = 'hidden'; } function startCall() { const uuid = generateUUID() messageHistory.innerHTML = `` socket = new WebSocket(`wss://brestok-poke-bowl-ai.hf.space/ws/${uuid}`); socket.onopen = () => { startRecording() }; socket.onclose = (event) => console.log('WebSocket disconnected', event); socket.onerror = (error) => { alert('Something was wrong. Try again later.') window.location.reload() }; socket.onmessage = (event) => playResponse(event.data); } const startRecording = () => { showMessage('You can speak!') navigator.mediaDevices.getUserMedia({audio: true}) .then(stream => { mediaRecorder = new MediaRecorder(stream); try { mediaRecorder.ondataavailable = (event) => { audioChunks.push(event.data) }; } catch (e) { alert('It is not possible to send an empty message') } mediaRecorder.start(); }) .catch(error => { console.error('Error accessing the microphone', error); }); }; const stopAndSend = () => { makeLoading() mediaRecorder.ondataavailable = (event) => { audioChunks.push(event.data) console.log(audioChunks) const audioBlob = new Blob(audioChunks, {type: 'audio/wav'}); const reader = new FileReader(); reader.readAsDataURL(audioBlob); reader.onloadend = () => { let base64String = reader.result; base64String = base64String.split(',')[1]; const dataWS = { 'audio': base64String, } console.log(dataWS) socket.send(JSON.stringify(dataWS)); audioChunks = []; } } try { mediaRecorder.stop(); } catch (e) { return } } const playResponse = (data, initMessage = false) => { data = JSON.parse(data) if (!initMessage) { const aiResponse = data['ai_response'] if (aiResponse.startsWith('https://blue-estate-agency.com/') || aiResponse.startsWith('http://blue-estate-agency.com/')) { window.open(aiResponse, '_blank'); } } const audioSrc = `data:audio/mp3;base64,${data['voice_response']}`; const audio = new Audio(audioSrc); stopLoading() if (!initMessage) { createMessage('User', data['user_query']) } audio.play(); audio.onended = () => { startRecording() if (!initMessage) { createMessage('Assistant', data['ai_response']) } }; } function endCall() { if (mediaRecorder && mediaRecorder.state !== 'inactive') { mediaRecorder.stop(); audioChunks = [] } if (socket && socket.readyState === WebSocket.OPEN) { socket.close(); } showMessage('The call is ended') } function generateUUID() { const arr = new Uint8Array(16); window.crypto.getRandomValues(arr); arr[6] = (arr[6] & 0x0f) | 0x40; arr[8] = (arr[8] & 0x3f) | 0x80; return ([...arr].map((b, i) => (i === 4 || i === 6 || i === 8 || i === 10 ? "-" : "") + b.toString(16).padStart(2, "0") ).join("")); } function showMessage(message_text) { const message = document.getElementById('message'); message.innerText = message_text message.style.display = 'block'; setTimeout(function () { message.style.display = 'none'; }, 2000); } function createMessage(type, message) { const newMessage = document.createElement('div') newMessage.className = 'message rounded-4 bg-white mb-4 mx-4 py-2 px-3 border' newMessage.innerHTML = `