human/human/human_render.py
2024-12-09 02:03:33 +08:00

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')