2024-10-10 11:01:13 +00:00
|
|
|
#encoding = utf8
|
|
|
|
|
|
|
|
import logging
|
|
|
|
import time
|
|
|
|
|
2024-11-07 12:43:46 +00:00
|
|
|
from eventbus import EventBus
|
2024-10-10 11:01:13 +00:00
|
|
|
from nlp import NLPCallback
|
|
|
|
from utils import AsyncTaskQueue
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
class TTSBase(NLPCallback):
|
2024-10-11 12:09:54 +00:00
|
|
|
def __init__(self, handle):
|
|
|
|
self._handle = handle
|
2024-11-07 00:26:03 +00:00
|
|
|
self._message_queue = AsyncTaskQueue('TTSBaseQueue', 5)
|
2024-11-07 12:43:46 +00:00
|
|
|
self._is_running = True
|
|
|
|
EventBus().register('stop', self.on_stop)
|
2024-11-08 11:49:53 +00:00
|
|
|
EventBus().register('clear_cache', self.on_clear_cache)
|
2024-11-07 12:43:46 +00:00
|
|
|
|
|
|
|
def __del__(self):
|
|
|
|
EventBus().unregister('stop', self.on_stop)
|
2024-11-08 11:49:53 +00:00
|
|
|
EventBus().unregister('clear_cache', self.on_clear_cache)
|
2024-11-07 12:43:46 +00:00
|
|
|
|
|
|
|
def on_stop(self, *args, **kwargs):
|
|
|
|
self.stop()
|
2024-10-10 11:01:13 +00:00
|
|
|
|
2024-11-08 11:49:53 +00:00
|
|
|
def on_clear_cache(self, *args, **kwargs):
|
|
|
|
logger.info('TTSBase clear_cache')
|
|
|
|
self._message_queue.clear()
|
|
|
|
|
2024-10-11 12:09:54 +00:00
|
|
|
@property
|
|
|
|
def handle(self):
|
|
|
|
return self._handle
|
|
|
|
|
|
|
|
@handle.setter
|
|
|
|
def handle(self, value):
|
|
|
|
self._handle = value
|
|
|
|
|
2024-10-14 10:20:55 +00:00
|
|
|
async def _request(self, txt: str, index):
|
2024-11-07 23:27:00 +00:00
|
|
|
# print('_request:', txt)
|
2024-11-08 23:39:03 +00:00
|
|
|
if not self._is_running:
|
|
|
|
logger.info('TTSBase::_request is not running')
|
|
|
|
return
|
|
|
|
|
2024-10-10 11:01:13 +00:00
|
|
|
t = time.time()
|
2024-10-14 10:20:55 +00:00
|
|
|
stream = await self._on_request(txt)
|
2024-11-08 23:39:03 +00:00
|
|
|
if stream is None or self._is_running is False:
|
|
|
|
logger.warn(f'-------stream is None or is_running {self._is_running}')
|
2024-10-14 10:20:55 +00:00
|
|
|
return
|
2024-11-07 23:27:00 +00:00
|
|
|
logger.info(f'-------tts time:{time.time() - t:.4f}s, txt:{txt}')
|
2024-11-05 14:06:02 +00:00
|
|
|
if self._handle is not None and self._is_running:
|
|
|
|
await self._on_handle(stream, index)
|
|
|
|
else:
|
|
|
|
logger.info(f'handle is None, running:{self._is_running}')
|
2024-10-10 11:01:13 +00:00
|
|
|
|
|
|
|
async def _on_request(self, text: str):
|
|
|
|
pass
|
|
|
|
|
2024-10-14 10:20:55 +00:00
|
|
|
async def _on_handle(self, stream, index):
|
|
|
|
pass
|
|
|
|
|
|
|
|
async def _on_close(self):
|
2024-10-10 11:01:13 +00:00
|
|
|
pass
|
|
|
|
|
|
|
|
def on_message(self, txt: str):
|
|
|
|
self.message(txt)
|
|
|
|
|
|
|
|
def message(self, txt):
|
2024-11-08 23:39:03 +00:00
|
|
|
if not self._is_running:
|
|
|
|
logger.info('TTSBase::message is not running')
|
|
|
|
return
|
2024-10-18 00:15:48 +00:00
|
|
|
txt = txt.strip()
|
|
|
|
if len(txt) == 0:
|
2024-11-07 23:27:00 +00:00
|
|
|
# logger.info(f'message is empty')
|
2024-10-18 00:15:48 +00:00
|
|
|
return
|
2024-10-10 11:01:13 +00:00
|
|
|
logger.info(f'message:{txt}')
|
2024-10-14 10:20:55 +00:00
|
|
|
index = 0
|
|
|
|
if self._handle is not None:
|
|
|
|
index = self._handle.get_index()
|
2024-11-07 23:27:00 +00:00
|
|
|
# print(f'message txt-index:{txt}, index {index}')
|
2024-10-14 10:20:55 +00:00
|
|
|
self._message_queue.add_task(self._request, txt, index)
|
2024-10-10 11:01:13 +00:00
|
|
|
|
|
|
|
def stop(self):
|
2024-11-07 12:43:46 +00:00
|
|
|
self._is_running = False
|
2024-10-14 10:20:55 +00:00
|
|
|
self._message_queue.add_task(self._on_close)
|
2024-10-10 11:01:13 +00:00
|
|
|
self._message_queue.stop()
|
2024-10-19 10:47:34 +00:00
|
|
|
|
|
|
|
def pause_talk(self):
|
2024-11-05 14:06:02 +00:00
|
|
|
logger.info(f'TTSBase pause_talk')
|
2024-10-19 10:47:34 +00:00
|
|
|
self._message_queue.clear()
|