|
|
import os |
|
|
import wave |
|
|
import json |
|
|
import asyncio |
|
|
import websockets |
|
|
import uuid |
|
|
from vosk import Model, KaldiRecognizer |
|
|
|
|
|
|
|
|
MODEL_PATH = "model/vosk-model" |
|
|
|
|
|
|
|
|
if not os.path.exists(MODEL_PATH): |
|
|
raise Exception(f"\u274C Model Vosk không tìm thấy tại {MODEL_PATH}! Kiểm tra lại.") |
|
|
|
|
|
|
|
|
print("\u2705 Đang tải model Vosk...") |
|
|
model = Model(MODEL_PATH) |
|
|
|
|
|
async def recognize_audio(websocket, path): |
|
|
print("🔵 Kết nối WebSocket mới...") |
|
|
rec = KaldiRecognizer(model, 16000) |
|
|
result_text = "" |
|
|
|
|
|
try: |
|
|
async for message in websocket: |
|
|
if isinstance(message, bytes): |
|
|
if rec.AcceptWaveform(message): |
|
|
result = json.loads(rec.Result()) |
|
|
text = result.get("text", "") |
|
|
result_text += text + " " |
|
|
await websocket.send(json.dumps({"text": text})) |
|
|
else: |
|
|
await websocket.send(json.dumps({"error": "Dữ liệu không hợp lệ"})) |
|
|
except websockets.exceptions.ConnectionClosed: |
|
|
print("🔴 Kết nối WebSocket đã đóng") |
|
|
finally: |
|
|
print(f"✅ Văn bản cuối cùng: {result_text.strip()}") |
|
|
|
|
|
|
|
|
start_server = websockets.serve(recognize_audio, "0.0.0.0", 7860) |
|
|
print("🚀 WebSocket STT server đang chạy trên ws://0.0.0.0:7860") |
|
|
|
|
|
asyncio.get_event_loop().run_until_complete(start_server) |
|
|
asyncio.get_event_loop().run_forever() |
|
|
|