From 9ad4e18ac5d35762b568d9c83db717f3209b93aa Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Fri, 4 Apr 2025 00:32:37 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E2=9C=A8feat:=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E9=98=BF=E9=87=8C=E4=BA=91=E7=99=BE=E7=82=BC=20TTS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/config/default.py | 14 +++++++ astrbot/core/provider/manager.py | 4 ++ .../core/provider/sources/dashscope_tts.py | 39 +++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 astrbot/core/provider/sources/dashscope_tts.py diff --git a/astrbot/core/config/default.py b/astrbot/core/config/default.py index 879193f43..2ee61c733 100644 --- a/astrbot/core/config/default.py +++ b/astrbot/core/config/default.py @@ -671,8 +671,22 @@ CONFIG_METADATA_2 = { "fishaudio-tts-character": "可莉", "timeout": "20", }, + "阿里云百炼_TTS(API)": { + "id": "dashscope_tts", + "type": "dashscope_tts", + "enable": False, + "api_key": "", + "model": "cosyvoice-v1", + "dashscope_tts_voice": "loongstella", + "timeout": "20", + }, }, "items": { + "dashscope_tts_voice": { + "description": "语音合成模型", + "type": "string", + "hint": "阿里云百炼语音合成模型名称。具体可参考 https://help.aliyun.com/zh/model-studio/developer-reference/cosyvoice-python-api 等内容", + }, "gm_resp_image_modal": { "description": "启用图片模态", "type": "bool", diff --git a/astrbot/core/provider/manager.py b/astrbot/core/provider/manager.py index 71647a5ac..a3fa65e86 100644 --- a/astrbot/core/provider/manager.py +++ b/astrbot/core/provider/manager.py @@ -198,6 +198,10 @@ class ProviderManager: from .sources.fishaudio_tts_api_source import ( ProviderFishAudioTTSAPI as ProviderFishAudioTTSAPI, ) + case "dashscope_tts": + from .sources.dashscope_tts import ( + ProviderDashscopeTTSAPI as ProviderDashscopeTTSAPI, + ) except (ImportError, ModuleNotFoundError) as e: logger.critical( f"加载 {provider_config['type']}({provider_config['id']}) 提供商适配器失败:{e}。可能是因为有未安装的依赖。" diff --git a/astrbot/core/provider/sources/dashscope_tts.py b/astrbot/core/provider/sources/dashscope_tts.py new file mode 100644 index 000000000..45c2de946 --- /dev/null +++ b/astrbot/core/provider/sources/dashscope_tts.py @@ -0,0 +1,39 @@ +import dashscope +import uuid +import asyncio +from dashscope.audio.tts_v2 import * +from ..provider import TTSProvider +from ..entites import ProviderType +from ..register import register_provider_adapter + + +@register_provider_adapter( + "dashscope_tts", "Dashscope TTS API", provider_type=ProviderType.TEXT_TO_SPEECH +) +class ProviderDashscopeTTSAPI(TTSProvider): + def __init__( + self, + provider_config: dict, + provider_settings: dict, + ) -> None: + super().__init__(provider_config, provider_settings) + self.chosen_api_key: str = provider_config.get("api_key", "") + self.voice: str = provider_config.get("voice", "可莉") + self.set_model(provider_config.get("model", None)) + self.timeout_ms = float(provider_config.get("timeout", 20))*1000 + + dashscope.api_key = self.chosen_api_key + self.synthesizer = SpeechSynthesizer( + model=self.get_model(), + voice=self.voice, + format=AudioFormat.WAV_24000HZ_MONO_16BIT, + ) + + async def get_audio(self, text: str) -> str: + path = f"data/temp/dashscope_tts_{uuid.uuid4()}.wav" + audio = await asyncio.get_event_loop().run_in_executor( + None, self.synthesizer.call, text, self.timeout_ms + ) + with open(path, "wb") as f: + f.write(audio) + return path From 27203d7a4df575efeb48cf46f72329eb08b476c3 Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Fri, 4 Apr 2025 00:47:50 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=90=9B=20fix:=20update=20voice=20key?= =?UTF-8?q?=20name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/provider/sources/dashscope_tts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/astrbot/core/provider/sources/dashscope_tts.py b/astrbot/core/provider/sources/dashscope_tts.py index 45c2de946..06b390fcd 100644 --- a/astrbot/core/provider/sources/dashscope_tts.py +++ b/astrbot/core/provider/sources/dashscope_tts.py @@ -18,7 +18,7 @@ class ProviderDashscopeTTSAPI(TTSProvider): ) -> None: super().__init__(provider_config, provider_settings) self.chosen_api_key: str = provider_config.get("api_key", "") - self.voice: str = provider_config.get("voice", "可莉") + self.voice: str = provider_config.get("dashscope_tts_voice", "loongstella") self.set_model(provider_config.get("model", None)) self.timeout_ms = float(provider_config.get("timeout", 20))*1000