feat: add migrations, test scripts, and utility tools

- Add database migrations (006-028) for face recognition, identity, file_uuid
- Add test scripts for ASR, face, search, processing
- Add portal frontend (Tauri)
- Add config, benchmark, and monitoring utilities
- Add model checkpoints and pretrained model references
This commit is contained in:
Warren
2026-04-30 15:11:53 +08:00
parent 4d75b2e251
commit b54c2def30
192 changed files with 46721 additions and 0 deletions

View File

@@ -0,0 +1,275 @@
#!/opt/homebrew/bin/python3.11
"""
监控 ASR/CUT 处理完成情况
Monitor ASR/CUT processing completion
"""
import os
import sys
import time
import psutil
from datetime import datetime
def get_system_load():
"""获取系统负载"""
load_avg = os.getloadavg()
cpu_percent = psutil.cpu_percent(interval=1)
memory = psutil.virtual_memory()
return {
"load_1min": load_avg[0],
"load_5min": load_avg[1],
"load_15min": load_avg[2],
"cpu_percent": cpu_percent,
"memory_percent": memory.percent,
"memory_used_gb": memory.used / (1024**3),
"memory_total_gb": memory.total / (1024**3),
}
def find_processor_processes():
"""查找处理器进程"""
processors = {
"asr": [],
"cut": [],
"ocr": [],
"yolo": [],
"face": [],
"pose": [],
"asrx": [],
"caption": [],
"story": [],
}
for proc in psutil.process_iter(
["pid", "name", "cmdline", "cpu_percent", "memory_percent"]
):
try:
cmdline = " ".join(proc.info["cmdline"]) if proc.info["cmdline"] else ""
# 检查各种处理器
if "asr_processor" in cmdline:
processors["asr"].append(
{
"pid": proc.pid,
"cpu": proc.info.get("cpu_percent", 0),
"memory": proc.info.get("memory_percent", 0),
"cmdline": cmdline[:100] + "..."
if len(cmdline) > 100
else cmdline,
}
)
elif "cut_processor" in cmdline:
processors["cut"].append(
{
"pid": proc.pid,
"cpu": proc.info.get("cpu_percent", 0),
"memory": proc.info.get("memory_percent", 0),
"cmdline": cmdline[:100] + "..."
if len(cmdline) > 100
else cmdline,
}
)
elif "ocr_processor" in cmdline:
processors["ocr"].append(proc.pid)
elif "yolo_processor" in cmdline:
processors["yolo"].append(proc.pid)
elif "face_processor" in cmdline:
processors["face"].append(proc.pid)
elif "pose_processor" in cmdline:
processors["pose"].append(proc.pid)
except (psutil.NoSuchProcess, psutil.AccessDenied):
continue
return processors
def check_output_files():
"""检查输出文件"""
output_dir = "/Users/accusys/momentry/output"
if not os.path.exists(output_dir):
return {}
files = {}
for filename in os.listdir(output_dir):
if filename.endswith(".json"):
# 提取处理器类型
if "_asr_" in filename:
processor = "asr"
elif "_cut_" in filename:
processor = "cut"
elif "_ocr_" in filename:
processor = "ocr"
elif "_yolo_" in filename:
processor = "yolo"
elif "_face_" in filename:
processor = "face"
elif "_pose_" in filename:
processor = "pose"
elif "_asrx_" in filename:
processor = "asrx"
elif "_caption_" in filename:
processor = "caption"
elif "_story_" in filename:
processor = "story"
else:
continue
if processor not in files:
files[processor] = []
filepath = os.path.join(output_dir, filename)
try:
size = os.path.getsize(filepath)
mtime = os.path.getmtime(filepath)
files[processor].append(
{
"filename": filename,
"size": size,
"mtime": datetime.fromtimestamp(mtime),
"age_seconds": time.time() - mtime,
}
)
except:
pass
# 按修改时间排序
for processor in files:
files[processor].sort(key=lambda x: x["mtime"], reverse=True)
return files
def main():
print("=" * 80)
print("ASR/CUT 处理完成监控")
print(f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("=" * 80)
# 获取系统状态
system = get_system_load()
print(f"\n📊 系统状态:")
print(
f" 负载: {system['load_1min']:.2f} (1min), {system['load_5min']:.2f} (5min), {system['load_15min']:.2f} (15min)"
)
print(f" CPU使用率: {system['cpu_percent']:.1f}%")
print(
f" 内存: {system['memory_percent']:.1f}% ({system['memory_used_gb']:.1f}GB / {system['memory_total_gb']:.1f}GB)"
)
# 查找处理器进程
processors = find_processor_processes()
print(f"\n🔍 处理器进程:")
for processor_type, procs in processors.items():
if procs:
if (
processor_type in ["asr", "cut"]
and isinstance(procs, list)
and len(procs) > 0
):
# 对于 ASR 和 CUT显示详细信息
print(f" {processor_type.upper()}: {len(procs)} 个进程")
for proc in procs[:3]: # 只显示前3个
print(
f" PID {proc['pid']}: CPU {proc['cpu']:.1f}%, 内存 {proc['memory']:.1f}%"
)
print(f" 命令: {proc['cmdline']}")
if len(procs) > 3:
print(f" ... 还有 {len(procs) - 3} 个进程")
else:
print(f" {processor_type.upper()}: {len(procs)} 个进程")
# 检查输出文件
output_files = check_output_files()
print(f"\n📁 输出文件统计:")
for processor_type, files in output_files.items():
if files:
latest = files[0]
print(f" {processor_type.upper()}: {len(files)} 个文件")
print(
f" 最新: {latest['filename']} ({latest['size']} 字节, {latest['age_seconds']:.0f} 秒前)"
)
# 分析状态
print(f"\n📈 状态分析:")
# 检查 ASR 处理
asr_procs = len(processors.get("asr", []))
asr_files = len(output_files.get("asr", []))
if asr_procs > 0:
total_cpu = sum(p["cpu"] for p in processors["asr"])
print(f" ASR处理: {asr_procs} 个进程运行中 (总CPU: {total_cpu:.1f}%)")
if total_cpu > 100:
print(f" ⚠️ CPU使用率很高可能正在处理视频")
elif total_cpu < 10:
print(f" ✅ CPU使用率正常可能接近完成")
else:
print(f" ASR处理: 没有运行中的进程")
if asr_files > 0:
print(f" ✅ 已完成 {asr_files} 个处理任务")
# 检查 CUT 处理
cut_procs = len(processors.get("cut", []))
cut_files = len(output_files.get("cut", []))
if cut_procs > 0:
print(f" CUT处理: {cut_procs} 个进程运行中")
else:
print(f" CUT处理: 没有运行中的进程")
if cut_files > 0:
print(f" ✅ 已完成 {cut_files} 个处理任务")
# 系统负载分析
if system["load_1min"] > 8:
print(f" ⚠️ 系统负载很高 ({system['load_1min']:.1f})")
print(f" 建议等待处理完成后再进行其他操作")
elif system["load_1min"] > 4:
print(f" 系统负载中等 ({system['load_1min']:.1f})")
else:
print(f" ✅ 系统负载正常 ({system['load_1min']:.1f})")
# 内存分析
if system["memory_percent"] > 90:
print(f" ⚠️ 内存使用率很高 ({system['memory_percent']:.1f}%)")
print(f" 建议监控内存使用情况")
elif system["memory_percent"] > 80:
print(f" 内存使用率较高 ({system['memory_percent']:.1f}%)")
print(f"\n⏱️ 监控将持续运行,按 Ctrl+C 停止")
print("=" * 80)
return {
"system": system,
"processors": processors,
"output_files": output_files,
}
if __name__ == "__main__":
try:
# 第一次运行
data = main()
# 持续监控
interval = 30 # 秒
print(f"\n开始持续监控,每 {interval} 秒更新一次...\n")
while True:
time.sleep(interval)
print("\n" + "=" * 80)
print(f"更新: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("=" * 80)
data = main()
except KeyboardInterrupt:
print(f"\n\n监控已停止")
sys.exit(0)
except Exception as e:
print(f"\n错误: {e}")
sys.exit(1)