feat: 添加 GSVI tts 支持 #545 #351

This commit is contained in:
崔永亮
2025-03-01 14:21:07 +08:00
parent e5bd74695a
commit 103edd5260
3 changed files with 59 additions and 0 deletions
+9
View File
@@ -608,6 +608,15 @@ CONFIG_METADATA_2 = {
"edge-tts-voice": "zh-CN-XiaoxiaoNeural",
"timeout": 20,
},
"GSVI_TTS(API)": {
"id": "gsvi_tts",
"type": "gsvi_tts_api",
"api_base": "http://127.0.0.1/5000",
"character": "",
"emotion": "default",
"enable": False,
"timeout": 20,
},
"FishAudio_TTS(API)": {
"id": "fishaudio_tts",
"type": "fishaudio_tts_api",
+2
View File
@@ -154,6 +154,8 @@ class ProviderManager():
from .sources.openai_tts_api_source import ProviderOpenAITTSAPI as ProviderOpenAITTSAPI
case "edge_tts":
from .sources.edge_tts_source import ProviderEdgeTTS as ProviderEdgeTTS
case "gsvi_tts_api":
from .sources.gsvi_tts_source import ProviderGSVITTS as ProviderGSVITTS
case "fishaudio_tts_api":
from .sources.fishaudio_tts_api_source import ProviderFishAudioTTSAPI as ProviderFishAudioTTSAPI
except (ImportError, ModuleNotFoundError) as e:
@@ -0,0 +1,48 @@
import uuid
import os
import aiohttp
import urllib.parse
from ..provider import TTSProvider
from ..entites import ProviderType
from ..register import register_provider_adapter
@register_provider_adapter("gsvi_tts_api", "GSVI TTS API", provider_type=ProviderType.TEXT_TO_SPEECH)
class ProviderGSVITTS(TTSProvider):
def __init__(
self,
provider_config: dict,
provider_settings: dict,
) -> None:
super().__init__(provider_config, provider_settings)
self.api_base = provider_config.get("api_base", "http://127.0.0.1:5000")
self.character = provider_config.get("character")
self.emotion = provider_config.get("emotion")
self.format = provider_config.get("format")
async def get_audio(self, text: str) -> str:
path = f'data/temp/gsvi_tts_{uuid.uuid4()}.{self.format or "wav"}'
params = {"text": text}
if self.character:
params["character"] = self.character
if self.emotion:
params["emotion"] = self.emotion
query_parts = []
for key, value in params.items():
encoded_value = urllib.parse.quote(str(value))
query_parts.append(f"{key}={encoded_value}")
url = f"{self.api_base}/tts?{'&'.join(query_parts)}"
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
if response.status == 200:
with open(path, 'wb') as f:
f.write(await response.read())
else:
error_text = await response.text()
raise Exception(f"GSVI TTS API 请求失败,状态码: {response.status},错误: {error_text}")
return path