|
|
|
@ -12,7 +12,7 @@ import traceback
|
|
|
|
|
import urllib.parse
|
|
|
|
|
from contextlib import contextmanager
|
|
|
|
|
from unittest.mock import patch
|
|
|
|
|
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
import httpx
|
|
|
|
|
import requests
|
|
|
|
|
import websocket
|
|
|
|
@ -415,6 +415,15 @@ class DouyinLiveWebReply:
|
|
|
|
|
self.live_chat_config.insert_message(message, _type, batch_number)
|
|
|
|
|
logger.info(f'入库文案:{_type} | {message}')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def text_to_adio_cost_predict(self, text):
|
|
|
|
|
"""
|
|
|
|
|
计算文本转语音的耗时
|
|
|
|
|
:param text: 文本
|
|
|
|
|
:return: 耗时 单位秒
|
|
|
|
|
"""
|
|
|
|
|
return len(text)/5
|
|
|
|
|
|
|
|
|
|
def __call__(self):
|
|
|
|
|
"""
|
|
|
|
|
优先从用户交互队列中取提示词,如果没有用户交互的数据,则输出系统提示词
|
|
|
|
@ -424,17 +433,18 @@ class DouyinLiveWebReply:
|
|
|
|
|
logger.info(f'livetalking address -> {self.live_chat_config.livetalking_address}')
|
|
|
|
|
logger.info(f'ollama_address -> {self.live_chat_config.ollama_address}')
|
|
|
|
|
|
|
|
|
|
# 下次调用post_to_human的时间
|
|
|
|
|
next_to_human_call_time = None
|
|
|
|
|
|
|
|
|
|
while True:
|
|
|
|
|
try:
|
|
|
|
|
is_speaking = self.config['is_speaking']
|
|
|
|
|
if is_speaking:
|
|
|
|
|
# next_to_human_call_time大于当前时间,立即调用
|
|
|
|
|
call_immediate = next_to_human_call_time is None or time.time() >= next_to_human_call_time
|
|
|
|
|
if not call_immediate:
|
|
|
|
|
prompt_data = self.queue.get(False)
|
|
|
|
|
if prompt_data is not None:
|
|
|
|
|
product_name, product_specification, product_description = self.live_chat_config.product_info
|
|
|
|
|
|
|
|
|
|
# 兼容老/新两种数据结构:
|
|
|
|
|
# 老结构: (message_type, prompt, live_chat)
|
|
|
|
|
# 新结构: (message_type, prompt, live_chat, user_name)
|
|
|
|
|
if isinstance(prompt_data, tuple) and len(prompt_data) == 4:
|
|
|
|
|
message_type, prompt, live_chat, sender_name = prompt_data
|
|
|
|
|
else:
|
|
|
|
@ -500,6 +510,7 @@ class DouyinLiveWebReply:
|
|
|
|
|
reply_message, from_user = self.response_queue.get()
|
|
|
|
|
reply_message = self.reply_message_postprocess(reply_message)
|
|
|
|
|
if from_user:
|
|
|
|
|
reply_message = f"{from_user}哥哥,{reply_message}"
|
|
|
|
|
logger.info(f"开始播放回复弹幕({from_user}):{reply_message}")
|
|
|
|
|
else:
|
|
|
|
|
logger.info(f"开始播放回复弹幕:{reply_message}")
|
|
|
|
@ -519,9 +530,12 @@ class DouyinLiveWebReply:
|
|
|
|
|
reply_message, _id = precedence_message
|
|
|
|
|
self.live_chat_config.flush_precedence_reply_message()
|
|
|
|
|
logger.info(f"开始播放系统文案:{reply_message}")
|
|
|
|
|
|
|
|
|
|
cost = self.text_to_adio_cost_predict(reply_message)
|
|
|
|
|
logger.info(f'文本:{reply_message}预计算出的语音时长:{cost}秒')
|
|
|
|
|
next_to_human_call_time = time.time() + cost
|
|
|
|
|
formatted_time = datetime.fromtimestamp(next_to_human_call_time).strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
|
logger.info(f'预计在{formatted_time}发送下一段语音')
|
|
|
|
|
self.post_to_human_sync(reply_message)
|
|
|
|
|
time.sleep(1)
|
|
|
|
|
|
|
|
|
|
except Exception:
|
|
|
|
|
logger.error(traceback.format_exc())
|
|
|
|
|