更新连接chat服务方式

main
樊鹏涛 4 days ago
parent 48e9bf118a
commit 74a80c8cc4

@ -217,7 +217,6 @@ async def human(request):
nerfreals[sessionid].flush_talk() nerfreals[sessionid].flush_talk()
if params['type'] == 'echo': if params['type'] == 'echo':
nerfreals[sessionid].set_speaking_state(True)
nerfreals[sessionid].put_msg_txt(params['text']) nerfreals[sessionid].put_msg_txt(params['text'])
elif params['type'] == 'chat': 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): async def set_live_room_control_mode(request):
try: try:
@ -294,39 +311,26 @@ async def set_live_room_control_mode(request):
current_control_mode = params.get('current_control_mode', 0) current_control_mode = params.get('current_control_mode', 0)
sessionid = params.get('sessionid', 0) sessionid = params.get('sessionid', 0)
# 检查 sessionid 是否存在
if sessionid not in nerfreals: if sessionid not in nerfreals:
return web.Response( return web.Response(
content_type="application/json", content_type="application/json",
text=json.dumps({"code": 404, "msg": f"Session {sessionid} not found"}) text=json.dumps({"code": 404, "msg": f"Session {sessionid} not found"})
) )
# 如果当前为手动接管模式
if current_control_mode == 0: # 手动接管 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.") 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( return web.Response(
content_type="application/json", content_type="application/json",
text=json.dumps({"code": 200, "msg": "Live room control mode set to manual"}) text=json.dumps({"code": 200, "msg": "Live room control mode set to manual"})
) )
# 如果切换到 AI 接管模式
elif current_control_mode == 1: # AI 接管 elif current_control_mode == 1: # AI 接管
# 1. 设置为 AI 接管 await update_control_mode(1)
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)
logger.info(f"Live room control mode set to AI for session {sessionid}. Chat can resume sending messages.")
return web.Response( return web.Response(
content_type="application/json", content_type="application/json",
text=json.dumps({"code": 200, "msg": "Live room control mode set to AI"}) 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)}) text=json.dumps({"code": 500, "msg": str(e)})
) )
async def set_audiotype(request): async def set_audiotype(request):
try: try:
params = await request.json() 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('--customvideo_config', type=str, default='', help="custom action json")
parser.add_argument('--tts', type=str, default='gpt-sovits', parser.add_argument('--tts', type=str, default='gpt-sovits', help="tts service type") # xtts gpt-sovits cosyvoice
help="tts service type") # xtts gpt-sovits cosyvoice
parser.add_argument('--REF_FILE', type=str, default="input/gentle_girl.wav") parser.add_argument('--REF_FILE', type=str, default="input/gentle_girl.wav")
parser.add_argument('--REF_TEXT', type=str, parser.add_argument('--REF_TEXT', type=str, default="刚进直播间的宝子们,左上角先点个关注,点亮咱们家的粉丝灯牌!我是你们的主播陈婉婉,今天给大家准备了超级重磅的福利")
default="刚进直播间的宝子们,左上角先点个关注,点亮咱们家的粉丝灯牌!我是你们的主播陈婉婉,今天给大家准备了超级重磅的福利")
parser.add_argument('--TTS_SERVER', type=str, default='http://127.0.0.1:9880') # http://localhost:9000 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 parser.add_argument('--model', type=str, default='wav2lip') # musetalk wav2lip ultralight
@ -508,6 +512,7 @@ if __name__ == '__main__':
'ref_file': 'REF_FILE', 'ref_file': 'REF_FILE',
'ref_text': 'REF_TEXT', 'ref_text': 'REF_TEXT',
'tts_server': 'TTS_SERVER', 'tts_server': 'TTS_SERVER',
'chat_server': 'chat_server',
} }
for db_key, db_val in config_dict.items(): 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("/interrupt_talk", interrupt_talk)
appasync.router.add_post("/is_speaking", is_speaking) 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("/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') appasync.router.add_static('/', path='web')
# Configure default CORS settings. # Configure default CORS settings.
@ -590,14 +594,14 @@ if __name__ == '__main__':
for route in list(appasync.router.routes()): for route in list(appasync.router.routes()):
cors.add(route) cors.add(route)
# 端口配置 # # 端口配置
listen_port = opt.listenport # 从配置中获取监听端口 # listen_port = opt.listenport # 从配置中获取监听端口
#
# 检查端口是否被占用 # # 检查端口是否被占用
if not check_port(listen_port): # if not check_port(listen_port):
logger.error(f"端口 {listen_port} 已被占用,无法启动服务。") # logger.error(f"端口 {listen_port} 已被占用,无法启动服务。")
set_status(db_path, 3) # 设置为启动失败 # set_status(db_path, 3) # 设置为启动失败
exit(1) # 退出程序 # exit(1) # 退出程序
pagename = 'webrtcapi.html' pagename = 'webrtcapi.html'
if opt.transport == 'rtmp': if opt.transport == 'rtmp':

@ -165,38 +165,9 @@ class BaseReal:
for key in self.custom_index: for key in self.custom_index:
self.custom_index[key]=0 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): def notify(self, eventpoint):
logger.info("notify:%s", 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): def start_recording(self):
"""开始录制视频""" """开始录制视频"""
if self.recording: if self.recording:

Loading…
Cancel
Save