import os import json import numpy as np from vosk import Model, KaldiRecognizer from flask import Flask, request, jsonify from flask_restplus import Api, Resource, reqparse # Cấu hình Flask app = Flask(__name__) # Tạo đối tượng API với Swagger documentation api = Api(app, version='1.0', title='Vosk STT API', description='API cho nhận diện giọng nói sử dụng Vosk') # Kiểm tra và load model Vosk MODEL_PATH = "model/vosk-model" # Thay thế bằng đường dẫn đến mô hình Vosk của bạn 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 bộ nhận diện giọng nói rec = KaldiRecognizer(model, 16000) # API nhận dữ liệu âm thanh và trả kết quả nhận diện giọng nói @api.route('/stt') class SpeechToText(Resource): def post(self): """ Nhận dữ liệu âm thanh và trả về kết quả nhận diện giọng nói. """ # Kiểm tra xem có tệp âm thanh không if 'file' not in request.files: return jsonify({"error": "Không có tệp âm thanh trong yêu cầu."}), 400 audio_file = request.files['file'] # Đọc dữ liệu âm thanh từ tệp audio_data = audio_file.read() print(f"📩 Nhận dữ liệu âm thanh: {len(audio_data)} bytes") # Chuyển đổi dữ liệu âm thanh thành numpy array (16-bit mono) audio_np = np.frombuffer(audio_data, dtype=np.int16) # Nhận diện giọng nói if rec.AcceptWaveform(audio_np.tobytes()): result = json.loads(rec.Result()) text = result.get("text", "") print(f"📤 Kết quả nhận diện: {text}") return jsonify({"text": text}) # Gửi kết quả nhận diện về client else: # Nếu không có kết quả nhận diện hoặc dữ liệu chưa đủ để nhận diện return jsonify({"text": ""}) # Trả về chuỗi rỗng nếu không có kết quả # Chạy Flask server if __name__ == "__main__": print("🚀 API Flask đang chạy tại http://localhost:5000") app.run(host="0.0.0.0", port=5000, debug=True)