human/human/human_render.py

118 lines
3.6 KiB
Python
Raw Normal View History

2024-10-16 11:04:12 +00:00
#encoding = utf8
2024-10-29 10:09:26 +00:00
import logging
2024-11-04 05:40:05 +00:00
import time
from queue import Empty
from threading import Event, Thread
2024-10-17 00:25:53 +00:00
2024-11-06 12:31:23 +00:00
from eventbus import EventBus
2024-10-25 00:23:55 +00:00
from human.message_type import MessageType
2024-10-17 15:26:21 +00:00
from human_handler import AudioHandler
2024-10-22 11:57:30 +00:00
from render import VoiceRender, VideoRender, PlayClock
2024-11-04 05:40:05 +00:00
from utils import SyncQueue
2024-10-16 11:04:12 +00:00
2024-10-21 11:55:04 +00:00
logger = logging.getLogger(__name__)
2024-10-16 11:04:12 +00:00
class HumanRender(AudioHandler):
def __init__(self, context, handler):
super().__init__(context, handler)
2024-11-06 12:31:23 +00:00
EventBus().register('stop', self._on_stop)
2024-11-08 11:49:53 +00:00
EventBus().register('clear_cache', self.on_clear_cache)
2024-10-22 11:57:30 +00:00
play_clock = PlayClock()
2024-10-25 00:23:55 +00:00
self._voice_render = VoiceRender(play_clock, context)
2024-10-22 11:57:30 +00:00
self._video_render = VideoRender(play_clock, context, self)
2024-11-06 12:31:23 +00:00
self._is_running = True
2024-11-04 05:40:05 +00:00
self._queue = SyncQueue(context.batch_size, "HumanRender_queue")
self._exit_event = Event()
self._thread = Thread(target=self._on_run, name="AudioMalHandlerThread")
self._exit_event.set()
self._thread.start()
2024-10-17 00:25:53 +00:00
self._image_render = None
2024-10-31 18:31:59 +00:00
self._last_audio_ps = 0
self._last_video_ps = 0
2024-11-06 12:31:23 +00:00
self._empty_log = True
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-06 12:31:23 +00:00
def _on_stop(self, *args, **kwargs):
self.stop()
2024-10-17 00:25:53 +00:00
2024-11-08 11:49:53 +00:00
def on_clear_cache(self, *args, **kwargs):
self._queue.clear()
2024-11-04 05:40:05 +00:00
def _on_run(self):
logging.info('human render run')
2024-11-06 12:31:23 +00:00
while self._exit_event.is_set() and self._is_running:
2024-11-04 05:40:05 +00:00
self._run_step()
2024-11-24 17:03:29 +00:00
delay = 0.04
2024-11-07 23:27:00 +00:00
time.sleep(delay)
2024-11-04 05:40:05 +00:00
logging.info('human render exit')
def _run_step(self):
try:
2024-11-06 12:31:23 +00:00
value = self._queue.get(timeout=.005)
2024-11-04 05:40:05 +00:00
if value is None:
return
res_frame, idx, audio_frames = value
2024-11-06 12:31:23 +00:00
if not self._empty_log:
self._empty_log = True
logging.info('render render:')
2024-11-04 05:40:05 +00:00
except Empty:
2024-11-06 12:31:23 +00:00
if self._empty_log:
self._empty_log = False
logging.info('render queue.Empty:')
2024-11-04 05:40:05 +00:00
return
type_ = 1
if audio_frames[0][1] != 0 and audio_frames[1][1] != 0:
type_ = 0
if self._voice_render is not None:
self._voice_render.render(audio_frames, self._last_audio_ps)
self._last_audio_ps = self._last_audio_ps + 0.4
if self._video_render is not None:
self._video_render.render((res_frame, idx, type_), self._last_video_ps)
self._last_video_ps = self._last_video_ps + 0.4
2024-10-22 11:57:30 +00:00
def set_image_render(self, render):
self._image_render = render
def put_image(self, image):
if self._image_render is not None:
self._image_render.on_render(image)
2024-10-25 00:23:55 +00:00
def on_message(self, message):
super().on_message(message)
2024-10-22 11:57:30 +00:00
def on_handle(self, stream, index):
2024-11-07 00:26:03 +00:00
if not self._is_running:
return
2024-11-04 05:40:05 +00:00
self._queue.put(stream)
2024-11-01 12:38:57 +00:00
2024-10-23 11:58:41 +00:00
def pause_talk(self):
2024-11-05 23:43:03 +00:00
logging.info('hunan pause_talk')
2024-11-05 11:40:03 +00:00
# self._voice_render.pause_talk()
# self._video_render.pause_talk()
2024-10-23 11:58:41 +00:00
2024-10-22 11:57:30 +00:00
def stop(self):
2024-11-04 05:40:05 +00:00
logging.info('hunan render stop')
2024-11-06 12:31:23 +00:00
self._is_running = False
2024-11-04 05:40:05 +00:00
if self._exit_event is None:
return
2024-11-07 00:26:03 +00:00
self._queue.clear()
2024-11-04 05:40:05 +00:00
self._exit_event.clear()
if self._thread.is_alive():
self._thread.join()
logging.info('hunan render stop')
# self._voice_render.stop()
# self._video_render.stop()
2024-10-22 11:57:30 +00:00
# self._exit_event.clear()
# self._thread.join()
2024-10-17 00:25:53 +00:00