39 lines
1.3 KiB
Python
39 lines
1.3 KiB
Python
import dashscope
|
|
import uuid
|
|
import asyncio
|
|
from dashscope.audio.tts_v2 import *
|
|
from ..provider import TTSProvider
|
|
from ..entities 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("dashscope_tts_voice", "loongstella")
|
|
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
|
|
|
|
async def get_audio(self, text: str) -> str:
|
|
path = f"data/temp/dashscope_tts_{uuid.uuid4()}.wav"
|
|
self.synthesizer = SpeechSynthesizer(
|
|
model=self.get_model(),
|
|
voice=self.voice,
|
|
format=AudioFormat.WAV_24000HZ_MONO_16BIT,
|
|
)
|
|
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
|