From b223e9f03c7860a21977274ca2e1996e3675d541 Mon Sep 17 00:00:00 2001 From: fanpt <320622572@qq.com> Date: Fri, 12 Sep 2025 15:27:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E7=A6=BBapi=E6=8E=A5=E5=8F=A3,?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B7=AE=E5=80=BC=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- liveMan.py | 4 ++-- main.py | 60 ++++++++++++++++-------------------------------------- 2 files changed, 20 insertions(+), 44 deletions(-) diff --git a/liveMan.py b/liveMan.py index abf5756..e97d611 100644 --- a/liveMan.py +++ b/liveMan.py @@ -422,7 +422,7 @@ class DouyinLiveWebReply: :param text: 文本 :return: 耗时 单位秒 """ - return len(text)/5 + return len(text)/4.5 def __call__(self): """ @@ -531,9 +531,9 @@ class DouyinLiveWebReply: 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") + self.config["prediction_queue"].append(formatted_time) logger.info(f'预计在{formatted_time}发送下一段语音') self.post_to_human_sync(reply_message) diff --git a/main.py b/main.py index 0ff91cc..c20d54e 100644 --- a/main.py +++ b/main.py @@ -1,44 +1,15 @@ -import time -from fastapi import FastAPI -from pydantic import BaseModel import uvicorn from multiprocessing import Process, Event, freeze_support, Manager from loguru import logger -from liveMan import DouyinLiveWebFetcher, DouyinLiveWebReply from helper import PromptQueue, LiveChatConfig +from liveMan import DouyinLiveWebFetcher, DouyinLiveWebReply -logger.add('log.log', encoding='utf-8', rotation="500MB") - -# FastAPI应用实例 -app = FastAPI(title="直播状态控制接口") - -# 请求体模型 -class SpeakingStatus(BaseModel): - is_speaking: bool - -# 全局变量,用于在FastAPI进程中存储共享字典引用 -app.state.shared_config = None - -# 接口:更新is_speaking状态 -@app.post("/speaking-status", summary="更新说话状态") -def update_speaking_status(status: SpeakingStatus): - if app.state.shared_config is None: - return {"error": "服务未初始化"} - app.state.shared_config['is_speaking'] = status.is_speaking - # logger.info(f"通过API更新is_speaking状态为: {status.is_speaking}") - return { - "message": "状态更新成功", - "current_status": { - "is_speaking": app.state.shared_config['is_speaking'], - } - } +logger.add("log.log", encoding="utf-8", rotation="500MB") -# 启动FastAPI服务的函数,接收共享字典作为参数 def start_fastapi_server(shared_config): - # 将共享字典存储到FastAPI应用的状态中 - app.state.shared_config = shared_config - # 启动UVicorn服务器 + from app import app + app.shared_config = shared_config uvicorn.run(app, host="0.0.0.0", port=8000) def fetch_user_chat_content(ws_open_event, queue): @@ -49,19 +20,24 @@ def reply_user_chat_content(queue, config): reply = DouyinLiveWebReply(queue, config) reply() -if __name__ == '__main__': +if __name__ == "__main__": freeze_support() - LiveChatConfig().update_chat_enable_status('启动中') + LiveChatConfig().update_chat_enable_status("启动中") with Manager() as manager: - # 创建共享字典,包含所有需要的键 + prediction_queue = manager.list() # 共享队列,用来存放预测时间(字符串) + shared_config = manager.dict({ - 'is_speaking': False + "is_speaking": False, + "predicted_time": None, # 最近一次用于对时差计算的预测时间 + "speaking_false_time": None, # is_speaking 变为 False 的真实时间 + "time_diff_seconds": None, # 真实时间 - 预测时间(秒) + "prediction_queue": prediction_queue # FIFO 队列,避免覆盖 }) + queue = PromptQueue(10) ws_open_event = Event() - # 创建进程时将共享字典传递给FastAPI服务 api_process = Process( target=start_fastapi_server, args=(shared_config,), @@ -69,20 +45,20 @@ if __name__ == '__main__': ) fetch_process = Process( target=fetch_user_chat_content, - args=(ws_open_event, queue) + args=(ws_open_event, queue), + name="Fetcher" ) reply_process = Process( target=reply_user_chat_content, - args=(queue, shared_config) + args=(queue, shared_config), + name="Replier" ) - # 启动所有进程 api_process.start() fetch_process.start() ws_open_event.wait() reply_process.start() - # 等待所有进程完成 fetch_process.join() reply_process.join() api_process.join()