api-stt / app.py
tudeplom's picture
Update app.py
cac01fd verified
raw
history blame
1.74 kB
import os
import json
import asyncio
from fastapi import FastAPI, WebSocket
from fastapi.middleware.cors import CORSMiddleware
from vosk import Model, KaldiRecognizer
import uvicorn
# Kiểm tra model
MODEL_PATH = "model/vosk-model"
if not os.path.exists(MODEL_PATH):
raise Exception("❌ Model Vosk không tìm thấy!")
print("✅ Đang tải model Vosk...")
model = Model(MODEL_PATH)
# Tạo app FastAPI
app = FastAPI()
# Cấu hình CORS để hỗ trợ WebSocket
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Cho phép tất cả nguồn
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.websocket("/ws") # Phải là "/ws" (không phải "/")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
rec = KaldiRecognizer(model, 16000)
result_text = ""
print("🔵 Client đã kết nối WebSocket!")
try:
while True:
message = await websocket.receive_bytes() # Nhận bytes từ WebSocket
print(f"📩 Nhận dữ liệu ({len(message)} bytes)")
if rec.AcceptWaveform(message):
result = json.loads(rec.Result())
text = result.get("text", "")
result_text += text + " "
await websocket.send_json({"text": text}) # Gửi kết quả về client
print(f"📤 Gửi kết quả: {text}")
except Exception as e:
print(f"🔴 Lỗi WebSocket: {e}")
await websocket.close(code=1011, reason="Lỗi xử lý dữ liệu")
finally:
print(f"✅ Văn bản cuối cùng: {result_text.strip()}")
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=7860)