tudeplom commited on
Commit
4164780
·
verified ·
1 Parent(s): 65edca3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +97 -47
app.py CHANGED
@@ -1,57 +1,107 @@
1
  import os
 
2
  import json
 
 
 
3
  import numpy as np
4
- from vosk import Model, KaldiRecognizer
5
  from flask import Flask, request, jsonify
6
- from flask_restx import Api, Resource
 
 
7
 
8
- # Cấu hình Flask
 
 
 
 
 
9
  app = Flask(__name__)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
- # Tạo đối tượng API với Swagger documentation
12
- 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')
13
 
14
- # Kiểm tra và load model Vosk
15
- MODEL_PATH = "model/vosk-model" # Thay thế bằng đường dẫn đến mô hình Vosk của bạn
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
- # API nhận dữ liệu âm thanh và trả kết quả nhận diện giọng nói
25
- @api.route('/stt')
26
- class SpeechToText(Resource):
27
- def post(self):
28
- """
29
- Nhận dữ liệu âm thanh và trả về kết quả nhận diện giọng nói.
30
- """
31
- # Kiểm tra xem có tệp âm thanh không
32
- if 'file' not in request.files:
33
- return jsonify({"error": "Không có tệp âm thanh trong yêu cầu."}), 400
34
-
35
- audio_file = request.files['file']
36
-
37
- # Đọc dữ liệu âm thanh từ tệp
38
- audio_data = audio_file.read()
39
- print(f"📩 Nhận dữ liệu âm thanh: {len(audio_data)} bytes")
40
-
41
- # Chuyển đổi dữ liệu âm thanh thành numpy array (16-bit mono)
42
- audio_np = np.frombuffer(audio_data, dtype=np.int16)
43
-
44
- # Nhận diện giọng nói
45
- if rec.AcceptWaveform(audio_np.tobytes()):
46
- result = json.loads(rec.Result())
47
- text = result.get("text", "")
48
- print(f"📤 Kết quả nhận diện: {text}")
49
- return jsonify({"text": text}) # Gửi kết quả nhận diện về client
50
- else:
51
- # Nếu không có kết quả nhận diện hoặc dữ liệu chưa đủ để nhận diện
52
- return jsonify({"text": ""}) # Trả về chuỗi rỗng nếu không có kết quả
53
-
54
- # Chạy Flask server
55
  if __name__ == "__main__":
56
- print("🚀 API Flask đang chạy tại http://localhost:5000")
57
- app.run(host="0.0.0.0", port=5000, debug=True)
 
1
  import os
2
+ import wave
3
  import json
4
+
5
+
6
+ import uuid
7
  import numpy as np
 
8
  from flask import Flask, request, jsonify
9
+ from flask_cors import CORS
10
+ from vosk import Model, KaldiRecognizer
11
+ from flasgger import Swagger
12
 
13
+ # Thư mục chứa model
14
+ MODEL_PATH = "model/vosk-model"
15
+ print("\u2705 Đang tải model Vosk...")
16
+ model = Model(MODEL_PATH)
17
+
18
+ # Khởi tạo Flask app
19
  app = Flask(__name__)
20
+ CORS(app)
21
+ Swagger(app)
22
+
23
+ @app.route("/")
24
+ def home():
25
+ """API Home
26
+ ---
27
+ responses:
28
+ 200:
29
+ description: API đang chạy
30
+ """
31
+ return "\u2705 Vosk STT API đang chạy!"
32
+
33
+ @app.route("/stt", methods=["POST"])
34
+ def stt():
35
+ """Chuyển đổi giọng nói thành văn bản (Speech-to-Text)
36
+ ---
37
+ consumes:
38
+ - multipart/form-data
39
+ parameters:
40
+ - in: formData
41
+ name: audio
42
+ type: file
43
+ required: true
44
+ description: File âm thanh WAV mono PCM
45
+ responses:
46
+ 200:
47
+ description: Kết quả chuyển đổi văn bản
48
+ schema:
49
+ type: object
50
+ properties:
51
+ text:
52
+ type: string
53
+ example: "Xin chào thế giới"
54
+ 400:
55
+ description: Lỗi nếu file âm thanh không hợp lệ hoặc không tìm thấy
56
+ """
57
+ if "audio" not in request.files:
58
+ return jsonify({"error": "Không tìm thấy file audio!"}), 400
59
+
60
+ audio_file = request.files["audio"]
61
+ file_path = f"/tmp/{uuid.uuid4()}.wav" # Lưu vào thư mục tạm để tránh lỗi quyền hạn
62
+ audio_file.save(file_path)
63
+
64
+ try:
65
+ # Mở file âm thanh
66
+ wf = wave.open(file_path, "rb")
67
+
68
+ # Kiểm tra file có đúng định dạng WAV mono không
69
+ if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getcomptype() != "NONE":
70
+ return jsonify({"error": "File audio phải là WAV mono PCM!"}), 400
71
+
72
+ rec = KaldiRecognizer(model, wf.getframerate())
73
+ result_text = ""
74
+
75
+ while True:
76
+ data = wf.readframes(4000)
77
+ if len(data) == 0:
78
+ break
79
+ if rec.AcceptWaveform(data):
80
+ result_text += json.loads(rec.Result())["text"] + " "
81
+
82
+ return jsonify({"text": result_text.strip()})
83
+
84
+ except Exception as e:
85
+ return jsonify({"error": str(e)}), 500
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+ finally:
100
+ wf.close()
101
+ os.remove(file_path) # Xóa file tạm
102
+
103
 
 
 
104
 
 
 
 
 
 
 
105
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
  if __name__ == "__main__":
107
+ app.run(host="0.0.0.0", port=7860, debug=True)