Skip to content

Commit 4080b1b

Browse files
committed
feat: add admin api and avatar api. add admin dashboard, avatar generation page, and main index page
1 parent ca043b8 commit 4080b1b

18 files changed

Lines changed: 3233 additions & 660 deletions

app.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#from gevent import pywsgi
2525
#from geventwebsocket.handler import WebSocketHandler
2626
import re
27+
import os
2728
import numpy as np
2829
from threading import Thread,Event
2930
#import multiprocessing
@@ -76,6 +77,7 @@ def build_avatar_session(sessionid:str, params:dict)->BaseAvatar:
7677
opt_this.sessionid = sessionid
7778

7879
avatar_id = params.get('avatar',opt.avatar_id)
80+
opt_this.avatar_id = avatar_id
7981
ref_audio = params.get('refaudio','') #音色
8082
ref_text = params.get('reftext','')
8183
if (avatar_id and avatar_id != opt.avatar_id):
@@ -102,6 +104,17 @@ async def offer(request):
102104
async def on_shutdown(app):
103105
await rtc_manager.shutdown()
104106

107+
async def download_record(request):
108+
sessionid = request.match_info.get('sessionid')
109+
if not sessionid:
110+
return web.Response(status=400, text="sessionid is required")
111+
112+
record_file = os.path.join('data', 'record', f"{sessionid}.mp4")
113+
114+
if os.path.exists(record_file):
115+
return web.FileResponse(record_file)
116+
else:
117+
return web.Response(status=404, text="Record not found")
105118

106119

107120
def main():
@@ -152,9 +165,12 @@ def main():
152165
#############################################################################
153166
appasync = web.Application(client_max_size=1024**2*100)
154167
appasync["llm_response"] = llm_response
168+
appasync["opt"] = opt
169+
appasync["rtc_manager"] = rtc_manager
155170

156171
appasync.on_shutdown.append(on_shutdown)
157172
appasync.router.add_post("/offer", offer)
173+
appasync.router.add_get("/record/{sessionid}", download_record)
158174

159175
# 注册 server/routes.py 中的通用 API 路由
160176
setup_routes(appasync)
@@ -171,13 +187,13 @@ def main():
171187
for route in list(appasync.router.routes()):
172188
cors.add(route)
173189

174-
pagename='webrtcapi.html'
190+
pagename='index.html'
175191
if opt.transport=='rtmp':
176192
pagename='rtmpapi.html'
177193
elif opt.transport=='rtcpush':
178194
pagename='rtcpushapi.html'
179195
logger.info('start http server; http://<serverip>:'+str(opt.listenport)+'/'+pagename)
180-
logger.info('如果使用webrtc,推荐访问webrtc集成前端: http://<serverip>:'+str(opt.listenport)+'/dashboard.html')
196+
# logger.info('如果使用webrtc,推荐访问webrtc集成前端: http://<serverip>:'+str(opt.listenport)+'/dashboard.html')
181197
def run_server(runner):
182198
loop = asyncio.new_event_loop()
183199
asyncio.set_event_loop(loop)

avatars/base_avatar.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,8 +264,23 @@ def stop_recording(self):
264264
self._record_video_pipe.wait()
265265
self._record_audio_pipe.stdin.close()
266266
self._record_audio_pipe.wait()
267-
cmd_combine_audio = f"ffmpeg -y -i temp{self.opt.sessionid}.aac -i temp{self.opt.sessionid}.mp4 -c:v copy -c:a copy data/record.mp4"
267+
268+
record_path = os.path.join('data', 'record')
269+
os.makedirs(record_path, exist_ok=True)
270+
output_file = os.path.join(record_path, f"{self.opt.sessionid}.mp4")
271+
272+
temp_aac = f"temp{self.opt.sessionid}.aac"
273+
temp_mp4 = f"temp{self.opt.sessionid}.mp4"
274+
275+
cmd_combine_audio = f"ffmpeg -y -i {temp_aac} -i {temp_mp4} -c:v copy -c:a copy {output_file}"
268276
os.system(cmd_combine_audio)
277+
278+
# 删除临时文件
279+
try:
280+
os.remove(temp_aac)
281+
os.remove(temp_mp4)
282+
except Exception as e:
283+
logger.error(f"Error removing temp files: {e}")
269284

270285
# def mirror_index(self, size, index):
271286
# turn = index // size

0 commit comments

Comments
 (0)