tts_api.py 3.8 KB
Newer Older
W
WilliamZhang06 已提交
1 2 3 4 5 6 7 8 9 10 11 12 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.
L
lym0302 已提交
14
import traceback
15
from typing import Union
L
lym0302 已提交
16

W
WilliamZhang06 已提交
17 18
from fastapi import APIRouter

L
lym0302 已提交
19
from paddlespeech.server.engine.engine_pool import get_engine_pool
L
lym0302 已提交
20 21 22 23 24 25
from paddlespeech.server.restful.request import TTSRequest
from paddlespeech.server.restful.response import ErrorResponse
from paddlespeech.server.restful.response import TTSResponse
from paddlespeech.server.utils.errors import ErrorCode
from paddlespeech.server.utils.errors import failed_response
from paddlespeech.server.utils.exception import ServerBaseException
W
WilliamZhang06 已提交
26

W
WilliamZhang06 已提交
27
router = APIRouter()
W
WilliamZhang06 已提交
28 29


W
WilliamZhang06 已提交
30 31 32
@router.get('/paddlespeech/tts/help')
def help():
    """help
W
WilliamZhang06 已提交
33

W
WilliamZhang06 已提交
34 35 36
    Returns:
        json: [description]
    """
L
lym0302 已提交
37
    response = {
L
lym0302 已提交
38
        "success": "True",
L
lym0302 已提交
39
        "code": 200,
L
lym0302 已提交
40 41 42 43 44 45 46 47 48
        "message": {
            "global": "success"
        },
        "result": {
            "description": "tts server",
            "text": "sentence to be synthesized",
            "audio": "the base64 of audio"
        }
    }
L
lym0302 已提交
49
    return response
W
WilliamZhang06 已提交
50 51


52 53
@router.post(
    "/paddlespeech/tts", response_model=Union[TTSResponse, ErrorResponse])
L
lym0302 已提交
54 55 56 57 58 59 60 61 62
def tts(request_body: TTSRequest):
    """tts api

    Args:
        request_body (TTSRequest): [description]

    Returns:
        json: [description]
    """
L
lym0302 已提交
63 64 65 66 67 68 69
    # get params
    text = request_body.text
    spk_id = request_body.spk_id
    speed = request_body.speed
    volume = request_body.volume
    sample_rate = request_body.sample_rate
    save_path = request_body.save_path
L
lym0302 已提交
70

L
lym0302 已提交
71
    # Check parameters
L
lym0302 已提交
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
    if speed <= 0 or speed > 3:
        return failed_response(
            ErrorCode.SERVER_PARAM_ERR,
            "invalid speed value, the value should be between 0 and 3.")
    if volume <= 0 or volume > 3:
        return failed_response(
            ErrorCode.SERVER_PARAM_ERR,
            "invalid volume value, the value should be between 0 and 3.")
    if sample_rate not in [0, 16000, 8000]:
        return failed_response(
            ErrorCode.SERVER_PARAM_ERR,
            "invalid sample_rate value, the choice of value is 0, 8000, 16000.")
    if save_path is not None and not save_path.endswith(
            "pcm") and not save_path.endswith("wav"):
        return failed_response(
            ErrorCode.SERVER_PARAM_ERR,
            "invalid save_path, saved audio formats support pcm and wav")
L
lym0302 已提交
89

L
lym0302 已提交
90 91
    # run
    try:
L
lym0302 已提交
92 93 94 95
        # get single engine from engine pool
        engine_pool = get_engine_pool()
        tts_engine = engine_pool['tts']

L
lym0302 已提交
96
        lang, target_sample_rate, wav_base64 = tts_engine.run(
L
lym0302 已提交
97
            text, spk_id, speed, volume, sample_rate, save_path)
L
lym0302 已提交
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114

        response = {
            "success": True,
            "code": 200,
            "message": {
                "description": "success."
            },
            "result": {
                "lang": lang,
                "spk_id": spk_id,
                "speed": speed,
                "volume": volume,
                "sample_rate": target_sample_rate,
                "save_path": save_path,
                "audio": wav_base64
            }
        }
L
lym0302 已提交
115 116
    except ServerBaseException as e:
        response = failed_response(e.error_code, e.msg)
L
lym0302 已提交
117
    except BaseException:
L
lym0302 已提交
118 119
        response = failed_response(ErrorCode.SERVER_UNKOWN_ERR)
        traceback.print_exc()
L
lym0302 已提交
120

L
lym0302 已提交
121
    return response