tudeplom commited on
Commit
b7dec53
·
verified ·
1 Parent(s): 65f7061

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +35 -41
app.py CHANGED
@@ -2,19 +2,18 @@ import json
2
  import tempfile
3
  import ffmpeg
4
  import os
5
-
6
  from flask import Flask, request, jsonify
7
  from flask_cors import CORS
8
-
9
-
10
  from vosk import Model, KaldiRecognizer
11
  from flasgger import Swagger
12
 
13
- # Thư mục chứa model
14
-
15
-
16
-
17
 
 
18
  MODEL_PATH = "model/vosk-model"
19
  print("\u2705 Đang tải model Vosk...")
20
  model = Model(MODEL_PATH)
@@ -58,6 +57,12 @@ def stt():
58
  if "file" not in request.files:
59
  return jsonify({"error": "Không tìm thấy file âm thanh! Vui lòng gửi trường 'file'."}), 400
60
 
 
 
 
 
 
 
61
  webm_path = temp_webm_file.name
62
  audio_file.save(webm_path)
63
 
@@ -66,11 +71,10 @@ def stt():
66
  os.remove(webm_path)
67
  return jsonify({"error": "Tệp âm thanh quá nhỏ hoặc rỗng!"}), 400
68
 
69
- # Đường dẫn file WAV tạm thời sau khi chuyển đổi
70
- wav_path = None
71
- wf = None
72
  try:
73
- # Kiểm tra tệp WebM bằng ffprobe trước khi chuyển đổi
74
  try:
75
  probe = ffmpeg.probe(webm_path)
76
  if 'streams' not in probe or not any(s['codec_type'] == 'audio' for s in probe['streams']):
@@ -80,45 +84,38 @@ def stt():
80
  return jsonify({"error": f"Lỗi kiểm tra tệp WebM: {error_message}"}), 500
81
 
82
  # Chuyển đổi WebM sang WAV mono PCM
83
- wav_path = tempfile.mktemp(suffix=".wav")
84
- stream = ffmpeg.input(webm_path)
85
- stream = ffmpeg.output(
86
- stream,
87
- wav_path,
88
- acodec="pcm_s16le", # PCM 16-bit signed little-endian
89
- ac=1, # Mono
90
- ar=16000, # Tần số mẫu 16kHz, phù hợp với Vosk
91
- format="wav"
92
- )
93
- # Thêm cờ -vn để bỏ qua video nếu có và -y để ghi đè
94
- ffmpeg.run(stream, overwrite_output=True, quiet=True, capture_stdout=True, capture_stderr=True)
95
-
96
- # Mở file WAV đã chuyển đổi
97
  wf = wave.open(wav_path, "rb")
98
 
99
- # Kiểm tra định dạng WAV mono PCM
100
  if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getcomptype() != "NONE":
101
- return jsonify({"error": "Định dạng WAV sau chuyển đổi không đúng!"}), 400
102
-
 
103
 
104
- # Khởi tạo KaldiRecognizer
105
  rec = KaldiRecognizer(model, wf.getframerate())
106
  result_text = ""
107
 
108
- # Đọc và xử lý dữ liệu âm thanh
109
  while True:
110
  data = wf.readframes(4000)
111
  if len(data) == 0:
 
 
 
112
  result_text += result.get("text", "") + " "
113
  else:
114
  partial_result = json.loads(rec.PartialResult())
115
  if partial_result.get("partial", ""):
116
  result_text += partial_result["partial"] + " "
117
 
118
- # Trả về kết quả đã xử lý
119
- final_text = result_text.strip()
120
- if not final_text:
121
- final_text = "Không nh��n diện được nội dung âm thanh."
122
  return jsonify({"text": final_text})
123
 
124
  except ffmpeg.Error as e:
@@ -126,15 +123,12 @@ def stt():
126
  return jsonify({"error": f"Lỗi chuyển đổi âm thanh từ WebM sang WAV: {error_message}"}), 500
127
  except Exception as e:
128
  return jsonify({"error": f"Lỗi xử lý âm thanh: {str(e)}"}), 500
129
-
130
  finally:
131
- # Đóng file WAV nếu đã mở
132
- if wf is not None:
133
- wf.close()
134
  # Xóa các file tạm
135
- for path in [webm_path, wav_path]:
136
- if path and os.path.exists(path):
137
- os.remove(path)
 
138
 
139
  if __name__ == "__main__":
140
  app.run(host="0.0.0.0", port=7860, debug=True)
 
2
  import tempfile
3
  import ffmpeg
4
  import os
5
+ import wave # ✅ Fix lỗi thiếu import wave
6
  from flask import Flask, request, jsonify
7
  from flask_cors import CORS
 
 
8
  from vosk import Model, KaldiRecognizer
9
  from flasgger import Swagger
10
 
11
+ # Khởi tạo Flask app trước khi sử dụng
12
+ app = Flask(__name__)
13
+ CORS(app)
14
+ Swagger(app)
15
 
16
+ # Load model Vosk
17
  MODEL_PATH = "model/vosk-model"
18
  print("\u2705 Đang tải model Vosk...")
19
  model = Model(MODEL_PATH)
 
57
  if "file" not in request.files:
58
  return jsonify({"error": "Không tìm thấy file âm thanh! Vui lòng gửi trường 'file'."}), 400
59
 
60
+ audio_file = request.files["file"]
61
+ if audio_file.filename == "":
62
+ return jsonify({"error": "Không có file được chọn!"}), 400
63
+
64
+ # Lưu file WebM tạm thời
65
+ with tempfile.NamedTemporaryFile(suffix=".webm", delete=False) as temp_webm_file:
66
  webm_path = temp_webm_file.name
67
  audio_file.save(webm_path)
68
 
 
71
  os.remove(webm_path)
72
  return jsonify({"error": "Tệp âm thanh quá nhỏ hoặc rỗng!"}), 400
73
 
74
+ # Xử tệp WebM -> WAV
75
+ wav_path = tempfile.mktemp(suffix=".wav")
 
76
  try:
77
+ # Kiểm tra tệp WebM chứa audio hợp lệ không
78
  try:
79
  probe = ffmpeg.probe(webm_path)
80
  if 'streams' not in probe or not any(s['codec_type'] == 'audio' for s in probe['streams']):
 
84
  return jsonify({"error": f"Lỗi kiểm tra tệp WebM: {error_message}"}), 500
85
 
86
  # Chuyển đổi WebM sang WAV mono PCM
87
+ ffmpeg.input(webm_path).output(
88
+ wav_path, acodec="pcm_s16le", ac=1, ar=16000
89
+ ).run(overwrite_output=True, quiet=True)
90
+
91
+ # Mở file WAV
 
 
 
 
 
 
 
 
 
92
  wf = wave.open(wav_path, "rb")
93
 
94
+ # Kiểm tra định dạng WAV hợp lệ không
95
  if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getcomptype() != "NONE":
96
+ wf.close()
97
+ os.remove(wav_path)
98
+ return jsonify({"error": "Định dạng WAV không hợp lệ!"}), 400
99
 
100
+ # Chạy Vosk để nhận diện giọng nói
101
  rec = KaldiRecognizer(model, wf.getframerate())
102
  result_text = ""
103
 
 
104
  while True:
105
  data = wf.readframes(4000)
106
  if len(data) == 0:
107
+ break
108
+ if rec.AcceptWaveform(data):
109
+ result = json.loads(rec.Result())
110
  result_text += result.get("text", "") + " "
111
  else:
112
  partial_result = json.loads(rec.PartialResult())
113
  if partial_result.get("partial", ""):
114
  result_text += partial_result["partial"] + " "
115
 
116
+ wf.close() # Đóng file WAV
117
+
118
+ final_text = result_text.strip() or "Không nhận diện được nội dung âm thanh." # ✅ Fix lỗi Unicode
 
119
  return jsonify({"text": final_text})
120
 
121
  except ffmpeg.Error as e:
 
123
  return jsonify({"error": f"Lỗi chuyển đổi âm thanh từ WebM sang WAV: {error_message}"}), 500
124
  except Exception as e:
125
  return jsonify({"error": f"Lỗi xử lý âm thanh: {str(e)}"}), 500
 
126
  finally:
 
 
 
127
  # Xóa các file tạm
128
+ if os.path.exists(webm_path):
129
+ os.remove(webm_path)
130
+ if os.path.exists(wav_path):
131
+ os.remove(wav_path)
132
 
133
  if __name__ == "__main__":
134
  app.run(host="0.0.0.0", port=7860, debug=True)