diff --git a/app.py b/app.py index cdda894..b416767 100644 --- a/app.py +++ b/app.py @@ -217,7 +217,6 @@ async def human(request): nerfreals[sessionid].flush_talk() if params['type'] == 'echo': - nerfreals[sessionid].set_speaking_state(True) nerfreals[sessionid].put_msg_txt(params['text']) elif params['type'] == 'chat': @@ -287,6 +286,24 @@ async def humanaudio(request): ), ) +async def update_control_mode(mode: int): + """调用聊天服务器接口,更新直播间接管模式;地址来自 opt.chat_server 或数据库""" + base = getattr(opt, 'chat_server', 'http://127.0.0.1:9880') + url = f"{base.rstrip('/')}/control-mode" + data = {"control_mode": mode} # 0=手动, 1=AI + try: + async with aiohttp.ClientSession() as session: + async with session.post(url, json=data) as response: + if response.status == 200: + result = await response.json() + print(f"更新control_mode状态:{result}") + else: + print(f"请求失败,状态码:{response.status}") + except Exception as e: + print(f"请求更新control_mode失败: {e}") + + + async def set_live_room_control_mode(request): try: @@ -294,39 +311,26 @@ async def set_live_room_control_mode(request): current_control_mode = params.get('current_control_mode', 0) sessionid = params.get('sessionid', 0) - # 检查 sessionid 是否存在 if sessionid not in nerfreals: return web.Response( content_type="application/json", text=json.dumps({"code": 404, "msg": f"Session {sessionid} not found"}) ) - # 如果当前为手动接管模式 if current_control_mode == 0: # 手动接管 - # 1. 暂停当前讲话 - nerfreals[sessionid].flush_talk() # 先暂停当前语音合成 + nerfreals[sessionid].flush_talk() + await update_control_mode(0) - # 2. 设置手动接管模式 - nerfreals[sessionid].manual_control_mode = True logger.info(f"Live room control mode set to manual for session {sessionid}. Chat will be stopped.") - - # 3. 将 liv_speaking 设置为 True - nerfreals[sessionid].liv_speaking = True - return web.Response( content_type="application/json", text=json.dumps({"code": 200, "msg": "Live room control mode set to manual"}) ) - # 如果切换到 AI 接管模式 elif current_control_mode == 1: # AI 接管 - # 1. 设置为 AI 接管 - nerfreals[sessionid].manual_control_mode = False # 设置为 AI 接管 - logger.info(f"Live room control mode set to AI for session {sessionid}. Chat can resume sending messages.") - - # 2. 告知chat服务可以继续讲话 - nerfreals[sessionid].set_speaking_state(False) + await update_control_mode(1) + logger.info(f"Live room control mode set to AI for session {sessionid}. Chat can resume sending messages.") return web.Response( content_type="application/json", text=json.dumps({"code": 200, "msg": "Live room control mode set to AI"}) @@ -343,6 +347,8 @@ async def set_live_room_control_mode(request): text=json.dumps({"code": 500, "msg": str(e)}) ) + + async def set_audiotype(request): try: params = await request.json() @@ -480,14 +486,12 @@ if __name__ == '__main__': parser.add_argument('--customvideo_config', type=str, default='', help="custom action json") - parser.add_argument('--tts', type=str, default='gpt-sovits', - help="tts service type") # xtts gpt-sovits cosyvoice + parser.add_argument('--tts', type=str, default='gpt-sovits', help="tts service type") # xtts gpt-sovits cosyvoice parser.add_argument('--REF_FILE', type=str, default="input/gentle_girl.wav") - parser.add_argument('--REF_TEXT', type=str, - default="刚进直播间的宝子们,左上角先点个关注,点亮咱们家的粉丝灯牌!我是你们的主播陈婉婉,今天给大家准备了超级重磅的福利") + parser.add_argument('--REF_TEXT', type=str, default="刚进直播间的宝子们,左上角先点个关注,点亮咱们家的粉丝灯牌!我是你们的主播陈婉婉,今天给大家准备了超级重磅的福利") parser.add_argument('--TTS_SERVER', type=str, default='http://127.0.0.1:9880') # http://localhost:9000 - # parser.add_argument('--CHARACTER', type=str, default='test') - # parser.add_argument('--EMOTION', type=str, default='default') + + parser.add_argument('--chat_server', type=str, default='http://127.0.0.1:9880') parser.add_argument('--model', type=str, default='wav2lip') # musetalk wav2lip ultralight @@ -508,6 +512,7 @@ if __name__ == '__main__': 'ref_file': 'REF_FILE', 'ref_text': 'REF_TEXT', 'tts_server': 'TTS_SERVER', + 'chat_server': 'chat_server', } for db_key, db_val in config_dict.items(): @@ -575,7 +580,6 @@ if __name__ == '__main__': appasync.router.add_post("/interrupt_talk", interrupt_talk) appasync.router.add_post("/is_speaking", is_speaking) appasync.router.add_post("/set_live_room_control_mode", set_live_room_control_mode) - appasync.router.add_post("/live_speaking_status", live_speaking_status) appasync.router.add_static('/', path='web') # Configure default CORS settings. @@ -590,14 +594,14 @@ if __name__ == '__main__': for route in list(appasync.router.routes()): cors.add(route) - # 端口配置 - listen_port = opt.listenport # 从配置中获取监听端口 - - # 检查端口是否被占用 - if not check_port(listen_port): - logger.error(f"端口 {listen_port} 已被占用,无法启动服务。") - set_status(db_path, 3) # 设置为启动失败 - exit(1) # 退出程序 + # # 端口配置 + # listen_port = opt.listenport # 从配置中获取监听端口 + # + # # 检查端口是否被占用 + # if not check_port(listen_port): + # logger.error(f"端口 {listen_port} 已被占用,无法启动服务。") + # set_status(db_path, 3) # 设置为启动失败 + # exit(1) # 退出程序 pagename = 'webrtcapi.html' if opt.transport == 'rtmp': diff --git a/basereal.py b/basereal.py index a2891d3..3ea5917 100644 --- a/basereal.py +++ b/basereal.py @@ -165,38 +165,9 @@ class BaseReal: for key in self.custom_index: self.custom_index[key]=0 - async def update_is_speaking(self, status: bool): - """调用本地接口,更新 is_speaking 状态""" - url = "http://127.0.0.1:8000/speaking-status" - data = {"is_speaking": status} - try: - async with aiohttp.ClientSession() as session: - async with session.post(url, json=data) as response: - if response.status == 200: - result = await response.json() - print(f"更新is_speaking状态:{result}") - else: - print(f"请求失败,状态码:{response.status}") - except Exception as e: - print(f"请求更新is_speaking失败: {e}") - - def set_speaking_state(self, state: bool): - """设置 liv_speaking 状态并调用接口更新""" - self.liv_speaking = state - asyncio.create_task(self.update_is_speaking(self.liv_speaking)) # 异步调用更新接口 - - def notify(self, eventpoint): logger.info("notify:%s", eventpoint) - # 如果是手动控制模式,忽略 TTS 结束信号,不设置 liv_speaking 为 False - if self.manual_control_mode: - return # 如果处于手动接管状态,直接返回,不改变 liv_speaking 的状态 - - if eventpoint['status'] == "end": - self.set_speaking_state(False) - logger.info("tts end") - def start_recording(self): """开始录制视频""" if self.recording: