@@ -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",
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user