76 lines
2.7 KiB
Python
76 lines
2.7 KiB
Python
from flask import request, jsonify
|
||
from app.utils import make_response
|
||
from pathlib import Path
|
||
import uuid
|
||
import threading
|
||
import signal
|
||
import os
|
||
import json
|
||
|
||
# 全局状态(模块内部)
|
||
task_running = {}
|
||
GLOBAL_ASR_SERVICE = None
|
||
GLOBAL_DIAR_SERVICE = None
|
||
ASR_MODEL_LOADED = False
|
||
DIAR_MODEL_LOADED = False
|
||
ASR_MODEL_LOCK = threading.Lock()
|
||
DIAR_MODEL_LOCK = threading.Lock()
|
||
|
||
def register_asr_routes(app):
|
||
"""【模块唯一入口】只注册路由,不创建app"""
|
||
|
||
@app.route('/api/recognize', methods=['GET'])
|
||
def recognize():
|
||
task_id = str(uuid.uuid4())
|
||
task_running[task_id] = True
|
||
try:
|
||
path = request.args.get('path', '')
|
||
if not path:
|
||
return jsonify(make_response(status="error", message="缺少path参数")), 400
|
||
|
||
server_dir = Path(__file__).parent.parent.parent.absolute()
|
||
os.chdir(server_dir)
|
||
|
||
def timeout_handler(signum, frame):
|
||
task_running[task_id] = False
|
||
raise TimeoutError(f"超时 {app.config['TASK_TIMEOUT']}s")
|
||
|
||
use_alarm = False
|
||
try:
|
||
signal.signal(signal.SIGALRM, timeout_handler) # pyright: ignore
|
||
signal.alarm(app.config['TASK_TIMEOUT']) # pyright: ignore
|
||
use_alarm = True
|
||
except:
|
||
pass
|
||
|
||
try:
|
||
from app.asr.core import main
|
||
result = main(path)
|
||
|
||
# 检查 main() 的返回值,如果是错误信息,返回 400
|
||
if result and isinstance(result, str):
|
||
task_running[task_id] = False
|
||
return jsonify(make_response(status="error", message=result)), 400
|
||
|
||
finally:
|
||
if use_alarm:
|
||
signal.alarm(0) # pyright: ignore
|
||
task_running[task_id] = False
|
||
|
||
return jsonify(make_response(message="推理完成", data={"task_id": task_id, "path": path}))
|
||
|
||
except Exception as e:
|
||
task_running[task_id] = False
|
||
return jsonify(make_response(status="error", message=str(e))), 500
|
||
|
||
@app.route('/api/result', methods=['GET'])
|
||
def result():
|
||
path = request.args.get('path', '')
|
||
if not path:
|
||
return jsonify(make_response(status="error", message="缺少path")), 400
|
||
result_file = Path(app.config['OUTPUT_DIR']) / "SpeechRecognition" / f"{Path(path).stem}_result.json"
|
||
if not result_file.exists():
|
||
return jsonify(make_response(status="error", message="结果不存在")), 404
|
||
with open(result_file, 'r', encoding='utf-8') as f:
|
||
data = json.load(f)
|
||
return jsonify(make_response(data=data)) |