human/render/voice_render.py

61 lines
1.9 KiB
Python
Raw Normal View History

2024-10-22 11:57:30 +00:00
#encoding = utf8
import logging
import time
from queue import Empty
import numpy as np
from audio_render import AudioRender
2024-10-25 00:23:55 +00:00
from human.message_type import MessageType
2024-10-23 09:44:33 +00:00
from .base_render import BaseRender
2024-10-22 11:57:30 +00:00
logger = logging.getLogger(__name__)
class VoiceRender(BaseRender):
2024-10-25 00:23:55 +00:00
def __init__(self, play_clock, context):
2024-10-22 11:57:30 +00:00
self._audio_render = AudioRender()
2024-10-27 05:51:22 +00:00
self._is_empty = True
super().__init__(play_clock, context, 'Voice')
2024-10-22 11:57:30 +00:00
2024-10-25 00:23:55 +00:00
def is_full(self):
2024-10-30 08:34:12 +00:00
return self._queue.size() >= self._context.render_batch * 2
2024-10-25 00:23:55 +00:00
2024-10-23 09:44:33 +00:00
def _run_step(self):
2024-10-22 11:57:30 +00:00
try:
2024-10-30 08:34:12 +00:00
value = self._queue.get()
if value is None:
return
audio_frames, ps = value
2024-10-27 05:51:22 +00:00
# print('voice render queue size', self._queue.qsize())
2024-10-22 11:57:30 +00:00
except Empty:
2024-10-25 00:23:55 +00:00
self._context.notify({'msg_id': MessageType.Video_Render_Queue_Empty})
2024-10-27 05:51:22 +00:00
if not self._is_empty:
print('voice render queue empty')
self._is_empty = True
2024-10-22 11:57:30 +00:00
return
2024-10-27 05:51:22 +00:00
if self._is_empty:
print('voice render queue not empty')
self._is_empty = False
2024-10-25 00:23:55 +00:00
status = MessageType.Video_Render_Queue_Not_Empty
2024-10-30 08:34:12 +00:00
if self._queue.size() < self._context.render_batch:
2024-10-25 00:23:55 +00:00
status = MessageType.Video_Render_Queue_Empty
2024-10-30 08:34:12 +00:00
elif self._queue.size() >= self._context.render_batch * 2:
2024-10-25 00:23:55 +00:00
status = MessageType.Video_Render_Queue_Full
self._context.notify({'msg_id': status})
2024-10-22 11:57:30 +00:00
self._play_clock.update_display_time()
self._play_clock.current_time = ps
for audio_frame in audio_frames:
frame, type_ = audio_frame
frame = (frame * 32767).astype(np.int16)
if self._audio_render is not None:
try:
self._audio_render.write(frame.tobytes(), int(frame.shape[0] * 2))
except Exception as e:
logging.error(f'Error writing audio frame: {e}')