File size: 2,527 Bytes
c409a15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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.")
    }
}