import requests from io import BytesIO import wave from utils.config import Config from utils.processes import ProcessManager, ProcessType from .base import TTSOperation class KoboldTTS(TTSOperation): KOBOLD_LINK_ID = "kobold_tts" def __init__(self): super().__init__("kobold") self.uri = None self.voice = "kobo" async def start(self) -> None: '''General setup needed to start generated''' await super().start() await ProcessManager().link(self.KOBOLD_LINK_ID, ProcessType.KOBOLD) self.uri = "http://127.0.0.1:{}".format(ProcessManager().get_process(ProcessType.KOBOLD).port) async def close(self) -> None: '''Clean up resources before unloading''' await super().close() await ProcessManager().unlink(self.KOBOLD_LINK_ID, ProcessType.KOBOLD) async def configure(self, config_d): '''Configure and validate operation-specific configuration''' if "voice" in config_d: self.voice = str(config_d["voice"]) assert self.voice is not None and len(self.voice) > 0 async def get_configuration(self): '''Returns values of configurable fields''' return { "voice": self.voice } async def _generate(self, content: str = None, **kwargs): response = requests.post( "{}/api/extra/tts".format(self.uri), json={ "input": content, "voice": self.voice, "speaker_json": "" }, ) if response.status_code == 200: result = response.content audio = BytesIO(result) with wave.open(audio, 'r') as f: yield {"audio_bytes": f.readframes(f.getnframes()), "sr": f.getframerate(), "sw": f.getsampwidth(), "ch": f.getnchannels()} else: raise Exception(f"Failed to get T2T result: {response.status_code} {response.reason}")