103 lines
2.7 KiB
Python
103 lines
2.7 KiB
Python
#encoding = utf8
|
|
|
|
import logging
|
|
import time
|
|
from enum import Enum
|
|
from queue import Empty
|
|
|
|
from eventbus import EventBus
|
|
from human_handler import AudioHandler
|
|
from utils import SyncQueue
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class RenderStatus(Enum):
|
|
E_Normal = 0,
|
|
E_Full = 1,
|
|
E_Empty = 2
|
|
|
|
|
|
class HumanRender(AudioHandler):
|
|
def __init__(self, context, handler):
|
|
super().__init__(context, handler)
|
|
|
|
EventBus().register('stop', self._on_stop)
|
|
self._queue = SyncQueue(context.batch_size, "HumanRender_queue")
|
|
self._empty_log = True
|
|
self._should_exit = False
|
|
self._render_status = RenderStatus.E_Empty
|
|
|
|
def __del__(self):
|
|
EventBus().unregister('stop', self._on_stop)
|
|
|
|
def _on_stop(self, *args, **kwargs):
|
|
self._should_exit = True
|
|
self.stop()
|
|
|
|
def _render(self, video_frame, voice_frame):
|
|
pass
|
|
|
|
def run(self):
|
|
logging.info('human render run')
|
|
delay = 1000 / self._context.fps * 0.001
|
|
while not self._should_exit:
|
|
if self._render_status is RenderStatus.E_Full:
|
|
time.sleep(delay)
|
|
continue
|
|
|
|
t = time.perf_counter()
|
|
self._run_step()
|
|
use = time.perf_counter() - t
|
|
if self._render_status is RenderStatus.E_Empty:
|
|
continue
|
|
real_delay = delay - use
|
|
# print(f'send voice {use}')
|
|
if real_delay > 0:
|
|
time.sleep(real_delay)
|
|
# else:
|
|
# print(f'send voice {real_delay}')
|
|
|
|
logging.info('human render exit')
|
|
|
|
def _run_step(self):
|
|
try:
|
|
value = self._queue.get(timeout=1)
|
|
if value is None:
|
|
return
|
|
res_frame, idx, audio_frames = value
|
|
if not self._empty_log:
|
|
self._empty_log = True
|
|
logging.info('human render:')
|
|
except Empty:
|
|
if self._empty_log:
|
|
self._empty_log = False
|
|
logging.info('render queue.Empty:')
|
|
return
|
|
|
|
type_ = 1
|
|
if audio_frames[0][1] != 0 and audio_frames[1][1] != 0:
|
|
type_ = 0
|
|
|
|
self._render((res_frame, idx, type_), audio_frames)
|
|
|
|
def on_message(self, message):
|
|
super().on_message(message)
|
|
|
|
def on_handle(self, stream, index):
|
|
if self._should_exit:
|
|
return
|
|
self._queue.put(stream)
|
|
|
|
def pause_talk(self):
|
|
logging.info('hunan pause_talk')
|
|
self._queue.clear()
|
|
super().pause_talk()
|
|
|
|
def stop(self):
|
|
logging.info('hunan render stop')
|
|
self._should_exit = True
|
|
self._queue.clear()
|
|
|
|
logging.info('hunan render stop')
|