| from fastapi import FastAPI, APIRouter | |
| from fastapi.middleware.cors import CORSMiddleware | |
| import logging | |
| from fastapi.staticfiles import StaticFiles | |
| import fnmatch | |
| def is_excluded(path, exclude_patterns): | |
| """ | |
| 检查路径是否被排除 | |
| :param path: 需要检查的路径 | |
| :param exclude_patterns: 包含通配符的排除路径列表 | |
| :return: 如果路径被排除,返回 True;否则返回 False | |
| """ | |
| for pattern in exclude_patterns: | |
| if fnmatch.fnmatch(path, pattern): | |
| print(path, pattern) | |
| return True | |
| return False | |
| class APIManager: | |
| def __init__(self, no_docs=False, exclude_patterns=[]): | |
| self.app = FastAPI( | |
| title="ChatTTS Forge API", | |
| description=""" | |
| ChatTTS-Forge 是一个功能强大的文本转语音生成工具,支持通过类 SSML 语法生成丰富的音频长文本,并提供全面的 API 服务,适用于各种场景。<br/> | |
| ChatTTS-Forge is a powerful text-to-speech generation tool that supports generating rich audio long texts through class SSML syntax | |
| 项目地址: [https://github.com/lenML/ChatTTS-Forge](https://github.com/lenML/ChatTTS-Forge) | |
| > 所有生成音频的 POST api都无法在此页面调试,调试建议使用 playground <br/> | |
| > All audio generation POST APIs cannot be debugged on this page, it is recommended to use playground for debugging | |
| > 如果你不熟悉本系统,建议从这个一键脚本开始,在colab中尝试一下:<br/> | |
| > [https://colab.research.google.com/github/lenML/ChatTTS-Forge/blob/main/colab.ipynb](https://colab.research.google.com/github/lenML/ChatTTS-Forge/blob/main/colab.ipynb) | |
| """, | |
| version="0.1.0", | |
| redoc_url=None if no_docs else "/redoc", | |
| docs_url=None if no_docs else "/docs", | |
| ) | |
| self.registered_apis = {} | |
| self.logger = logging.getLogger(__name__) | |
| self.exclude = exclude_patterns | |
| def is_excluded(self, path): | |
| return is_excluded(path, self.exclude) | |
| def set_cors( | |
| self, | |
| allow_origins: list = ["*"], | |
| allow_credentials: bool = True, | |
| allow_methods: list = ["*"], | |
| allow_headers: list = ["*"], | |
| ): | |
| self.app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=allow_origins, | |
| allow_credentials=allow_credentials, | |
| allow_methods=allow_methods, | |
| allow_headers=allow_headers, | |
| ) | |
| def setup_playground(self): | |
| app = self.app | |
| app.mount( | |
| "/playground", | |
| StaticFiles(directory="playground", html=True), | |
| name="playground", | |
| ) | |
| def get(self, path: str, **kwargs): | |
| def decorator(func): | |
| if self.is_excluded(path): | |
| return func | |
| self.app.get(path, **kwargs)(func) | |
| self.registered_apis[path] = func | |
| self.logger.info(f"Registered API: GET {path}") | |
| return func | |
| return decorator | |
| def post(self, path: str, **kwargs): | |
| def decorator(func): | |
| if self.is_excluded(path): | |
| return func | |
| self.app.post(path, **kwargs)(func) | |
| self.registered_apis[path] = func | |
| self.logger.info(f"Registered API: POST {path}") | |
| return func | |
| return decorator | |