tudeplom commited on
Commit
17fd256
·
verified ·
1 Parent(s): d1806f3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +27 -36
app.py CHANGED
@@ -1,50 +1,41 @@
1
  import os
2
  import json
3
- from fastapi import FastAPI, UploadFile, File, HTTPException
4
- from fastapi.middleware.cors import CORSMiddleware
5
- from vosk import Model, KaldiRecognizer
6
  import wave
 
 
 
 
 
 
 
 
 
7
 
8
- # Kiểm tra model
9
  MODEL_PATH = "model/vosk-model"
10
  if not os.path.exists(MODEL_PATH):
11
  raise Exception("❌ Model Vosk không tìm thấy!")
12
-
13
  print("✅ Đang tải model Vosk...")
14
  model = Model(MODEL_PATH)
15
 
16
- # Tạo app FastAPI
17
- app = FastAPI()
 
 
 
 
 
18
 
19
- # Cấu hình CORS để hỗ trợ API
20
- app.add_middleware(
21
- CORSMiddleware,
22
- allow_origins=["*"], # Cho phép tất cả nguồn
23
- allow_credentials=True,
24
- allow_methods=["*"],
25
- allow_headers=["*"],
26
- )
27
 
28
- @app.post("/stt")
29
- async def speech_to_text(audio: UploadFile = File(...)):
30
- """Nhận file âm thanh và trả về văn bản."""
31
- try:
32
- with wave.open(audio.file, "rb") as wf:
33
- if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getframerate() != 16000:
34
- raise HTTPException(status_code=400, detail="❌ File âm thanh phải là WAV mono 16kHz 16-bit.")
35
-
36
- rec = KaldiRecognizer(model, 16000)
37
- while True:
38
- data = wf.readframes(4000)
39
- if len(data) == 0:
40
- break
41
- rec.AcceptWaveform(data)
42
-
43
- result = json.loads(rec.Result())
44
- return {"text": result.get("text", "")}
45
- except Exception as e:
46
- raise HTTPException(status_code=500, detail=f"❌ Lỗi xử lý âm thanh: {str(e)}")
47
 
 
48
  if __name__ == "__main__":
49
- import uvicorn
50
- uvicorn.run(app, host="0.0.0.0", port=7860)
 
1
  import os
2
  import json
 
 
 
3
  import wave
4
+ import numpy as np
5
+ import soundfile as sf
6
+ from vosk import Model, KaldiRecognizer
7
+ from flask import Flask
8
+ from flask_socketio import SocketIO, emit
9
+
10
+ # Cấu hình Flask & WebSocket
11
+ app = Flask(__name__)
12
+ socketio = SocketIO(app, cors_allowed_origins="*")
13
 
14
+ # Kiểm tra và load model Vosk
15
  MODEL_PATH = "model/vosk-model"
16
  if not os.path.exists(MODEL_PATH):
17
  raise Exception("❌ Model Vosk không tìm thấy!")
 
18
  print("✅ Đang tải model Vosk...")
19
  model = Model(MODEL_PATH)
20
 
21
+ # Tạo bộ nhận diện giọng nói
22
+ rec = KaldiRecognizer(model, 16000)
23
+
24
+ # Xử lý dữ liệu âm thanh nhận từ client
25
+ @socketio.on("audio_chunk")
26
+ def handle_audio(audio_data):
27
+ print(f"📩 Nhận dữ liệu âm thanh: {len(audio_data)} bytes")
28
 
29
+ # Chuyển đổi dữ liệu âm thanh thành numpy array
30
+ audio_np = np.frombuffer(audio_data, dtype=np.int16)
 
 
 
 
 
 
31
 
32
+ # Nhận diện giọng nói
33
+ if rec.AcceptWaveform(audio_np.tobytes()):
34
+ result = json.loads(rec.Result())
35
+ text = result.get("text", "")
36
+ print(f"📤 Kết quả nhận diện: {text}")
37
+ emit("stt_result", {"text": text}) # Gửi kết quả về client theo thời gian thực
 
 
 
 
 
 
 
 
 
 
 
 
 
38
 
39
+ # Chạy Flask server
40
  if __name__ == "__main__":
41
+ socketio.run(app, host="0.0.0.0", port=5000, debug=True)