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.refer_wav_path = config.get('ref_audio')if config.get('ref_audio') else config.get("refer_wav_path")
|
self.prompt_text = config.get('ref_text')if config.get('ref_text') else config.get("prompt_text")
|
self.prompt_language = config.get("prompt_language")
|
self.text_language = config.get("text_language", "audo")
|
|
# 处理空字符串的情况
|
top_k = config.get("top_k", "15")
|
top_p = config.get("top_p", "1.0")
|
temperature = config.get("temperature", "1.0")
|
sample_steps = config.get("sample_steps", "32")
|
speed = config.get("speed", "1.0")
|
|
self.top_k = int(top_k) if top_k else 15
|
self.top_p = float(top_p) if top_p else 1.0
|
self.temperature = float(temperature) if temperature else 1.0
|
self.sample_steps = int(sample_steps) if sample_steps else 32
|
self.speed = float(speed) if speed else 1.0
|
|
self.cut_punc = config.get("cut_punc", "")
|
self.inp_refs = parse_string_to_list(config.get("inp_refs"))
|
self.if_sr = str(config.get("if_sr", False)).lower() in ("true", "1", "yes")
|
self.audio_file_type = config.get("format", "wav")
|
|
async def text_to_speak(self, text, output_file):
|
request_params = {
|
"refer_wav_path": self.refer_wav_path,
|
"prompt_text": self.prompt_text,
|
"prompt_language": self.prompt_language,
|
"text": text,
|
"text_language": self.text_language,
|
"top_k": self.top_k,
|
"top_p": self.top_p,
|
"temperature": self.temperature,
|
"cut_punc": self.cut_punc,
|
"speed": self.speed,
|
"inp_refs": self.inp_refs,
|
"sample_steps": self.sample_steps,
|
"if_sr": self.if_sr,
|
}
|
|
resp = requests.get(
|
self.url, params=request_params, 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_V3 TTS请求失败: {resp.status_code} - {resp.text}"
|
logger.bind(tag=TAG).error(error_msg)
|
raise Exception(error_msg)
|