From 4281c3509e1d3ef5c6f703f5cb10820538196142 Mon Sep 17 00:00:00 2001 From: Kevincoooool <33611679+Kevincoooool@users.noreply.github.com> Date: Sun, 16 Feb 2025 15:26:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0gpt=20sovits=20tts=EF=BC=8C?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E5=85=8B=E9=9A=86=E9=9F=B3=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.yaml | 25 +++++++++++ core/providers/tts/gpt_sovits_v2.py | 64 +++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 core/providers/tts/gpt_sovits_v2.py diff --git a/config.yaml b/config.yaml index 9ec38950..18662b67 100644 --- a/config.yaml +++ b/config.yaml @@ -182,3 +182,28 @@ TTS: rate: 44100 api_key: "你的api_key" api_url: "http://127.0.0.1:8080/v1/tts" + GPT_SOVITS_V2: + # 定义TTS API类型 + #启动tts方法: + #python api_v2.py -a 127.0.0.1 -p 9880 -c GPT_SoVITS/configs/caixukun.yaml + type: gpt_sovits_v2 + url: "http://127.0.0.1:9880/tts" + output_file: tmp/ + text_lang: "auto" + ref_audio_path: "caixukun.wav" + prompt_text: "" + prompt_lang: "zh" + top_k: 5 + top_p: 1 + temperature: 1 + text_split_method: "cut0" + batch_size: 1 + batch_threshold: 0.75 + split_bucket: true + return_fragment: false + speed_factor: 1.0 + streaming_mode: false + seed: -1 + parallel_infer: true + repetition_penalty: 1.35 + aux_ref_audio_paths: [] diff --git a/core/providers/tts/gpt_sovits_v2.py b/core/providers/tts/gpt_sovits_v2.py new file mode 100644 index 00000000..486db187 --- /dev/null +++ b/core/providers/tts/gpt_sovits_v2.py @@ -0,0 +1,64 @@ +import os +import uuid +import json +import base64 +import requests +from datetime import datetime +from core.providers.tts.base import TTSProviderBase + + +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_path") + self.prompt_text = config.get("prompt_text") + self.prompt_lang = config.get("prompt_lang", "zh") + self.top_k = config.get("top_k", 5) + self.top_p = config.get("top_p", 1) + self.temperature = config.get("temperature", 1) + self.text_split_method = config.get("text_split_method", "cut0") + self.batch_size = config.get("batch_size", 1) + self.batch_threshold = config.get("batch_threshold", 0.75) + self.split_bucket = config.get("split_bucket", True) + self.return_fragment = config.get("return_fragment", False) + self.speed_factor = config.get("speed_factor", 1.0) + self.streaming_mode = config.get("streaming_mode", False) + self.seed = config.get("seed", -1) + self.parallel_infer = config.get("parallel_infer", True) + self.repetition_penalty = config.get("repetition_penalty", 1.35) + self.aux_ref_audio_paths = config.get("aux_ref_audio_paths", []) + + def generate_filename(self, extension=".wav"): + return os.path.join(self.output_file, f"tts-{datetime.now().date()}@{uuid.uuid4().hex}{extension}") + + 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) + if resp.status_code == 200: + with open(output_file, "wb") as file: + file.write(resp.content) + else: + logger.error(f"GPT_SoVITS_V2 TTS请求失败: {resp.status_code} - {resp.text}")