diff --git a/paddlespeech/server/__init__.py b/paddlespeech/server/__init__.py index bbe1b34ee..384061dda 100644 --- a/paddlespeech/server/__init__.py +++ b/paddlespeech/server/__init__.py @@ -13,9 +13,12 @@ # limitations under the License. import _locale -from .base_commands import BaseCommand -from .base_commands import HelpCommand -from paddlespeech.server.bin.paddlespeech_client import TTSClientExecutor -from paddlespeech.server.bin.paddlespeech_server import ServerExecutor +from .base_commands import ClientBaseCommand +from .base_commands import ClientHelpCommand +from .base_commands import ServerBaseCommand +from .base_commands import ServerHelpCommand +from .bin.paddlespeech_client import ASRClientExecutor +from .bin.paddlespeech_client import TTSClientExecutor +from .bin.paddlespeech_server import ServerExecutor _locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8']) diff --git a/paddlespeech/server/base_commands.py b/paddlespeech/server/base_commands.py index b32fe99d8..d1239297d 100644 --- a/paddlespeech/server/base_commands.py +++ b/paddlespeech/server/base_commands.py @@ -13,30 +13,63 @@ # limitations under the License. from typing import List -from .entry import commands -from .util import cli_register -from .util import get_command +from .entry import client_commands +from .entry import server_commands +from .util import cli_client_register +from .util import cli_server_register +from .util import get_client_command +from .util import get_server_command __all__ = [ - 'BaseCommand', - 'HelpCommand', + 'ServerBaseCommand', + 'ServerHelpCommand', + 'ClientBaseCommand', + 'ClientHelpCommand', ] -@cli_register(name='paddleserver') -class BaseCommand: +@cli_server_register(name='paddlespeech_server') +class ServerBaseCommand: def execute(self, argv: List[str]) -> bool: - help = get_command('paddleserver.help') + help = get_server_command('paddlespeech_server.help') return help().execute(argv) -@cli_register(name='paddleserver.help', description='Show help for commands.') -class HelpCommand: +@cli_server_register( + name='paddlespeech_server.help', description='Show help for commands.') +class ServerHelpCommand: def execute(self, argv: List[str]) -> bool: msg = 'Usage:\n' - msg += ' paddleserver \n\n' + msg += ' paddlespeech_server \n\n' msg += 'Commands:\n' - for command, detail in commands['paddleserver'].items(): + for command, detail in server_commands['paddlespeech_server'].items(): + if command.startswith('_'): + continue + + if '_description' not in detail: + continue + msg += ' {:<15} {}\n'.format(command, + detail['_description']) + + print(msg) + return True + + +@cli_client_register(name='paddlespeech_client') +class ClientBaseCommand: + def execute(self, argv: List[str]) -> bool: + help = get_client_command('paddlespeech_client.help') + return help().execute(argv) + + +@cli_client_register( + name='paddlespeech_client.help', description='Show help for commands.') +class ClientHelpCommand: + def execute(self, argv: List[str]) -> bool: + msg = 'Usage:\n' + msg += ' paddlespeech_client \n\n' + msg += 'Commands:\n' + for command, detail in client_commands['paddlespeech_client'].items(): if command.startswith('_'): continue diff --git a/paddlespeech/server/bin/__init__.py b/paddlespeech/server/bin/__init__.py index 3d37168b4..bd75747f7 100644 --- a/paddlespeech/server/bin/__init__.py +++ b/paddlespeech/server/bin/__init__.py @@ -11,4 +11,6 @@ # 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 .paddlespeech_client import ASRClientExecutor +from .paddlespeech_client import TTSClientExecutor from .paddlespeech_server import ServerExecutor diff --git a/paddlespeech/server/bin/paddlespeech_client.py b/paddlespeech/server/bin/paddlespeech_client.py index f05d52168..ff8e34fa4 100644 --- a/paddlespeech/server/bin/paddlespeech_client.py +++ b/paddlespeech/server/bin/paddlespeech_client.py @@ -24,11 +24,15 @@ import numpy as np import requests import soundfile -from paddlespeech.server.util import cli_register +from ..util import cli_client_register from paddlespeech.server.utils.audio_process import wav2pcm +from paddlespeech.server.utils.util import wav2base64 +__all__ = ['TTSClientExecutor', 'ASRClientExecutor'] -@cli_register(name='paddleserver.ttsclient', description='visit tts service') + +@cli_client_register( + name='paddlespeech_client.tts', description='visit tts service') class TTSClientExecutor(): def __init__(self): super().__init__() @@ -79,6 +83,7 @@ class TTSClientExecutor(): response = requests.post(url, json.dumps(request)) response_dict = response.json() + print(response_dict["message"]) wav_base64 = response_dict["result"]["audio"] audio_data_byte = base64.b64decode(wav_base64) @@ -107,6 +112,45 @@ class TTSClientExecutor(): samples_length, sample_rate = self.tts_client(args) time_consume = time.time() - st print("Save synthesized audio successfully on %s." % (args.output)) - print("Inference time: %f" % (time_consume)) + print("Inference time: %f s." % (time_consume)) except: print("Failed to synthesized audio.") + + +@cli_client_register( + name='paddlespeech_client.asr', description='visit asr service') +class ASRClientExecutor(): + def __init__(self): + super().__init__() + self.parser = argparse.ArgumentParser() + self.parser.add_argument( + '--server_ip', type=str, default='127.0.0.1', help='server ip') + self.parser.add_argument( + '--port', type=int, default=8090, help='server port') + self.parser.add_argument( + '--audio_file', + type=str, + default="./paddlespeech/server/tests/16_audio.wav", + help='Audio file to be recognized') + self.parser.add_argument( + '--sample_rate', type=int, default=16000, help='audio sample rate') + + def execute(self, argv: List[str]) -> bool: + args = self.parser.parse_args(argv) + url = 'http://' + args.server_ip + ":" + str( + args.port) + '/paddlespeech/asr' + audio = wav2base64(args.audio_file) + data = { + "audio": audio, + "audio_format": "wav", + "sample_rate": args.sample_rate, + "lang": "zh_cn", + } + time_start = time.time() + try: + r = requests.post(url=url, data=json.dumps(data)) + # ending Timestamp + time_end = time.time() + print('time cost', time_end - time_start, 's') + except: + print("Failed to speech recognition.") diff --git a/paddlespeech/server/bin/paddlespeech_server.py b/paddlespeech/server/bin/paddlespeech_server.py index c4f8e0e0c..029ba6129 100644 --- a/paddlespeech/server/bin/paddlespeech_server.py +++ b/paddlespeech/server/bin/paddlespeech_server.py @@ -17,16 +17,19 @@ from typing import List import uvicorn from fastapi import FastAPI +from ..util import cli_server_register from paddlespeech.server.engine.engine_factory import EngineFactory from paddlespeech.server.restful.api import setup_router -from paddlespeech.server.util import cli_register from paddlespeech.server.utils.config import get_config +__all__ = ['ServerExecutor'] + app = FastAPI( title="PaddleSpeech Serving API", description="Api", version="0.0.1") -@cli_register(name='paddleserver.server', description='Start the service') +@cli_server_register( + name='paddlespeech_server.server', description='Start the service') class ServerExecutor(): def __init__(self): super().__init__() diff --git a/paddlespeech/server/entry.py b/paddlespeech/server/entry.py index 50f37fbb9..f817321d0 100644 --- a/paddlespeech/server/entry.py +++ b/paddlespeech/server/entry.py @@ -14,18 +14,33 @@ import sys from collections import defaultdict -__all__ = ['commands'] +__all__ = ['server_commands', 'client_commands'] def _CommandDict(): return defaultdict(_CommandDict) -def _execute(): - com = commands +def server_execute(): + com = server_commands + idx = 0 + for _argv in (['paddlespeech_server'] + sys.argv[1:]): + if _argv not in com: + break + idx += 1 + com = com[_argv] + + # The method 'execute' of a command instance returns 'True' for a success + # while 'False' for a failure. Here converts this result into a exit status + # in bash: 0 for a success and 1 for a failure. + status = 0 if com['_entry']().execute(sys.argv[idx:]) else 1 + return status + +def client_execute(): + com = client_commands idx = 0 - for _argv in (['paddleserver'] + sys.argv[1:]): + for _argv in (['paddlespeech_client'] + sys.argv[1:]): if _argv not in com: break idx += 1 @@ -38,4 +53,5 @@ def _execute(): return status -commands = _CommandDict() +server_commands = _CommandDict() +client_commands = _CommandDict() diff --git a/paddlespeech/server/util.py b/paddlespeech/server/util.py index d11178df8..58e86b277 100644 --- a/paddlespeech/server/util.py +++ b/paddlespeech/server/util.py @@ -31,24 +31,27 @@ from paddle.framework import load import paddleaudio from . import download from .. import __version__ -from .entry import commands +from .entry import client_commands +from .entry import server_commands requests.adapters.DEFAULT_RETRIES = 3 __all__ = [ - 'cli_register', - 'get_command', + 'cli_server_register', + 'get_server_command', + 'cli_client_register', + 'get_client_command', 'download_and_decompress', 'load_state_dict_from_url', 'stats_wrapper', ] -def cli_register(name: str, description: str='') -> Any: +def cli_server_register(name: str, description: str='') -> Any: def _warpper(command): items = name.split('.') - com = commands + com = server_commands for item in items: com = com[item] com['_entry'] = command @@ -59,9 +62,33 @@ def cli_register(name: str, description: str='') -> Any: return _warpper -def get_command(name: str) -> Any: +def get_server_command(name: str) -> Any: items = name.split('.') - com = commands + com = server_commands + for item in items: + com = com[item] + + return com['_entry'] + + +def cli_client_register(name: str, description: str='') -> Any: + def _warpper(command): + items = name.split('.') + + com = client_commands + for item in items: + com = com[item] + com['_entry'] = command + if description: + com['_description'] = description + return command + + return _warpper + + +def get_client_command(name: str) -> Any: + items = name.split('.') + com = client_commands for item in items: com = com[item] diff --git a/setup.py b/setup.py index cf7f3a2cb..b3cdc87c1 100644 --- a/setup.py +++ b/setup.py @@ -236,7 +236,8 @@ setup_info = dict( entry_points={ 'console_scripts': [ 'paddlespeech=paddlespeech.cli.entry:_execute', - 'paddleserver=paddlespeech.server.entry:_execute' + 'paddlespeech_server=paddlespeech.server.entry:server_execute', + 'paddlespeech_client=paddlespeech.server.entry:client_execute' ] })