From d493bd221f61949735fe7c3433618331f639505d Mon Sep 17 00:00:00 2001 From: superobk Date: Fri, 26 Apr 2024 10:51:10 +0800 Subject: [PATCH 1/6] feat: configuration --- README.md | 41 ++++++++++++++++++++++++++++ src/blackbox/blackbox_factory.py | 4 ++- src/blackbox/tesou.py | 10 +++++-- src/configuration.py | 47 ++++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 src/configuration.py diff --git a/README.md b/README.md index a798594..c0dcd9d 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,49 @@ | python | uvicorn | https://www.uvicorn.org/ | pip install "uvicorn[standard]" | | python | SpeechRecognition | https://pypi.org/project/SpeechRecognition/ | pip install SpeechRecognition | | python | gtts | https://pypi.org/project/gTTS/ | pip install gTTS | +| python | PyYAML | https://pypi.org/project/PyYAML/ | pip install PyYAML | +| python | injector | https://github.com/python-injector/injector | pip install injector | + ## Start Dev rh ```bash uvicorn main:app --reload ``` + +## Configuration +```yaml +tesou: + url: http://120.196.116.194:48891/chat/ + +TokenIDConverter: + token_path: src/asr/resources/models/token_list.pkl + unk_symbol: + +CharTokenizer: + symbol_value: + space_symbol: + remove_non_linguistic_symbols: false + +WavFrontend: + cmvn_file: src/asr/resources/models/am.mvn + frontend_conf: + fs: 16000 + window: hamming + n_mels: 80 + frame_length: 25 + frame_shift: 10 + lfr_m: 7 + lfr_n: 6 + filter_length_max: -.inf + dither: 0.0 + +Model: + model_path: src/asr/resources/models/model.onnx + use_cuda: false + CUDAExecutionProvider: + device_id: 0 + arena_extend_strategy: kNextPowerOfTwo + cudnn_conv_algo_search: EXHAUSTIVE + do_copy_in_default_stream: true + batch_size: 3 +``` diff --git a/src/blackbox/blackbox_factory.py b/src/blackbox/blackbox_factory.py index 49d931d..d42a76e 100644 --- a/src/blackbox/blackbox_factory.py +++ b/src/blackbox/blackbox_factory.py @@ -9,16 +9,18 @@ from .tesou import Tesou from .fastchat import Fastchat from .g2e import G2E from .text_and_image import TextAndImage +from injector import Injector class BlackboxFactory: def __init__(self) -> None: + injector = Injector() self.tts = TTS() self.asr = ASR(".env.yaml") self.sentiment = Sentiment() self.audio_to_text = AudioToText() self.text_to_audio = TextToAudio() - self.tesou = Tesou() + self.tesou = injector.get(Tesou) self.fastchat = Fastchat() self.audio_chat = AudioChat(self.asr, self.tesou, self.tts) self.g2e = G2E() diff --git a/src/blackbox/tesou.py b/src/blackbox/tesou.py index 723b811..a262c21 100755 --- a/src/blackbox/tesou.py +++ b/src/blackbox/tesou.py @@ -2,11 +2,18 @@ from typing import Any, Coroutine from fastapi import Request, Response, status from fastapi.responses import JSONResponse +from injector import inject +from ..configuration import TesouConf from .blackbox import Blackbox import requests class Tesou(Blackbox): + url: str + + @inject + def __init__(self, tesou_config: TesouConf): + self.url = tesou_config.url def __call__(self, *args, **kwargs): return self.processing(*args, **kwargs) @@ -17,12 +24,11 @@ class Tesou(Blackbox): # 用户输入的数据格式为:[{"id": "123", "prompt": "叉烧饭,帮我查询叉烧饭的介绍"}] def processing(self, id, prompt) -> str: - url = 'http://120.196.116.194:48891/chat/' message = { "user_id": id, "prompt": prompt, } - response = requests.post(url, json=message) + response = requests.post(self.url, json=message) return response.json() async def fast_api_handler(self, request: Request) -> Response: diff --git a/src/configuration.py b/src/configuration.py new file mode 100644 index 0000000..8c3e6fb --- /dev/null +++ b/src/configuration.py @@ -0,0 +1,47 @@ + +from dataclasses import dataclass +from injector import Injector, inject +import yaml +import sys + +class Configuration(): + + @inject + def __init__(self) -> None: + config_file_path = "" + try: + config_file_path = sys.argv[1] + except: + config_file_path = ".env.yaml" + with open(config_file_path) as f: + cfg = yaml.load(f, Loader=yaml.FullLoader) + self.cfg = cfg + + def getDict(self): + return self.cfg + + """ + # yaml 檔中的路徑 get("aaa.bbb.ccc") + aaa: + bbb: + ccc: "hello world" + """ + def get(self, path: str | list[str], cfg: dict = None): + if isinstance(path, str): + if cfg is None: + cfg = self.cfg + return self.get(path.split("."), cfg) + lenght = len(path) + if lenght == 0 or not isinstance(cfg, dict): + return None + if lenght == 1: + return cfg.get(path[0]) + return self.get(path[1:], cfg.get(path[0])) + + +class TesouConf(): + url: str + + @inject + def __init__(self,config: Configuration) -> None: + self.url = config.get("tesou.url") From ee17313dbc4ac798a84bad2f66a12c218694ca5e Mon Sep 17 00:00:00 2001 From: Dan Chen Date: Fri, 26 Apr 2024 17:46:49 +0800 Subject: [PATCH 2/6] feat: configuration --- src/blackbox/blackbox_factory.py | 58 ++++++++++++++------------------ 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/src/blackbox/blackbox_factory.py b/src/blackbox/blackbox_factory.py index d42a76e..aeea922 100644 --- a/src/blackbox/blackbox_factory.py +++ b/src/blackbox/blackbox_factory.py @@ -12,42 +12,36 @@ from .text_and_image import TextAndImage from injector import Injector class BlackboxFactory: - + models = {} + def __init__(self) -> None: injector = Injector() - self.tts = TTS() - self.asr = ASR(".env.yaml") - self.sentiment = Sentiment() - self.audio_to_text = AudioToText() - self.text_to_audio = TextToAudio() - self.tesou = injector.get(Tesou) - self.fastchat = Fastchat() - self.audio_chat = AudioChat(self.asr, self.tesou, self.tts) - self.g2e = G2E() - self.text_and_image = TextAndImage() + self.models["audio_to_text"] = AudioToText() + self.models["text_to_audio"] = TextToAudio() + self.models["asr"] = ASR(".env.yaml") + self.models["tts"] = TTS() + self.models["sentiment_engine"] = Sentiment() + self.models["tesou"] = injector.get(Tesou) + self.models["fastchat"] = Fastchat() + self.models["audio_chat"] = AudioChat(self.models["asr"], self.models["tesou"], self.models["tts"]) + self.models["g2e"] = G2E() + self.models["text_and_image"] = TextAndImage() + # self.tts = TTS() + # self.asr = ASR(".env.yaml") + # self.sentiment = Sentiment() + # self.audio_to_text = AudioToText() + # self.text_to_audio = TextToAudio() + # self.tesou = injector.get(Tesou) + # self.fastchat = Fastchat() + # self.audio_chat = AudioChat(self.asr, self.tesou, self.tts) + # self.g2e = G2E() + # self.text_and_image = TextAndImage() def __call__(self, *args, **kwargs): return self.processing(*args, **kwargs) def create_blackbox(self, blackbox_name: str) -> Blackbox: - if blackbox_name == "audio_to_text": - return self.audio_to_text - if blackbox_name == "text_to_audio": - return self.text_to_audio - if blackbox_name == "asr": - return self.asr - if blackbox_name == "tts": - return self.tts - if blackbox_name == "sentiment_engine": - return self.sentiment - if blackbox_name == "tesou": - return self.tesou - if blackbox_name == "fastchat": - return self.fastchat - if blackbox_name == "audio_chat": - return self.audio_chat - if blackbox_name == "g2e": - return self.g2e - if blackbox_name == 'text_and_image': - return self.text_and_image - raise ValueError("Invalid blockbox type") \ No newline at end of file + model = self.models.get(blackbox_name) + if model is None: + raise ValueError("Invalid blockbox type") + return model \ No newline at end of file From f76231485c5f8013aa94a6e779aa8b5114aa5306 Mon Sep 17 00:00:00 2001 From: Dan Chen Date: Fri, 26 Apr 2024 17:53:28 +0800 Subject: [PATCH 3/6] feat: inject --- src/blackbox/asr.py | 4 +-- src/blackbox/audio_chat.py | 8 +++++- src/blackbox/blackbox_factory.py | 48 ++++++++++++++++---------------- 3 files changed, 33 insertions(+), 27 deletions(-) diff --git a/src/blackbox/asr.py b/src/blackbox/asr.py index 9c691f3..ad7ca81 100644 --- a/src/blackbox/asr.py +++ b/src/blackbox/asr.py @@ -10,8 +10,8 @@ from .blackbox import Blackbox class ASR(Blackbox): - def __init__(self, *args, **kwargs) -> None: - config = read_yaml(args[0]) + def __init__(self, path = ".env.yaml") -> None: + config = read_yaml(path) self.paraformer = RapidParaformer(config) def __call__(self, *args, **kwargs): diff --git a/src/blackbox/audio_chat.py b/src/blackbox/audio_chat.py index 1ab156b..1131c22 100644 --- a/src/blackbox/audio_chat.py +++ b/src/blackbox/audio_chat.py @@ -1,11 +1,17 @@ from fastapi import Request, Response,status from fastapi.responses import JSONResponse +from injector import inject + +from blackbox.asr import ASR +from blackbox.tesou import Tesou +from blackbox.tts import TTS from .blackbox import Blackbox class AudioChat(Blackbox): - def __init__(self, asr, gpt, tts): + @inject + def __init__(self, asr: ASR, gpt: Tesou, tts: TTS): self.asr = asr self.gpt = gpt self.tts = tts diff --git a/src/blackbox/blackbox_factory.py b/src/blackbox/blackbox_factory.py index aeea922..d6ac563 100644 --- a/src/blackbox/blackbox_factory.py +++ b/src/blackbox/blackbox_factory.py @@ -9,33 +9,33 @@ from .tesou import Tesou from .fastchat import Fastchat from .g2e import G2E from .text_and_image import TextAndImage -from injector import Injector +from injector import Injector, inject class BlackboxFactory: models = {} - - def __init__(self) -> None: - injector = Injector() - self.models["audio_to_text"] = AudioToText() - self.models["text_to_audio"] = TextToAudio() - self.models["asr"] = ASR(".env.yaml") - self.models["tts"] = TTS() - self.models["sentiment_engine"] = Sentiment() - self.models["tesou"] = injector.get(Tesou) - self.models["fastchat"] = Fastchat() - self.models["audio_chat"] = AudioChat(self.models["asr"], self.models["tesou"], self.models["tts"]) - self.models["g2e"] = G2E() - self.models["text_and_image"] = TextAndImage() - # self.tts = TTS() - # self.asr = ASR(".env.yaml") - # self.sentiment = Sentiment() - # self.audio_to_text = AudioToText() - # self.text_to_audio = TextToAudio() - # self.tesou = injector.get(Tesou) - # self.fastchat = Fastchat() - # self.audio_chat = AudioChat(self.asr, self.tesou, self.tts) - # self.g2e = G2E() - # self.text_and_image = TextAndImage() + + @inject + def __init__(self, + audio_to_text: AudioToText, + text_to_audio: TextToAudio, + asr: ASR, + tts: TTS, + sentiment_engine: Sentiment, + tesou: Tesou, + fastchat: Fastchat, + audio_chat: AudioChat, + g2e: G2E, + text_and_image:TextAndImage ) -> None: + self.models["audio_to_text"] = audio_to_text + self.models["text_to_audio"] = text_to_audio + self.models["asr"] = asr + self.models["tts"] = tts + self.models["sentiment_engine"] = sentiment_engine + self.models["tesou"] = tesou + self.models["fastchat"] = fastchat + self.models["audio_chat"] = audio_chat + self.models["g2e"] = g2e + self.models["text_and_image"] = text_and_image def __call__(self, *args, **kwargs): return self.processing(*args, **kwargs) From 4ddc33e75bb20504d93a0103dd55af1a9082a1b0 Mon Sep 17 00:00:00 2001 From: superobk Date: Mon, 29 Apr 2024 09:31:37 +0800 Subject: [PATCH 4/6] fix: inject fail --- main.py | 5 +++-- src/blackbox/audio_chat.py | 6 +++--- src/blackbox/blackbox_factory.py | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/main.py b/main.py index 2cb5207..10ff932 100644 --- a/main.py +++ b/main.py @@ -9,6 +9,7 @@ from src.dotchain.runtime.runtime import Runtime from src.blackbox.blackbox_factory import BlackboxFactory import uvicorn from fastapi.middleware.cors import CORSMiddleware +from injector import Injector app = FastAPI() @@ -20,8 +21,8 @@ app.add_middleware( allow_headers=["*"], ) - -blackbox_factory = BlackboxFactory() +injector = Injector() +blackbox_factory = injector.get(BlackboxFactory) @app.post("/") async def blackbox(blackbox_name: Union[str, None] = None, request: Request = None): diff --git a/src/blackbox/audio_chat.py b/src/blackbox/audio_chat.py index 1131c22..091c78e 100644 --- a/src/blackbox/audio_chat.py +++ b/src/blackbox/audio_chat.py @@ -2,9 +2,9 @@ from fastapi import Request, Response,status from fastapi.responses import JSONResponse from injector import inject -from blackbox.asr import ASR -from blackbox.tesou import Tesou -from blackbox.tts import TTS +from .asr import ASR +from .tesou import Tesou +from .tts import TTS from .blackbox import Blackbox diff --git a/src/blackbox/blackbox_factory.py b/src/blackbox/blackbox_factory.py index d6ac563..79378d1 100644 --- a/src/blackbox/blackbox_factory.py +++ b/src/blackbox/blackbox_factory.py @@ -9,7 +9,7 @@ from .tesou import Tesou from .fastchat import Fastchat from .g2e import G2E from .text_and_image import TextAndImage -from injector import Injector, inject +from injector import inject class BlackboxFactory: models = {} From 37f1c588cf9afd3baf0a44cc9c92f94a378b7296 Mon Sep 17 00:00:00 2001 From: superobk Date: Mon, 29 Apr 2024 10:59:11 +0800 Subject: [PATCH 5/6] feat: update install-dependencies.sh --- install-dependencies.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/install-dependencies.sh b/install-dependencies.sh index 2a54fdd..a4daca2 100644 --- a/install-dependencies.sh +++ b/install-dependencies.sh @@ -3,4 +3,6 @@ pip install filetype pip install fastapi pip install python-multipart pip install "uvicorn[standard]" -pip install SpeechRecognition \ No newline at end of file +pip install SpeechRecognition +pip install PyYAML +pip install injector \ No newline at end of file From ddd00aeabbc99a9da54dd895b5574ab9fee73c8c Mon Sep 17 00:00:00 2001 From: superobk Date: Tue, 30 Apr 2024 15:41:08 +0800 Subject: [PATCH 6/6] fix: singleton --- main.py | 58 +------------------ router.py | 35 +++++++++++ src/blackbox/asr.py | 2 + src/blackbox/audio_chat.py | 3 +- src/blackbox/audio_to_text.py | 3 +- src/blackbox/blackbox_factory.py | 5 +- .../{blackbox_sentiment.py => emotion.py} | 4 +- src/blackbox/fastchat.py | 2 + src/blackbox/g2e.py | 3 +- src/blackbox/sentiment.py | 3 +- src/blackbox/tesou.py | 2 + src/blackbox/text_and_image.py | 3 +- src/blackbox/text_to_audio.py | 3 +- src/blackbox/tts.py | 2 + 14 files changed, 62 insertions(+), 66 deletions(-) create mode 100644 router.py rename src/blackbox/{blackbox_sentiment.py => emotion.py} (96%) diff --git a/main.py b/main.py index 10ff932..7480f82 100644 --- a/main.py +++ b/main.py @@ -1,60 +1,4 @@ -from typing import Annotated, Union - -from fastapi import FastAPI, Request, status, Form -from fastapi.responses import JSONResponse - -from src.dotchain.runtime.interpreter import program_parser -from src.dotchain.runtime.tokenizer import Tokenizer -from src.dotchain.runtime.runtime import Runtime -from src.blackbox.blackbox_factory import BlackboxFactory import uvicorn -from fastapi.middleware.cors import CORSMiddleware -from injector import Injector - -app = FastAPI() - -app.add_middleware( - CORSMiddleware, - allow_origins=["*"], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) - -injector = Injector() -blackbox_factory = injector.get(BlackboxFactory) - -@app.post("/") -async def blackbox(blackbox_name: Union[str, None] = None, request: Request = None): - if not blackbox_name: - return await JSONResponse(content={"error": "blackbox_name is required"}, status_code=status.HTTP_400_BAD_REQUEST) - try: - box = blackbox_factory.create_blackbox(blackbox_name) - except ValueError: - return await JSONResponse(content={"error": "value error"}, status_code=status.HTTP_400_BAD_REQUEST) - return await box.fast_api_handler(request) - -def read_form_image(request: Request): - async def inner(field: str): - print(field) - return "image" - return inner - -def read_form_text(request: Request): - def inner(field: str): - print(field) - return "text" - return inner - -@app.post("/workflows") -async def workflows(script: Annotated[str, Form()], request: Request=None): - dsl_runtime = Runtime(exteral_fun={"print": print, - 'read_form_image': read_form_image(request), - "read_form_text": read_form_text(request)}) - t = Tokenizer() - t.init(script) - ast = program_parser(t) - ast.exec(dsl_runtime) if __name__ == "__main__": - uvicorn.run("main:app", host="0.0.0.0", port=8000, log_level="info") + uvicorn.run("router:app", host="0.0.0.0", port=8000, log_level="info") diff --git a/router.py b/router.py new file mode 100644 index 0000000..fc8c3fd --- /dev/null +++ b/router.py @@ -0,0 +1,35 @@ +from typing import Annotated, Union + +from fastapi import FastAPI, Request, status, Form +from fastapi.responses import JSONResponse + +from src.dotchain.runtime.interpreter import program_parser +from src.dotchain.runtime.tokenizer import Tokenizer +from src.dotchain.runtime.runtime import Runtime +from src.blackbox.blackbox_factory import BlackboxFactory +import uvicorn +from fastapi.middleware.cors import CORSMiddleware +from injector import Injector + +app = FastAPI() + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +injector = Injector() +blackbox_factory = injector.get(BlackboxFactory) + +@app.post("/") +async def blackbox(blackbox_name: Union[str, None] = None, request: Request = None): + if not blackbox_name: + return await JSONResponse(content={"error": "blackbox_name is required"}, status_code=status.HTTP_400_BAD_REQUEST) + try: + box = blackbox_factory.call_blackbox(blackbox_name) + except ValueError: + return await JSONResponse(content={"error": "value error"}, status_code=status.HTTP_400_BAD_REQUEST) + return await box.fast_api_handler(request) diff --git a/src/blackbox/asr.py b/src/blackbox/asr.py index ad7ca81..4f92659 100644 --- a/src/blackbox/asr.py +++ b/src/blackbox/asr.py @@ -7,7 +7,9 @@ from fastapi.responses import JSONResponse from ..asr.rapid_paraformer.utils import read_yaml from ..asr.rapid_paraformer import RapidParaformer from .blackbox import Blackbox +from injector import singleton +@singleton class ASR(Blackbox): def __init__(self, path = ".env.yaml") -> None: diff --git a/src/blackbox/audio_chat.py b/src/blackbox/audio_chat.py index 091c78e..cf5fb71 100644 --- a/src/blackbox/audio_chat.py +++ b/src/blackbox/audio_chat.py @@ -1,6 +1,6 @@ from fastapi import Request, Response,status from fastapi.responses import JSONResponse -from injector import inject +from injector import inject, singleton from .asr import ASR from .tesou import Tesou @@ -8,6 +8,7 @@ from .tts import TTS from .blackbox import Blackbox +@singleton class AudioChat(Blackbox): @inject diff --git a/src/blackbox/audio_to_text.py b/src/blackbox/audio_to_text.py index f8a3e9e..ae16260 100644 --- a/src/blackbox/audio_to_text.py +++ b/src/blackbox/audio_to_text.py @@ -3,9 +3,10 @@ from fastapi.responses import JSONResponse import speech_recognition as sr import filetype import io - +from injector import singleton from .blackbox import Blackbox +@singleton class AudioToText(Blackbox): def __call__(self, *args, **kwargs): diff --git a/src/blackbox/blackbox_factory.py b/src/blackbox/blackbox_factory.py index 79378d1..55ad618 100644 --- a/src/blackbox/blackbox_factory.py +++ b/src/blackbox/blackbox_factory.py @@ -9,8 +9,9 @@ from .tesou import Tesou from .fastchat import Fastchat from .g2e import G2E from .text_and_image import TextAndImage -from injector import inject +from injector import inject, singleton +@singleton class BlackboxFactory: models = {} @@ -40,7 +41,7 @@ class BlackboxFactory: def __call__(self, *args, **kwargs): return self.processing(*args, **kwargs) - def create_blackbox(self, blackbox_name: str) -> Blackbox: + def call_blackbox(self, blackbox_name: str) -> Blackbox: model = self.models.get(blackbox_name) if model is None: raise ValueError("Invalid blockbox type") diff --git a/src/blackbox/blackbox_sentiment.py b/src/blackbox/emotion.py similarity index 96% rename from src/blackbox/blackbox_sentiment.py rename to src/blackbox/emotion.py index 0eb3103..4d2d060 100644 --- a/src/blackbox/blackbox_sentiment.py +++ b/src/blackbox/emotion.py @@ -6,8 +6,10 @@ from fastapi.responses import JSONResponse from .blackbox import Blackbox from lagent.llms.lmdepoly_wrapper import LMDeployClient from lagent.llms.meta_template import INTERNLM2_META as META +from injector import singleton -class Sentiment(Blackbox): +@singleton +class Emotion(Blackbox): def __init__(self, model_name, model_url) -> None: self.model = LMDeployClient( diff --git a/src/blackbox/fastchat.py b/src/blackbox/fastchat.py index 94af2b1..27c95c1 100755 --- a/src/blackbox/fastchat.py +++ b/src/blackbox/fastchat.py @@ -7,6 +7,8 @@ from .blackbox import Blackbox import requests import json +from injector import singleton +@singleton class Fastchat(Blackbox): def __call__(self, *args, **kwargs): diff --git a/src/blackbox/g2e.py b/src/blackbox/g2e.py index 84f9e90..8bd5507 100755 --- a/src/blackbox/g2e.py +++ b/src/blackbox/g2e.py @@ -7,7 +7,8 @@ from .blackbox import Blackbox import requests import json from openai import OpenAI - +from injector import singleton +@singleton class G2E(Blackbox): def __call__(self, *args, **kwargs): diff --git a/src/blackbox/sentiment.py b/src/blackbox/sentiment.py index d17af4c..0e60af7 100644 --- a/src/blackbox/sentiment.py +++ b/src/blackbox/sentiment.py @@ -6,7 +6,8 @@ from fastapi.responses import JSONResponse from ..sentiment_engine.sentiment_engine import SentimentEngine from .blackbox import Blackbox - +from injector import singleton +@singleton class Sentiment(Blackbox): def __init__(self) -> None: diff --git a/src/blackbox/tesou.py b/src/blackbox/tesou.py index a262c21..a8f88bc 100755 --- a/src/blackbox/tesou.py +++ b/src/blackbox/tesou.py @@ -7,7 +7,9 @@ from ..configuration import TesouConf from .blackbox import Blackbox import requests +from injector import singleton +@singleton class Tesou(Blackbox): url: str diff --git a/src/blackbox/text_and_image.py b/src/blackbox/text_and_image.py index c63fdf6..ce87987 100644 --- a/src/blackbox/text_and_image.py +++ b/src/blackbox/text_and_image.py @@ -4,7 +4,8 @@ from fastapi import Request, Response, status from fastapi.responses import JSONResponse from .blackbox import Blackbox - +from injector import singleton +@singleton class TextAndImage(Blackbox): def __call__(self, *args, **kwargs): diff --git a/src/blackbox/text_to_audio.py b/src/blackbox/text_to_audio.py index 561a0c0..196b28c 100644 --- a/src/blackbox/text_to_audio.py +++ b/src/blackbox/text_to_audio.py @@ -3,7 +3,8 @@ from fastapi.responses import JSONResponse from .blackbox import Blackbox from gtts import gTTS from io import BytesIO - +from injector import singleton +@singleton class TextToAudio(Blackbox): def __call__(self, *args, **kwargs): diff --git a/src/blackbox/tts.py b/src/blackbox/tts.py index 669f273..f05c082 100644 --- a/src/blackbox/tts.py +++ b/src/blackbox/tts.py @@ -6,7 +6,9 @@ from fastapi import Request, Response, status from fastapi.responses import JSONResponse from .blackbox import Blackbox from ..tts.tts_service import TTService +from injector import singleton +@singleton class TTS(Blackbox): def __init__(self, *args, **kwargs) -> None: