diff --git a/speechserving/setup.py b/speechserving/setup.py index e69de29b..97043fd7 100644 --- a/speechserving/setup.py +++ b/speechserving/setup.py @@ -0,0 +1,13 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/speechserving/speechserving/__init__.py b/speechserving/speechserving/__init__.py index e69de29b..97043fd7 100644 --- a/speechserving/speechserving/__init__.py +++ b/speechserving/speechserving/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/speechserving/speechserving/bin/main.py b/speechserving/speechserving/bin/main.py index ffc2228f..c5167dd4 100644 --- a/speechserving/speechserving/bin/main.py +++ b/speechserving/speechserving/bin/main.py @@ -14,7 +14,6 @@ import argparse - def init(args): """ 系统初始化 """ @@ -27,13 +26,18 @@ def main(args): app.run(host='0.0.0.0', port=conf.port) - if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument("--config_file", action="store", - help="yaml file of the app", default="./conf/application.yaml") - parser.add_argument("--log_file", action="store", - help="log file", default="./log/paddlespeech.log") + parser.add_argument( + "--config_file", + action="store", + help="yaml file of the app", + default="./conf/application.yaml") + parser.add_argument( + "--log_file", + action="store", + help="log file", + default="./log/paddlespeech.log") args = parser.parse_args() main(args) diff --git a/speechserving/speechserving/bin/paddlespeech-client.py b/speechserving/speechserving/bin/paddlespeech-client.py index ffc2228f..c5167dd4 100644 --- a/speechserving/speechserving/bin/paddlespeech-client.py +++ b/speechserving/speechserving/bin/paddlespeech-client.py @@ -14,7 +14,6 @@ import argparse - def init(args): """ 系统初始化 """ @@ -27,13 +26,18 @@ def main(args): app.run(host='0.0.0.0', port=conf.port) - if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument("--config_file", action="store", - help="yaml file of the app", default="./conf/application.yaml") - parser.add_argument("--log_file", action="store", - help="log file", default="./log/paddlespeech.log") + parser.add_argument( + "--config_file", + action="store", + help="yaml file of the app", + default="./conf/application.yaml") + parser.add_argument( + "--log_file", + action="store", + help="log file", + default="./log/paddlespeech.log") args = parser.parse_args() main(args) diff --git a/speechserving/speechserving/bin/paddlespeech-server.py b/speechserving/speechserving/bin/paddlespeech-server.py index ffc2228f..c5167dd4 100644 --- a/speechserving/speechserving/bin/paddlespeech-server.py +++ b/speechserving/speechserving/bin/paddlespeech-server.py @@ -14,7 +14,6 @@ import argparse - def init(args): """ 系统初始化 """ @@ -27,13 +26,18 @@ def main(args): app.run(host='0.0.0.0', port=conf.port) - if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument("--config_file", action="store", - help="yaml file of the app", default="./conf/application.yaml") - parser.add_argument("--log_file", action="store", - help="log file", default="./log/paddlespeech.log") + parser.add_argument( + "--config_file", + action="store", + help="yaml file of the app", + default="./conf/application.yaml") + parser.add_argument( + "--log_file", + action="store", + help="log file", + default="./log/paddlespeech.log") args = parser.parse_args() main(args) diff --git a/speechserving/speechserving/conf/application.yaml b/speechserving/speechserving/conf/application.yaml index e69de29b..358a76dc 100644 --- a/speechserving/speechserving/conf/application.yaml +++ b/speechserving/speechserving/conf/application.yaml @@ -0,0 +1,8 @@ +# This is the parameter configuration file for PaddleSpeech Serving. + +################################################################## +# SERVER SETTING # +################################################################## +host: '0.0.0.0' +port: 8090 + diff --git a/speechserving/speechserving/engine/__init__.py b/speechserving/speechserving/engine/__init__.py index e69de29b..97043fd7 100644 --- a/speechserving/speechserving/engine/__init__.py +++ b/speechserving/speechserving/engine/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/speechserving/speechserving/engine/asr/python/asr_engine.py b/speechserving/speechserving/engine/asr/python/asr_engine.py index 1ea3cd2a..6bd8b616 100644 --- a/speechserving/speechserving/engine/asr/python/asr_engine.py +++ b/speechserving/speechserving/engine/asr/python/asr_engine.py @@ -11,15 +11,19 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -from engine import BaseEngine +from engine.base_engine import BaseEngine + +from utils.log import logger __all__ = ['ASREngine'] -class ASREngine(BaseEngine): - def __init__(self, name): +class ASREngine(BaseEngine): + def __init__(self, name=None): super(ASREngine, self).__init__() - + self.executor = name + self.input = None + self.output = None def init(self): pass @@ -28,8 +32,8 @@ class ASREngine(BaseEngine): pass def run(self): - pass - + logger.info("start run asr engine") + return "hello world" if __name__ == "__main__": @@ -39,4 +43,3 @@ if __name__ == "__main__": print(class1 is class2) print(id(class1)) print(id(class2)) - diff --git a/speechserving/speechserving/engine/base_engine.py b/speechserving/speechserving/engine/base_engine.py index 1f9f6fa0..36048dcc 100644 --- a/speechserving/speechserving/engine/base_engine.py +++ b/speechserving/speechserving/engine/base_engine.py @@ -18,6 +18,7 @@ from typing import Union from pattern_singleton import Singleton + class BaseEngine(metaclass=Singleton): """ An base engine class diff --git a/speechserving/speechserving/main.py b/speechserving/speechserving/main.py index 864c543d..d3e6edc1 100644 --- a/speechserving/speechserving/main.py +++ b/speechserving/speechserving/main.py @@ -15,6 +15,7 @@ import argparse import uvicorn import yaml + from engine.tts.python.tts_engine import TTSEngine from fastapi import FastAPI from restful.api import router as api_router @@ -31,6 +32,7 @@ def init(args): app.include_router(api_router) # engine single + TTS_ENGINE = TTSEngine() # todo others @@ -56,7 +58,8 @@ if __name__ == "__main__": "--config_file", action="store", help="yaml file of the app", - default="./server.yaml") + default="./conf/tts/tts.yaml") + parser.add_argument( "--log_file", action="store", diff --git a/speechserving/speechserving/restful/__init__.py b/speechserving/speechserving/restful/__init__.py index e69de29b..97043fd7 100644 --- a/speechserving/speechserving/restful/__init__.py +++ b/speechserving/speechserving/restful/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/speechserving/speechserving/restful/api.py b/speechserving/speechserving/restful/api.py index c6250ce7..e25a3158 100644 --- a/speechserving/speechserving/restful/api.py +++ b/speechserving/speechserving/restful/api.py @@ -13,6 +13,7 @@ # limitations under the License. from fastapi import APIRouter + from .tts_api import router as tts_router #from .asr_api import router as asr_router diff --git a/speechserving/speechserving/restful/asr_api.py b/speechserving/speechserving/restful/asr_api.py new file mode 100644 index 00000000..eb335e09 --- /dev/null +++ b/speechserving/speechserving/restful/asr_api.py @@ -0,0 +1,63 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from fastapi import APIRouter +import base64 + + +from engine.asr.python.asr_engine import ASREngine +from .response import ASRResponse +from .request import ASRRequest + +router = APIRouter() + + +@router.get('/paddlespeech/asr/help') +def help(): + """help + + Returns: + json: [description] + """ + return {'hello': 'world'} + + +@router.post("/paddlespeech/asr", response_model=ASRResponse) +def asr(request_body: ASRRequest): + """asr api + + Args: + request_body (ASRRequest): [description] + + Returns: + json: [description] + """ + # single + asr_engine = ASREngine() + + asr_engine.init() + asr_results = asr_engine.run() + asr_engine.postprocess() + + json_body = { + "success": True, + "code": 0, + "message": { + "description": "success" + }, + "result": { + "transcription": asr_results + } + } + + return json_body diff --git a/speechserving/speechserving/restful/request.py b/speechserving/speechserving/restful/request.py index f1fa4bcb..32f157d3 100644 --- a/speechserving/speechserving/restful/request.py +++ b/speechserving/speechserving/restful/request.py @@ -29,8 +29,8 @@ class ASRRequest(BaseModel): "audio": "exSI6ICJlbiIsCgkgICAgInBvc2l0aW9uIjogImZhbHNlIgoJf...", "audio_format": "wav", "sample_rate": 16000, - "lang ": "zh_cn", - "ptt ":false + "lang": "zh_cn", + "ptt":false } """ audio: str diff --git a/speechserving/speechserving/controller/api.py b/speechserving/speechserving/restful/tts_api.py similarity index 58% rename from speechserving/speechserving/controller/api.py rename to speechserving/speechserving/restful/tts_api.py index 188dba30..05121718 100644 --- a/speechserving/speechserving/controller/api.py +++ b/speechserving/speechserving/restful/tts_api.py @@ -13,38 +13,17 @@ # limitations under the License. from fastapi import APIRouter -router = APIRouter() - - -router.include_router(auth_router) -router.include_router(user_router) -router.include_router(profile_router) -router.include_router(comment_router) -router.include_router(article_router) -router.include_router(tag_router) - - - - -def init_app(app): - - asr,tts - +router = APIRouter() - - - if asr - backend - dyload(asr) - asr.register_router(router) - if tts - backend - dyload(asr) +@router.get('/paddlespeech/tts/help') +def help(): + """help + Returns: + json: [description] + """ + return {'hello': 'world'} - asr.register_router(router) - app.include_router(router) - diff --git a/speechserving/speechserving/utils/__init__.py b/speechserving/speechserving/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/speechserving/speechserving/utils/errors.py b/speechserving/speechserving/utils/errors.py new file mode 100644 index 00000000..e69de29b diff --git a/speechserving/speechserving/utils/log.py b/speechserving/speechserving/utils/log.py new file mode 100644 index 00000000..8644064c --- /dev/null +++ b/speechserving/speechserving/utils/log.py @@ -0,0 +1,59 @@ +# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import functools +import logging + +__all__ = [ + 'logger', +] + + +class Logger(object): + def __init__(self, name: str=None): + name = 'PaddleSpeech' if not name else name + self.logger = logging.getLogger(name) + + log_config = { + 'DEBUG': 10, + 'INFO': 20, + 'TRAIN': 21, + 'EVAL': 22, + 'WARNING': 30, + 'ERROR': 40, + 'CRITICAL': 50, + 'EXCEPTION': 100, + } + for key, level in log_config.items(): + logging.addLevelName(level, key) + if key == 'EXCEPTION': + self.__dict__[key.lower()] = self.logger.exception + else: + self.__dict__[key.lower()] = functools.partial(self.__call__, + level) + + self.format = logging.Formatter( + fmt='[%(asctime)-15s] [%(levelname)8s] - %(message)s') + + self.handler = logging.StreamHandler() + self.handler.setFormatter(self.format) + + self.logger.addHandler(self.handler) + self.logger.setLevel(logging.DEBUG) + self.logger.propagate = False + + def __call__(self, log_level: str, msg: str): + self.logger.log(log_level, msg) + + +logger = Logger() diff --git a/speechserving/tests/http_client.py b/speechserving/tests/http_client.py new file mode 100644 index 00000000..3787d764 --- /dev/null +++ b/speechserving/tests/http_client.py @@ -0,0 +1,66 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the +import requests +import json +import time +import base64 + +import argparse + +def readwav2base64(wav_file): + """ + read wave file and covert to base64 string + """ + with open(wav_file, 'rb') as f: + base64_bytes = base64.b64encode(f.read()) + base64_string = base64_bytes.decode('utf-8') + return base64_string + + +def main(args): + """ + main func + """ + url = "http://127.0.0.1:8090/paddlespeech/asr" + + # start Timestamp + time_start=time.time() + + # test_audio_dir = "test_data/16_audio.wav" + # audio = readwav2base64(test_audio_dir) + + data = { + "audio": "exSI6ICJlbiIsCgkgICAgInBvc2l0aW9uIjogImZhbHNlIgoJf", + "audio_format": "wav", + "sample_rate": 16000, + "lang": "zh_cn", + } + + r = requests.post(url=url, data=json.dumps(data)) + + # ending Timestamp + time_end=time.time() + print('time cost',time_end - time_start, 's') + + print(r.json()) + + + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--model_type", action="store", + help="model type: u2, dp2", default="dp2") + args = parser.parse_args() + + main(args)