File size: 2,384 Bytes
8ede856
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
64
65
66
67
68
69
70
71
72
73
74
75
import { ref } from 'vue';
import axios from 'axios';

export function useRecording() {
    const isRecording = ref(false);
    const audioChunks = ref<Blob[]>([]);
    const mediaRecorder = ref<MediaRecorder | null>(null);

    async function startRecording(onStart?: (label: string) => void) {
        try {
            const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
            mediaRecorder.value = new MediaRecorder(stream);
            
            mediaRecorder.value.ondataavailable = (event) => {
                audioChunks.value.push(event.data);
            };
            
            mediaRecorder.value.start();
            isRecording.value = true;
            
            if (onStart) {
                onStart('录音中...');
            }
        } catch (error) {
            console.error('Failed to start recording:', error);
        }
    }

    async function stopRecording(onStop?: (label: string) => void): Promise<string> {
        return new Promise((resolve, reject) => {
            if (!mediaRecorder.value) {
                reject('No media recorder');
                return;
            }

            isRecording.value = false;
            if (onStop) {
                onStop('聊天输入框');
            }

            mediaRecorder.value.stop();
            mediaRecorder.value.onstop = async () => {
                const audioBlob = new Blob(audioChunks.value, { type: 'audio/wav' });
                audioChunks.value = [];

                mediaRecorder.value?.stream.getTracks().forEach(track => track.stop());

                const formData = new FormData();
                formData.append('file', audioBlob);

                try {
                    const response = await axios.post('/api/chat/post_file', formData, {
                        headers: {
                            'Content-Type': 'multipart/form-data'
                        }
                    });

                    const audio = response.data.data.filename;
                    console.log('Audio uploaded:', audio);
                    resolve(audio);
                } catch (err) {
                    console.error('Error uploading audio:', err);
                    reject(err);
                }
            };
        });
    }

    return {
        isRecording,
        startRecording,
        stopRecording
    };
}