在当今的Web开发领域,选择合适的框架对于构建高效、稳定且易于维护的API至关重要。Flask和FastAPI是两个备受关注的Python Web框架,它们各自具有独特的特点和优势,适用于不同的开发场景。
from funasr import AutoModel
from concurrent.futures import ThreadPoolExecutor, TimeoutError
import sys
import os
from flask import Flask, request, jsonify
from flask_cors import CORS
# 忽略警告
import warnings
warnings.simplefilter(action='ignore')
# 初始化应用
app = Flask(__name__)
# 添加 CORS 中间件,允许跨域请求
CORS(app)
current_dir = os.path.dirname(sys.executable)
executor = ThreadPoolExecutor(max_workers=5) # 设置线程池最大线程数
# 语音翻译的核心函数
def voice_translation(audio):
model = AutoModel(model=os.path.join(current_dir, "Voice_translation"), model_revision="v2.0.4",
vad_model=os.path.join(current_dir, "Endpoint_detection"), vad_model_revision="v2.0.4",
punc_model=os.path.join(current_dir, "Ct_punc"), punc_model_revision="v2.0.4",
disable_update=True)
res = model.generate(input=audio,
batch_size_s=300,
hotword='test')
return res[0]['text']
# 任务处理函数
def process_translation(audio_url):
"""
处理音频翻译的任务函数。
:param audio_url: 音频文件的 URL。
:return: 翻译后的文本。
"""
return voice_translation(audio_url)
@app.route('/speech_recognition', methods=['GET', 'POST'])
def submit():
data = request.get_json()
try:
# 从请求体中提取参数
audiourl= data.get('audioUrl')
if not audiourl:
return jsonify({"code": 400, "message": "Missing audioUrl parameter.", "data": None}), 200
# 提交任务到线程池,并设置超时时间
future = executor.submit(process_translation, audiourl)
result_text = future.result(timeout=120) # 设置超时时间为120秒
return jsonify({"code":200, "message": f"Successfully.", "data":result_text}), 200
except TimeoutError:
return jsonify({"code": 500, "message": "Task timeout.", "data": None}), 200
except Exception as e:
# 处理可能的异常
return jsonify({"code":500, "message": f"An error: {e}.", "data":None}), 200
if __name__ == '__main__':
context = (os.path.join(current_dir, "sslcert/ip.cpwt5.com.pem"), os.path.join(current_dir, "sslcert/ip.cpwt5.com.key"))
# debug: bool = False 作用:如果设置为 True,则启用自动重载功能。对于开发环境很有用,在代码发生更改时自动重启服务器。
app.run(host='0.0.0.0', port=20000, debug=False,ssl_context=context)
这种简洁的代码结构使得开发者能够专注于业务逻辑的实现,对于小型项目或快速迭代的原型开发非常友好。
from funasr import AutoModel
from concurrent.futures import ThreadPoolExecutor, TimeoutError
import sys
import os
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
import uvicorn
# 忽略警告
import warnings
warnings.simplefilter(action='ignore')
# 初始化 FastAPI 应用
app = FastAPI(
title="Speech Recognition API", # API 文档的标题
description="API for recognizing and translating speech from audio files.", # API 描述
version="1.0.0", # 版本号
)
# 添加 CORS 中间件,允许跨域请求
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 允许所有源
allow_credentials=True,
allow_methods=["*"], # 允许所有方法
allow_headers=["*"], # 允许所有头
)
current_dir = os.path.dirname(sys.executable)
executor = ThreadPoolExecutor(max_workers=5) # 设置线程池最大线程数
# 定义请求数据模型
class AudioRequest(BaseModel):
audioUrl: str
# 语音翻译的核心函数
def voice_translation(audio):
model = AutoModel(model=os.path.join(current_dir, "Voice_translation"), model_revision="v2.0.4",
vad_model=os.path.join(current_dir, "Endpoint_detection"), vad_model_revision="v2.0.4",
punc_model=os.path.join(current_dir, "Ct_punc"), punc_model_revision="v2.0.4",
disable_update=True)
res = model.generate(input=audio,
batch_size_s=300,
hotword='test')
return res[0]['text']
# 任务处理函数
def process_translation(audio_url):
"""
处理音频翻译的任务函数。
:param audio_url: 音频文件的 URL。
:return: 翻译后的文本。
"""
return voice_translation(audio_url)
@app.api_route("/speech_recognition", methods=["GET", "POST"])
async def submit(data: AudioRequest):
try:
# 从请求体中提取参数
audiourl = data.audioUrl
if not audiourl:
return jsonify({"code": 400, "message": "Missing audioUrl parameter.", "data": None}), 200
# 提交任务到线程池,并设置超时时间
future = executor.submit(process_translation, audiourl)
result_text = future.result(timeout=120) # 设置超时时间为120秒
return {"code": 200, "message": "Successfully.", "data": result_text}
except TimeoutError:
raise HTTPException(status_code=500, detail="Task timeout.")
except Exception as e:
raise HTTPException(status_code=500, detail=f"An error occurred: {e}")
if __name__ == '__main__':
context = (os.path.join(current_dir, "sslcert/ip.cpwt5.com.pem"), os.path.join(current_dir, "sslcert/ip.cpwt5.com.key"))
# reload: bool = False 作用:如果设置为 True,则启用自动重载功能。对于开发环境很有用,在代码发生更改时自动重启服务器。
uvicorn.run(app, host='0.0.0.0', port=20000, ssl_certfile=context[0], ssl_keyfile=context[1])
此外,FastAPI还自动生成了交互式API文档(基于Swagger UI和ReDoc),开发者无需额外编写文档,即可方便地与前端团队或其他开发者共享API接口信息,进一步提高了开发效率。
在实际项目中,开发者应根据项目的具体需求、团队的技术栈和经验以及性能要求等因素,综合考虑选择Flask还是FastAPI。对于初学者或小型项目,Flask是一个不错的入门选择;而对于有一定经验且对性能有较高要求的开发者,FastAPI可能更适合构建高效的API服务。