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) |