diff --git a/main/xiaozhi-server/config.yaml b/main/xiaozhi-server/config.yaml index a919af20..7fa8a24a 100644 --- a/main/xiaozhi-server/config.yaml +++ b/main/xiaozhi-server/config.yaml @@ -306,20 +306,24 @@ TTS: repetition_penalty: 1.35 aux_ref_audio_paths: [] GPT_SOVITS_V3: + # 定义TTS API类型 GPT-SoVITS-v3lora-20250228 + #启动tts方法: + #python api.py type: gpt_sovits_v3 - url: "http://127.0.0.1:9880/tts" + url: "http://127.0.0.1:9880" output_file: tmp/ - text_lang: "auto" - ref_audio_path: "caixukun.wav" - prompt_lang: "zh" + text_language: "auto" + refer_wav_path: "caixukun.wav" + prompt_language: "zh" prompt_text: "" - top_k: 5 - top_p: 1 - temperature: 1 - sample_steps: 16 - media_type: "wav" - streaming_mode: false - threshold: 30 + top_k: 15 + top_p: 1.0 + temperature: 1.0 + cut_punc: "" + speed: 1.0 + inp_refs: [] + sample_steps: 32 + if_sr: false MinimaxTTS: # Minimax语音合成服务,需要先在minimax平台创建账户充值,并获取登录信息 # 平台地址:https://platform.minimaxi.com/ diff --git a/main/xiaozhi-server/core/providers/llm/ollama/ollama.py b/main/xiaozhi-server/core/providers/llm/ollama/ollama.py index aa5184a4..179a85b1 100644 --- a/main/xiaozhi-server/core/providers/llm/ollama/ollama.py +++ b/main/xiaozhi-server/core/providers/llm/ollama/ollama.py @@ -12,10 +12,10 @@ class LLMProvider(LLMProviderBase): self.model_name = config.get("model_name") self.base_url = config.get("base_url", "http://localhost:11434") # Initialize OpenAI client with Ollama base URL - #如果没有v1,增加v1 + # 如果没有v1,增加v1 if not self.base_url.endswith("/v1"): self.base_url = f"{self.base_url}/v1" - + self.client = OpenAI( base_url=self.base_url, api_key="ollama" # Ollama doesn't need an API key but OpenAI client requires one @@ -28,13 +28,20 @@ class LLMProvider(LLMProviderBase): messages=dialogue, stream=True ) - + is_active=True for chunk in responses: try: delta = chunk.choices[0].delta if getattr(chunk, 'choices', None) else None content = delta.content if hasattr(delta, 'content') else '' if content: - yield content + if '' in content: + is_active = False + content = content.split('')[0] + if '' in content: + is_active = True + content = content.split('')[-1] + if is_active: + yield content except Exception as e: logger.bind(tag=TAG).error(f"Error processing chunk: {e}") @@ -50,10 +57,10 @@ class LLMProvider(LLMProviderBase): stream=True, tools=functions, ) - + for chunk in stream: yield chunk.choices[0].delta.content, chunk.choices[0].delta.tool_calls except Exception as e: logger.bind(tag=TAG).error(f"Error in Ollama function call: {e}") - yield {"type": "content", "content": f"【Ollama服务响应异常: {str(e)}】"} \ No newline at end of file + yield {"type": "content", "content": f"【Ollama服务响应异常: {str(e)}】"} diff --git a/main/xiaozhi-server/core/providers/tts/gpt_sovits_v3.py b/main/xiaozhi-server/core/providers/tts/gpt_sovits_v3.py index 9ad19855..befb14bc 100644 --- a/main/xiaozhi-server/core/providers/tts/gpt_sovits_v3.py +++ b/main/xiaozhi-server/core/providers/tts/gpt_sovits_v3.py @@ -12,17 +12,18 @@ 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", "audo") - self.ref_audio_path = config.get("ref_audio_path") - self.prompt_lang = config.get("prompt_lang") + self.refer_wav_path = config.get("refer_wav_path") self.prompt_text = config.get("prompt_text") - self.top_k = config.get("top_k", 5) - self.top_p = config.get("top_p", 1) - self.temperature = config.get("temperature", 1) - self.sample_steps = config.get("sample_steps", 16) - self.media_type = config.get("media_type", "wav") - self.streaming_mode = config.get("streaming_mode", False) - self.threshold = config.get("threshold", 30) + self.prompt_language = config.get("prompt_language") + self.text_language = config.get("text_language", "audo") + self.top_k = config.get("top_k", 15) + self.top_p = config.get("top_p", 1.0) + self.temperature = config.get("temperature", 1.0) + self.cut_punc = config.get("cut_punc","") + self.speed = config.get("speed", 1.0) + self.inp_refs = config.get("inp_refs",[]) + self.sample_steps = config.get("inp_refs",32) + self.if_sr = config.get("if_sr",False) def generate_filename(self, extension=".wav"): @@ -30,18 +31,19 @@ class TTSProvider(TTSProviderBase): async def text_to_speak(self, text, output_file): request_params = { - "text": text, - "text_lang": self.text_lang, - "ref_audio_path": self.ref_audio_path, - "prompt_lang": self.prompt_lang, + "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, - "media_type": self.media_type, - "streaming_mode": self.streaming_mode, - "threshold": self.threshold, + "if_sr": self.if_sr, } resp = requests.get(self.url, params=request_params)