File size: 1,994 Bytes
23590ba
4164780
23590ba
edcef16
 
b90ae45
 
c80867b
 
4164780
 
 
17fd256
c80867b
4164780
c80867b
 
 
 
07478ab
c80867b
 
 
b90ae45
4164780
c80867b
 
 
 
b90ae45
c80867b
edcef16
c80867b
 
 
b90ae45
c80867b
b90ae45
c80867b
 
 
 
 
 
 
 
 
 
b90ae45
c80867b
 
4164780
b90ae45
c80867b
4164780
edcef16
 
 
981b713
9225a67
b90ae45
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
import os
import wave
import json
import tempfile
import ffmpeg
import eventlet
import eventlet.wsgi
from flask import Flask
from flask_socketio import SocketIO, emit
from vosk import Model, KaldiRecognizer

# Khởi tạo Flask app
app = Flask(__name__)
socketio = SocketIO(app, cors_allowed_origins="*")

# Load model Vosk
MODEL_PATH = "model/vosk-model"
print("\u2705 Đang tải model Vosk...")
model = Model(MODEL_PATH)

# Xử lý âm thanh WebM từng đoạn
@socketio.on("audio_chunk")
def handle_audio_chunk(data):
    webm_path, wav_path = None, None
    try:
        # Lưu WebM tạm thời
        with tempfile.NamedTemporaryFile(suffix=".webm", delete=False) as temp_webm:
            webm_path = temp_webm.name
            temp_webm.write(data)

        # Chuyển đổi sang WAV
        wav_path = tempfile.mktemp(suffix=".wav")
        ffmpeg.input(webm_path).output(
            wav_path, acodec="pcm_s16le", ac=1, ar=16000, format="wav"
        ).run(overwrite_output=True, quiet=True)

        # Nhận diện giọng nói
        result_text = ""
        with wave.open(wav_path, "rb") as wf:
            rec = KaldiRecognizer(model, wf.getframerate())
            while True:
                data = wf.readframes(4000)
                if len(data) == 0:
                    break
                if rec.AcceptWaveform(data):
                    result_text += json.loads(rec.Result()).get("text", "") + " "
                else:
                    result_text += json.loads(rec.PartialResult()).get("partial", "") + " "

        # Gửi kết quả về client
        emit("stt_result", {"text": result_text.strip()})
    except Exception as e:
        print(f"Lỗi xử lý audio_chunk: {e}")
        emit("stt_error", {"error": str(e)})
    finally:
        for path in [webm_path, wav_path]:
            if path and os.path.exists(path):
                os.remove(path)

if __name__ == "__main__":
    eventlet.wsgi.server(eventlet.listen(("0.0.0.0", 7860)), app)