mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-29 09:23:56 +08:00
增加gpt sovits tts,可以克隆音色
This commit is contained in:
+25
@@ -182,3 +182,28 @@ TTS:
|
|||||||
rate: 44100
|
rate: 44100
|
||||||
api_key: "你的api_key"
|
api_key: "你的api_key"
|
||||||
api_url: "http://127.0.0.1:8080/v1/tts"
|
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: []
|
||||||
|
|||||||
@@ -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}")
|
||||||
Reference in New Issue
Block a user