import requests
|
from config.logger import setup_logging
|
from core.providers.tts.base import TTSProviderBase
|
from core.utils.util import parse_string_to_list
|
|
TAG = __name__
|
logger = setup_logging()
|
|
|
class TTSProvider(TTSProviderBase):
|
def __init__(self, config, delete_audio_file):
|
super().__init__(config, delete_audio_file)
|
self.url = config.get("url")
|
self.text_lang = config.get("text_lang", "zh")
|
self.ref_audio_path = config.get('ref_audio') if config.get('ref_audio') else config.get("ref_audio_path")
|
self.prompt_text = config.get('ref_text') if config.get('ref_text') else config.get("prompt_text")
|
self.prompt_lang = config.get("prompt_lang", "zh")
|
|
# 处理空字符串的情况
|
top_k = config.get("top_k", "5")
|
top_p = config.get("top_p", "1")
|
temperature = config.get("temperature", "1")
|
batch_threshold = config.get("batch_threshold", "0.75")
|
batch_size = config.get("batch_size", "1")
|
speed_factor = config.get("speed_factor", "1.0")
|
seed = config.get("seed", "-1")
|
repetition_penalty = config.get("repetition_penalty", "1.35")
|
|
self.top_k = int(top_k) if top_k else 5
|
self.top_p = float(top_p) if top_p else 1
|
self.temperature = float(temperature) if temperature else 1
|
self.batch_threshold = float(batch_threshold) if batch_threshold else 0.75
|
self.batch_size = int(batch_size) if batch_size else 1
|
self.speed_factor = float(speed_factor) if speed_factor else 1.0
|
self.seed = int(seed) if seed else -1
|
self.repetition_penalty = (
|
float(repetition_penalty) if repetition_penalty else 1.35
|
)
|
|
self.text_split_method = config.get("text_split_method", "cut0")
|
|
self.split_bucket = str(config.get("split_bucket", True)).lower() in (
|
"true",
|
"1",
|
"yes",
|
)
|
self.return_fragment = str(config.get("return_fragment", False)).lower() in (
|
"true",
|
"1",
|
"yes",
|
)
|
|
self.streaming_mode = str(config.get("streaming_mode", False)).lower() in (
|
"true",
|
"1",
|
"yes",
|
)
|
|
self.parallel_infer = str(config.get("parallel_infer", True)).lower() in (
|
"true",
|
"1",
|
"yes",
|
)
|
|
self.aux_ref_audio_paths = parse_string_to_list(
|
config.get("aux_ref_audio_paths")
|
)
|
self.audio_file_type = config.get("format", "wav")
|
|
async def text_to_speak(self, text, output_file):
|
request_json = {
|
"text": text,
|
"text_lang": self.text_lang,
|
"ref_audio_path": self.ref_audio_path,
|
"aux_ref_audio_paths": self.aux_ref_audio_paths,
|
"prompt_text": self.prompt_text,
|
"prompt_lang": self.prompt_lang,
|
"top_k": self.top_k,
|
"top_p": self.top_p,
|
"temperature": self.temperature,
|
"text_split_method": self.text_split_method,
|
"batch_size": self.batch_size,
|
"batch_threshold": self.batch_threshold,
|
"split_bucket": self.split_bucket,
|
"return_fragment": self.return_fragment,
|
"speed_factor": self.speed_factor,
|
"streaming_mode": self.streaming_mode,
|
"seed": self.seed,
|
"parallel_infer": self.parallel_infer,
|
"repetition_penalty": self.repetition_penalty,
|
}
|
|
resp = requests.post(
|
self.url, json=request_json, timeout=self.tts_timeout
|
)
|
if resp.status_code == 200:
|
if output_file:
|
with open(output_file, "wb") as file:
|
file.write(resp.content)
|
else:
|
return resp.content
|
else:
|
error_msg = f"GPT_SoVITS_V2 TTS请求失败: {resp.status_code} - {resp.text}"
|
logger.bind(tag=TAG).error(error_msg)
|
raise Exception(error_msg)
|