File size: 1,919 Bytes
23590ba
4164780
23590ba
edcef16
 
c80867b
 
4164780
 
 
17fd256
c80867b
4164780
c80867b
 
 
 
07478ab
c80867b
 
 
4164780
c80867b
 
 
 
 
 
edcef16
c80867b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4164780
c80867b
4164780
c80867b
edcef16
 
 
981b713
9225a67
c80867b
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
import os
import wave
import json
import tempfile
import ffmpeg
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):
    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
        with wave.open(wav_path, "rb") as wf:
            rec = KaldiRecognizer(model, wf.getframerate())
            result_text = ""
            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:
        emit("stt_error", {"error": str(e)})
    finally:
        # Xóa file tạm
        for path in [webm_path, wav_path]:
            if path and os.path.exists(path):
                os.remove(path)

if __name__ == "__main__":
    socketio.run(app, host="0.0.0.0", port=7860, debug=True)