Compare commits
3 Commits
d89c98fea5
...
6c22e53d67
Author | SHA1 | Date | |
---|---|---|---|
6c22e53d67 | |||
c492593708 | |||
ecb240db34 |
12
DB.py
12
DB.py
@ -30,6 +30,18 @@ class SynthesisErrors(peewee.Model):
|
||||
primary_key = peewee.CompositeKey('speaker', 'text')
|
||||
|
||||
|
||||
class SoundCache(peewee.Model):
|
||||
text = peewee.TextField()
|
||||
speaker = peewee.CharField()
|
||||
audio = peewee.BlobField()
|
||||
usages = peewee.IntegerField(default=1)
|
||||
|
||||
class Meta:
|
||||
database = database
|
||||
primary_key = peewee.CompositeKey('speaker', 'text')
|
||||
|
||||
|
||||
Prefix.create_table()
|
||||
Speaker.create_table()
|
||||
SynthesisErrors.create_table()
|
||||
SoundCache.create_table()
|
||||
|
@ -9,29 +9,20 @@ from loguru import logger
|
||||
|
||||
|
||||
class TTSSileroCached(TTSSilero):
|
||||
_SQLITE_GET = "select audio from soundcache where text = :text and speaker = :speaker;"
|
||||
_SQLITE_SET = "insert into soundcache (text, speaker, audio) values (:text, :speaker, :audio);"
|
||||
_SQLITE_INCREMENT_USAGES = "update soundcache set usages = usages + 1 where text = :text and :speaker = :speaker;"
|
||||
_SQLITE_SCHEMA = """CREATE TABLE IF NOT EXISTS "soundcache" (
|
||||
"text" TEXT NOT NULL,
|
||||
"speaker" VARCHAR(255) NOT NULL,
|
||||
"audio" BLOB NOT NULL,
|
||||
"usages" INTEGER NOT NULL default 0,
|
||||
PRIMARY KEY ("text", "speaker")
|
||||
);"""
|
||||
|
||||
database: sqlite3.Connection = DB.database.connection()
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.database.execute(self._SQLITE_SCHEMA)
|
||||
|
||||
def synthesize_text(self, text: str, speaker: Speakers = Speakers.kseniya) -> bytes:
|
||||
# start = time.time()
|
||||
cached = self._cache_get(text, speaker.value)
|
||||
# logger.debug(f'Cache lookup in {time.time() - start} s')
|
||||
if cached is not None:
|
||||
# logger.debug(f'Cache lookup successful in {time.time() - start} s')
|
||||
cache_query = DB.SoundCache.select()\
|
||||
.where(DB.SoundCache.text == text)\
|
||||
.where(DB.SoundCache.speaker == speaker.value)
|
||||
|
||||
if cache_query.count() == 1:
|
||||
with DB.database.atomic():
|
||||
DB.SoundCache.update({DB.SoundCache.usages: DB.SoundCache.usages + 1})\
|
||||
.where(DB.SoundCache.text == text)\
|
||||
.where(DB.SoundCache.speaker == speaker.value).execute()
|
||||
|
||||
cached = cache_query.get().audio
|
||||
|
||||
return cached
|
||||
|
||||
else:
|
||||
@ -39,22 +30,7 @@ class TTSSileroCached(TTSSilero):
|
||||
# start2 = time.time()
|
||||
synthesized = super().synthesize_text(text, speaker)
|
||||
# logger.debug(f'Synthesis done in {time.time() - start2} s in {time.time() - start} s after start')
|
||||
self._cache_set(text, speaker.value, synthesized)
|
||||
DB.SoundCache.create(text=text, speaker=speaker.value, audio=synthesized)
|
||||
|
||||
# logger.debug(f'Cache set in {time.time() - start2} synth end and {time.time() - start2} s after start')
|
||||
return synthesized
|
||||
|
||||
def _cache_get(self, text: str, speaker: str) -> Union[bytes, None]:
|
||||
query_args = {'text': text, 'speaker': speaker}
|
||||
result = self.database.execute(self._SQLITE_GET, query_args).fetchone()
|
||||
if result is None:
|
||||
return None
|
||||
|
||||
else:
|
||||
with self.database:
|
||||
self.database.execute(self._SQLITE_INCREMENT_USAGES, query_args)
|
||||
|
||||
return result[0]
|
||||
|
||||
def _cache_set(self, text: str, speaker: str, audio: bytes) -> None:
|
||||
with self.database:
|
||||
self.database.execute(self._SQLITE_SET, {'text': text, 'speaker': speaker, 'audio': audio})
|
||||
|
@ -79,7 +79,7 @@ class TTSCommands(commands.Cog, Observ.Observer):
|
||||
voice_client.play(sound_source)
|
||||
|
||||
except Exception as synth_exception:
|
||||
logger.warning(f'Exception on synthesize {message.content!r}: {synth_exception}', exc_info=synth_exception)
|
||||
logger.opt(exception=True).warning(f'Exception on synthesize {message.content!r}: {synth_exception}')
|
||||
await message.channel.send(f'Internal error')
|
||||
DB.SynthesisErrors.create(speaker=speaker.value, text=message.content)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user