|
|
|
@ -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':
|
|
|
|
|