diff --git a/.gitignore b/.gitignore index 5b5b75b..5152a14 100644 --- a/.gitignore +++ b/.gitignore @@ -1,23 +1,5 @@ -api_history/OpenBMB/* -!api_history/OpenBMB/.gitkeep - -chat_history/ChatTTS/* -!chat_history/ChatTTS/.gitkeep - -api_chat/OpenBMB/* -!api_chat/OpenBMB/.gitkeep - -api_chat/GPT_SoVITS/* -!api_chat/GPT_SoVITS/.gitkeep - -api_chat/tools/* -!api_chat/tools/.gitkeep - -api_chat/runtime/* -!api_chat/runtime/.gitkeep - -api_chat/docs/* -!api_chat/docs/.gitkeep +api_chat/TTS/* +!api_chat/TTS/.gitkeep api_chat/GPT_weights api_chat/GPT_weights_v2 diff --git a/README.md b/README.md index ffefd95..7c9b8c5 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,8 @@ 该项目为所有API集合,集成了视觉分析、聊天对话和语音处理等功能。 ## 更新日志 - - 20250403 部署到222.186.20.67时的更新 + - 20250410 部署到docker + - 20250403 部署到222.186.20.67时的更新 ## 项目结构 diff --git a/api/Dockerfile.face b/api/Dockerfile.face new file mode 100644 index 0000000..6d985b8 --- /dev/null +++ b/api/Dockerfile.face @@ -0,0 +1,49 @@ +# 使用CUDA基础镜像 +FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvidia/cuda:12.4.1-base-ubuntu22.04 + +WORKDIR /api_face + +ENV TZ=Asia/Shanghai +ENV TF_FORCE_GPU_ALLOW_GROWTH=true +ENV DEEPFACE_HOME=/obscura/models + +# 配置apt源为清华源 +RUN sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list && \ + sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list + +# 安装系统依赖 +RUN apt-get update && apt-get install -y \ + python3.11 \ + python3-pip \ + python3-dev \ + libgl1-mesa-glx \ + libglib2.0-0 \ + libsm6 \ + libxext6 \ + libxrender-dev \ + git \ + && rm -rf /var/lib/apt/lists/* + +# 配置Python +RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1 && \ + update-alternatives --set python3 /usr/bin/python3.11 + +# 配置pip源为清华源 +RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple +# 安装其他依赖 +COPY requirements_face.txt . +RUN python3 -m pip install --no-cache-dir -r requirements_face.txt + + +# 创建必要的目录 +RUN mkdir -p /obscura/models /obscura/task/upload /obscura/task/result + +# 复制应用代码 +COPY compare.py . +COPY config.py . +COPY media.py . +COPY start-face.sh . + +RUN chmod +x start-face.sh +# 启动服务并保持容器运行 +CMD ["bash", "-c", "./start-face.sh && tail -f logs/*.log"] \ No newline at end of file diff --git a/api/Dockerfile.vlm b/api/Dockerfile.vlm new file mode 100644 index 0000000..fc5db03 --- /dev/null +++ b/api/Dockerfile.vlm @@ -0,0 +1,63 @@ +FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvidia/cuda:12.4.1-cudnn-runtime-ubuntu22.04 + +WORKDIR /api_vlm + +ENV TZ=Asia/Shanghai + +ENV TF_FORCE_GPU_ALLOW_GROWTH=true +ENV TF_CPP_MIN_LOG_LEVEL=2 + +# 配置apt源为清华源 +RUN sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list && \ + sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list + +# 安装系统依赖 +RUN apt-get update && apt-get install -y \ + python3.11 \ + python3-pip \ + python3-dev \ + libgl1-mesa-glx \ + libglib2.0-0 \ + libsndfile1 \ + git \ + && rm -rf /var/lib/apt/lists/* + +RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1 && \ + update-alternatives --set python3 /usr/bin/python3.11 + +# 配置pip源为清华源 +RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple + +# 先安装基础依赖 +RUN python3 -m pip install --no-cache-dir \ + setuptools \ + wheel \ + numpy + +# 按特定顺序安装关键依赖 +RUN python3 -m pip install --no-cache-dir torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 +RUN python3 -m pip install --no-cache-dir accelerate==0.27.0 +RUN python3 -m pip install --no-cache-dir safetensors==0.5.3 +RUN python3 -m pip install --no-cache-dir transformers==4.49.0 +RUN python3 -m pip install --no-cache-dir qwen-vl-utils==0.0.10 + +# 安装其他依赖 +COPY requirements_vlm.txt . +RUN python3 -m pip install --no-cache-dir -r requirements_vlm.txt +RUN python3 -m pip install --no-cache-dir async_timeout tf-keras==2.19.0 + + +# 验证安装 +RUN python3 -c "from transformers import __version__; print('Transformers version:', __version__)" +RUN python3 -c "import torch; print('PyTorch version:', torch.__version__)" +RUN python3 -c "from transformers.modeling_utils import init_empty_weights" || echo "init_empty_weights not found in modeling_utils" + +# 复制整个 function 文件夹 +COPY . . +RUN mkdir -p /obscura/models /obscura/task/upload /obscura/task/result + +# 添加执行权限 +RUN chmod +x start-vlm.sh + +# 启动服务并保持容器运行 +CMD ["bash", "-c", "./start-vlm.sh && tail -f logs/*.log"] \ No newline at end of file diff --git a/api/Dockerfile.yolo b/api/Dockerfile.yolo new file mode 100644 index 0000000..efcf177 --- /dev/null +++ b/api/Dockerfile.yolo @@ -0,0 +1,52 @@ +FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvidia/cuda:12.4.1-cudnn-runtime-ubuntu22.04 + +WORKDIR /api_yolo + +ENV TZ=Asia/Shanghai +ENV TF_FORCE_GPU_ALLOW_GROWTH=true +ENV TF_CPP_MIN_LOG_LEVEL=2 + +# 配置apt源为清华源 +RUN sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list && \ + sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list + +# 安装系统依赖 +RUN apt-get update && apt-get install -y \ + python3.11 \ + python3-pip \ + python3-dev \ + libgl1-mesa-glx \ + libglib2.0-0 \ + libsndfile1 \ + git \ + && rm -rf /var/lib/apt/lists/* + +RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1 && \ + update-alternatives --set python3 /usr/bin/python3.11 + +# 配置pip源为清华源 +RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple + +# 先安装基础依赖 +RUN python3 -m pip install --no-cache-dir \ + setuptools \ + wheel \ + numpy + + +# 安装其他依赖 +COPY requirements.txt . +RUN python3 -m pip install --no-cache-dir -r requirements.txt +RUN python3 -m pip install --no-cache-dir async_timeout tf-keras==2.19.0 + + +# 复制整个文件夹 +COPY . . + +RUN mkdir -p /obscura/models /obscura/task/upload /obscura/task/result + +# 添加执行权限 +RUN chmod +x start-yolo.sh + +# 启动服务并保持容器运行 +CMD ["bash", "-c", "./start-yolo.sh && tail -f logs/*.log"] \ No newline at end of file diff --git a/api/__pycache__/config.cpython-311.pyc b/api/__pycache__/config.cpython-311.pyc new file mode 100644 index 0000000..291059e Binary files /dev/null and b/api/__pycache__/config.cpython-311.pyc differ diff --git a/api/compare.py b/api/compare.py index dda721f..b4818ca 100644 --- a/api/compare.py +++ b/api/compare.py @@ -1,16 +1,13 @@ import os -# GPU 环境变量设置 - -# 首先检查可用的 GPU import torch +# 强制使用 CPU +os.environ["CUDA_VISIBLE_DEVICES"] = "-1" -device = torch.device('cuda:1') import cv2 import torch import numpy as np from redis import Redis -from ultralytics import YOLO import json from kafka import KafkaConsumer import threading @@ -65,8 +62,8 @@ class FaceComparator: embeddings = DeepFace.represent( frame, model_name="Facenet512", - detector_backend='retinaface', - align=True, # 添加对齐选项 + detector_backend="retinaface", + align=True, enforce_detection=False ) @@ -225,7 +222,7 @@ def preprocess_frame(frame): frame_transposed = frame_resized.transpose((2, 0, 1)) frame_contiguous = np.ascontiguousarray(frame_transposed) frame_tensor = torch.from_numpy(frame_contiguous).float() - frame_normalized = frame_tensor.to(device) / 255.0 + frame_normalized = frame_tensor / 255.0 frame_batched = frame_normalized.unsqueeze(0) return frame_batched diff --git a/api/config.py b/api/config.py index 0330187..0d4e72a 100644 --- a/api/config.py +++ b/api/config.py @@ -14,9 +14,13 @@ REDIS_PASSWORD = "Obscura@2024" MAIN_REDIS_DB = 30 REDIS_API_DB = 31 REDIS_API_USAGE_DB = 32 + + # 目录配置 -UPLOAD_DIR = "/obscura/task/upload" -RESULT_DIR = "/obscura/task/result" +BASE_PATH = '/obscura' +MODELS_PATH = '/obscura/models' +UPLOAD_DIR = '/obscura/task/upload' +RESULT_DIR = '/obscura/task/result' # 确保目录存在 os.makedirs(UPLOAD_DIR, exist_ok=True) @@ -30,6 +34,7 @@ FALL_MODEL_PATH = "/obscura/models/yolov8n-fall.pt" FACE_MODEL_PATH = "/obscura/models/yolo11n-face.pt" MEDIAPIPE_MODEL_PATH = "/obscura/models/face_landmarker.task" DEEPFACE_MODEL_PATH = "/obscura/models" + # Ollama配置 OLLAMA_URLS = [ "http://222.186.20.67:11434/api/generate", diff --git a/api/cpm_scene.py b/api/cpm_scene.py index b26e482..5a02d8a 100644 --- a/api/cpm_scene.py +++ b/api/cpm_scene.py @@ -81,7 +81,7 @@ class MediaAnalysisSystem: raise ValueError(f"Empty video data for {object_name}") print(f"Processing video: {object_name}, data size: {len(video_data)} bytes") frames = self.encode_video(video_data) - question = """请对这段监控视频进行详细分析,包括以下方面: + question = """请对这段视频进行详细分析,包括以下方面: 1. 场景中人数的精确统计 2. 每个人的个人行为分析 3. 面部表情识别和情绪状态评估 @@ -128,7 +128,7 @@ class MediaAnalysisSystem: def process_image(self, image_data, object_name): image = Image.open(io.BytesIO(image_data)) - question = """请对这张监控图像进行详细分析,包括以下方面: + question = """请对这张图像进行详细分析,包括以下方面: 1. 场景中人数的精确统计 2. 每个人的个人行为分析 3. 面部表情识别和情绪状态评估 diff --git a/api/media.py b/api/media.py index fe29e39..659d443 100644 --- a/api/media.py +++ b/api/media.py @@ -1,6 +1,5 @@ import os import cv2 -import torch import numpy as np from redis import Redis import json diff --git a/api/pose.py b/api/pose.py index dd3e648..6b21a45 100644 --- a/api/pose.py +++ b/api/pose.py @@ -75,17 +75,20 @@ class PoseDetector: bbox = box.xyxy[0].cpu().numpy() bbox_scaled = [ - bbox[0] * scale_x, bbox[1] * scale_y, - bbox[2] * scale_x, bbox[3] * scale_y + float(bbox[0] * scale_x), # 转换为Python float类型 + float(bbox[1] * scale_y), + float(bbox[2] * scale_x), + float(bbox[3] * scale_y) ] - # 调整关键点坐标以适应原始图像大小 + # 调整关键点坐标并转换为Python原生类型 kpts_scaled = kpts.xy[0].cpu().numpy() * np.array([scale_x, scale_y]) + kpts_list = [[float(x), float(y)] for x, y in kpts_scaled] formatted_results.append({ "bbox": bbox_scaled, - "confidence": box.conf.item(), - "keypoints": kpts_scaled.tolist() + "confidence": float(box.conf.item()), # 转换为Python float类型 + "keypoints": kpts_list }) return formatted_results @@ -231,7 +234,12 @@ def process_task(): print(f"图像 {filename} 处理完成,结果已保存") else: print(f"图像 {filename} 处理失败") - main_redis_client.hset(f"task:{task_id}", "status", "failed") + main_redis_client.hset(f"task:{task_id}", + mapping={ + "status": "failed", + "error": str(e) + } + ) else: # video print(f"开始处理视频: {filename}") json_results = process_video(file_path) @@ -253,13 +261,20 @@ def process_task(): print(f"视频 {filename} 处理完成,结果已保存") else: print(f"视频 {filename} 处理失败") - main_redis_client.hset(f"task:{task_id}", "status", "failed") + main_redis_client.hset(f"task:{task_id}", + mapping={ + "status": "failed", + "error": str(e) + } + ) except Exception as e: print(f"处理任务 {task_id} 时出错: {str(e)}") - main_redis_client.hset(f"task:{task_id}", { - "status": "failed", - "error": str(e) - }) + main_redis_client.hset(f"task:{task_id}", + mapping={ + "status": "failed", + "error": str(e) + } + ) print(f"任务 {task_id} 处理完毕,等待下一个Kafka消息...") def listen_redis_changes(): diff --git a/api/qwenvl_scene.py b/api/qwenvl_scene.py index a9147ff..5a2dc8e 100644 --- a/api/qwenvl_scene.py +++ b/api/qwenvl_scene.py @@ -104,7 +104,7 @@ class MediaAnalysisSystem: "role": "user", "content": [ media_content, - {"type": "text", "text": f"""请对这{'段监控视频' if media_type == 'video' else '张监控图像'}进行详细分析,包括以下方面: + {"type": "text", "text": f"""请对这{'段视频' if media_type == 'video' else '张图像'}进行详细分析,包括以下方面: 1. 场景中人数的精确统计 2. 每个人的个人行为分析 3. 面部表情识别和情绪状态评估 diff --git a/api/requirements.txt b/api/requirements.txt index b6fe906..459f1f9 100644 --- a/api/requirements.txt +++ b/api/requirements.txt @@ -1,16 +1,34 @@ -fastapi -uvicorn -python-multipart -kafka-python==2.0.2 -six>=1.10.0 # 添加six包来解决kafka依赖问题 -redis -python-dotenv -requests -pydantic[email] -pydub -httpx -sqlalchemy -passlib[bcrypt] -pymysql -python-jose[cryptography] -Pillow # 添加用于图片处理 \ No newline at end of file +# Web框架 +fastapi==0.115.12 +uvicorn==0.34.0 +python-multipart==0.0.20 +starlette==0.46.1 + +# 图像处理 +Pillow==10.2.0 +opencv-python==4.11.0.86 +opencv-contrib-python==4.11.0.86 +decord==0.6.0 + +# 深度学习 +ultralytics==8.3.103 + +# 数据处理 +numpy==1.26.0 +pandas==2.2.3 +scipy==1.15.2 +scikit-image==0.25.2 + +# 数据库 +redis==5.2.1 +async_timeout>=4.0.0 + +# 工具库 +tqdm==4.67.1 +python-dateutil==2.9.0.post0 +pytz==2025.2 +requests==2.31.0 +aiohttp==3.11.16 +tf_keras==2.19.0 +kafka-python +decord==0.6.0 diff --git a/api/requirements_face.txt b/api/requirements_face.txt new file mode 100644 index 0000000..911578d --- /dev/null +++ b/api/requirements_face.txt @@ -0,0 +1,40 @@ + +ollama +openai + +scipy==1.15.2 +scikit-image==0.25.2 + +# Web框架 +fastapi==0.115.12 +uvicorn==0.34.0 +python-multipart==0.0.20 +starlette==0.46.1 + +# 图像处理 +Pillow==10.2.0 +opencv-python==4.11.0.86 +opencv-contrib-python==4.11.0.86 + +# 深度学习 +torch==2.5.1 +torchaudio==2.5.1 +torchvision==0.20.1 +tensorflow==2.19.0 +keras==3.9.2 +deepface==0.0.93 +retina-face==0.0.17 +tf_keras==2.19.0 +mediapipe==0.10.21 +# 数据处理 +numpy==1.26.0 +pandas==2.2.3 + +redis==5.2.1 +async_timeout>=4.0.0 +kafka-python==2.0.2 + +# 工具库 +tqdm==4.67.1 +requests==2.31.0 +aiohttp==3.11.16 diff --git a/api/requirements_vlm.txt b/api/requirements_vlm.txt new file mode 100644 index 0000000..10a2934 --- /dev/null +++ b/api/requirements_vlm.txt @@ -0,0 +1,35 @@ +# Web框架 +fastapi==0.115.12 +uvicorn==0.34.0 +python-multipart==0.0.20 +starlette==0.46.1 + +# 图像处理 +Pillow==10.2.0 +opencv-python==4.11.0.86 +opencv-contrib-python==4.11.0.86 + +ultralytics==8.3.103 +decord==0.6.0 + +# 数据处理 +numpy==1.26.0 +pandas==2.2.3 + +# 数据库 +redis==5.2.1 +async_timeout>=4.0.0 +kafka-python==2.0.2 + +# 工具库 +tqdm==4.67.1 +python-dateutil==2.9.0.post0 +pytz==2025.2 +requests==2.31.0 +aiohttp==3.11.16 +ollama +openai + +scipy==1.15.2 +scikit-image==0.25.2 + diff --git a/api/start-face.sh b/api/start-face.sh new file mode 100755 index 0000000..382809d --- /dev/null +++ b/api/start-face.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# 设置工作目录 +cd "$(dirname "$0")" + +# 定义要启动的服务 +services=( + "compare.py" + "media.py" +) + +# 启动所有服务 +for service in "${services[@]}"; do + echo "启动 $service..." + # 直接在后台运行Python服务,并将输出重定向到标准输出 + python3 "$service" 2>&1 & + # 等待几秒钟,确保服务正常启动 + sleep 2 +done + +echo "所有服务已启动" + +# 等待所有后台进程 +wait \ No newline at end of file diff --git a/api/start_services.sh b/api/start-vlm.sh similarity index 51% rename from api/start_services.sh rename to api/start-vlm.sh index 5913267..627841e 100755 --- a/api/start_services.sh +++ b/api/start-vlm.sh @@ -6,31 +6,32 @@ cd "$(dirname "$0")" # 创建日志目录 mkdir -p logs +# 创建存放PID文件的目录 +mkdir -p pids + # 定义要启动的服务 services=( - "yolo.py" - "pose.py" "qwenvl_scene.py" "qwenvl_analyze.py" "cpm_scene.py" "cpm_analyze.py" - "fall.py" - "face.py" - "media.py" - "compare.py" ) # 启动所有服务 for service in "${services[@]}"; do echo "启动 $service..." - # 使用screen创建新的会话并运行Python服务 - screen_name="${service%.py}" - screen -dmS "$screen_name" bash -c "python3 $service > logs/${screen_name}.log 2>&1" + # 直接在后台运行Python服务 + python3 "$service" > "logs/${service%.py}.log" 2>&1 & + # 记录进程ID + echo $! > "pids/${service%.py}.pid" # 等待几秒钟,确保服务正常启动 sleep 2 done echo "所有服务已启动,请检查logs目录下的日志文件" -echo "使用 'screen -ls' 查看所有screen会话" -echo "使用 'screen -r [会话名]' 连接到特定会话" -echo "使用 'cat logs/*.log' 查看日志" \ No newline at end of file +echo "使用 'cat logs/*.log' 查看日志" + +# 保持容器运行 +while true; do + sleep 1 +done \ No newline at end of file diff --git a/api/start-yolo.sh b/api/start-yolo.sh new file mode 100755 index 0000000..e97b93b --- /dev/null +++ b/api/start-yolo.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# 设置工作目录 +cd "$(dirname "$0")" + +# 定义要启动的服务 +services=( + "yolo.py" + "pose.py" + "fall.py" + "face.py" +) + +# 启动所有服务 +for service in "${services[@]}"; do + echo "启动 $service..." + # 直接在后台运行Python服务,并将输出重定向到标准输出 + python3 "$service" 2>&1 & + # 等待几秒钟,确保服务正常启动 + sleep 2 +done + +echo "所有服务已启动" + +# 等待所有后台进程 +wait \ No newline at end of file diff --git a/api_chat/.dockerignore b/api_chat/.dockerignore new file mode 100644 index 0000000..b06e767 --- /dev/null +++ b/api_chat/.dockerignore @@ -0,0 +1,15 @@ +# 排除 TTS 目录 +TTS/ +# 排除 sample 目录 +sample/ +# 排除其他不需要的文件 +__pycache__/ +*.pyc +*.pyo +*.pyd +.Python +env/ +venv/ +.env +*.log + diff --git a/api_chat/.env b/api_chat/.env index 491f3bf..e1653d3 100644 --- a/api_chat/.env +++ b/api_chat/.env @@ -25,13 +25,13 @@ REDIS_SESSION_DB_KO=50 # GPT-SoVITS 配置 -GPT_MODEL_PATH=GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s1bert25hz-5kh-longer-epoch=12-step=369668.ckpt -SOVITS_MODEL_PATH=GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s2G2333k.pth +GPT_MODEL_PATH=TTS/GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s1bert25hz-5kh-longer-epoch=12-step=369668.ckpt +SOVITS_MODEL_PATH=TTS/GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s2G2333k.pth REF_AUDIO_PATH=sample/woman.wav REF_TEXT_PATH=sample/woman.txt REF_LANGUAGE=中文 TARGET_LANGUAGE=多语种混合 -OUTPUT_PATH=/obscura/task/audio_files +OUTPUT_PATH=${OBSCURA_AUDIO_PATH:-/obscura/task/audio_files} # VOICE_CONFIGS GIRL_REF_AUDIO=sample/gril.wav diff --git a/api_chat/Dockerfile b/api_chat/Dockerfile new file mode 100644 index 0000000..37305ec --- /dev/null +++ b/api_chat/Dockerfile @@ -0,0 +1,82 @@ +# 构建阶段 +FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvidia/cuda:12.4.1-cudnn-runtime-ubuntu22.04 AS builder + + +ENV DEBIAN_FRONTEND=noninteractive +ENV TZ=Asia/Shanghai + +# 配置apt源为清华源 +RUN sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list && \ + sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list + +RUN apt-get update && apt-get install -y \ + software-properties-common \ + curl \ + build-essential \ + && add-apt-repository ppa:deadsnakes/ppa \ + && apt-get update \ + && apt-get install -y python3.11 python3.11-dev python3.11-distutils \ + && curl -sS https://bootstrap.pypa.io/get-pip.py -o get-pip.py \ + && python3.11 get-pip.py -i https://pypi.tuna.tsinghua.edu.cn/simple \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# 设置Python 3.11为默认版本 +RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1 && \ + update-alternatives --set python3 /usr/bin/python3.11 + +WORKDIR /api_chat + +# 配置pip源为清华源 +RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple + +# 安装依赖 +COPY requirements.txt . +RUN python3 -m pip install --no-cache-dir -r requirements.txt + +# 修复LangSegment库 +RUN sed -i 's/from .LangSegment import LangSegment,getTexts,classify,getCounts,printList,setLangfilters,getLangfilters,setfilters,getfilters/from .LangSegment import LangSegment,getTexts,classify,getCounts,printList,setfilters,getfilters/' /usr/local/lib/python3.11/dist-packages/LangSegment/__init__.py + +# 最终阶段 +FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvidia/cuda:12.4.1-cudnn-runtime-ubuntu22.04 + +ENV DEBIAN_FRONTEND=noninteractive +ENV TZ=Asia/Shanghai +# 添加路径映射环境变量 +ENV OBSCURA_BASE_PATH=/obscura +ENV OBSCURA_AUDIO_PATH=/obscura/task/audio_files + + +# 配置apt源为清华源 +RUN sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list && \ + sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list + +RUN apt-get update && apt-get install -y \ + ffmpeg \ + libgl1-mesa-glx \ + python3.11 \ + python3.11-distutils \ + libglib2.0-0 \ + libsm6 \ + libxext6 \ + libxrender-dev \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# 设置Python 3.11为默认版本 +RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1 && \ + update-alternatives --set python3 /usr/bin/python3.11 + +WORKDIR /api_chat + +# 从构建阶段复制Python包 +COPY --from=builder /usr/local/lib/python3.11/dist-packages /usr/local/lib/python3.11/dist-packages + +# 创建必要的目录(这些目录将被挂载) +RUN mkdir -p ${OBSCURA_AUDIO_PATH} /sample /TTS + +# 复制应用代码,包括TTS目录 +COPY . . + +# 启动服务并保持容器运行 +CMD ["sh", "-c", "bash start.sh && tail -f /dev/null"] \ No newline at end of file diff --git a/api_chat/TEMP/jieba.cache b/api_chat/TEMP/jieba.cache deleted file mode 100644 index 429e68b..0000000 Binary files a/api_chat/TEMP/jieba.cache and /dev/null differ diff --git a/api_chat/GPT_SoVITS/.gitkeep b/api_chat/logs/asr.log old mode 100755 new mode 100644 similarity index 100% rename from api_chat/GPT_SoVITS/.gitkeep rename to api_chat/logs/asr.log diff --git a/api_chat/docs/.gitkeep b/api_chat/logs/chat.log old mode 100755 new mode 100644 similarity index 100% rename from api_chat/docs/.gitkeep rename to api_chat/logs/chat.log diff --git a/api_chat/runtime/.gitkeep b/api_chat/logs/tts.log old mode 100755 new mode 100644 similarity index 100% rename from api_chat/runtime/.gitkeep rename to api_chat/logs/tts.log diff --git a/api_chat/pids/asr.pid b/api_chat/pids/asr.pid new file mode 100644 index 0000000..c718eb7 --- /dev/null +++ b/api_chat/pids/asr.pid @@ -0,0 +1 @@ +2699902 diff --git a/api_chat/pids/chat.pid b/api_chat/pids/chat.pid new file mode 100644 index 0000000..b668057 --- /dev/null +++ b/api_chat/pids/chat.pid @@ -0,0 +1 @@ +2700008 diff --git a/api_chat/pids/tts.pid b/api_chat/pids/tts.pid new file mode 100644 index 0000000..4f04993 --- /dev/null +++ b/api_chat/pids/tts.pid @@ -0,0 +1 @@ +2699821 diff --git a/api_chat/requirements.txt b/api_chat/requirements.txt new file mode 100644 index 0000000..3f6e76f --- /dev/null +++ b/api_chat/requirements.txt @@ -0,0 +1,129 @@ +async_timeout>=4.0.0 +aiofiles==23.2.1 +aiohappyeyeballs==2.6.1 +aiohttp==3.11.16 +aiosignal==1.3.2 +annotated-types==0.7.0 +anyio==4.9.0 +attrs==25.3.0 +audioread==3.0.1 +av==14.3.0 +certifi==2025.1.31 +cffi==1.17.1 +charset-normalizer==3.4.1 +click==8.1.8 +cn2an==0.5.23 +coloredlogs==15.0.1 +contourpy==1.3.1 +cycler==0.12.1 +decorator==5.2.1 +decord==0.6.0 +einops==0.8.1 +fastapi==0.115.12 +ffmpeg-python==0.2.0 +ffmpy==0.5.0 +filelock==3.18.0 +flatbuffers==25.2.10 +fonttools==4.56.0 +frozenlist==1.5.0 +fsspec==2025.3.2 +future==1.0.0 +g2p-en==2.1.0 +gradio==5.23.3 +gradio_client==1.8.0 +h11==0.14.0 +httpcore==1.0.7 +httpx==0.28.1 +huggingface-hub==0.30.1 +humanfriendly==10.0 +idna==3.10 +inflect==7.5.0 +jieba_fast==0.53 +Jinja2==3.1.6 +joblib==1.4.2 +kafka-python==2.1.4 +kiwisolver==1.4.8 +LangSegment==0.2.0 +lazy_loader==0.4 +librosa==0.11.0 +lightning-utilities==0.14.2 +llvmlite==0.44.0 +markdown-it-py==3.0.0 +MarkupSafe==3.0.2 +matplotlib==3.10.1 +mdurl==0.1.2 +more-itertools==10.6.0 +mpmath==1.3.0 +msgpack==1.1.0 +multidict==6.2.0 +networkx==3.4.2 +nltk==3.9.1 +numba==0.61.0 +numpy==1.24.3 +onnxruntime==1.21.0 +onnxruntime-gpu==1.21.0 +openai-whisper==20240930 +opencc-python-reimplemented==0.1.7 +orjson==3.10.16 +opencv-python +packaging==24.2 +pandas==2.2.3 +pillow==11.1.0 +platformdirs==4.3.7 +pooch==1.8.2 +propcache==0.3.1 +protobuf==6.30.2 +py3langid==0.2.2 +pycparser==2.22 +pydantic==2.11.1 +pydantic_core==2.33.0 +pydub==0.25.1 +pyee==13.0.0 +Pygments==2.19.1 +pyparsing==3.2.3 +pypinyin==0.54.0 +python-dateutil==2.9.0.post0 +python-dotenv==1.1.0 +python-multipart==0.0.20 +pytorch-lightning==2.5.1 +pytz==2025.2 +PyYAML==6.0.2 +qwen-vl-utils==0.0.10 +redis==5.2.1 +regex==2024.11.6 +requests==2.32.3 +rich==14.0.0 +ruff==0.11.2 +safehttpx==0.1.6 +safetensors==0.5.3 +scikit-learn==1.6.1 +scipy==1.15.2 +semantic-version==2.10.0 +shellingham==1.5.4 +six==1.17.0 +sniffio==1.3.1 +soundfile==0.13.1 +soxr==0.5.0.post1 +starlette==0.46.1 +sympy==1.13.3 +threadpoolctl==3.6.0 +tiktoken==0.9.0 +tokenizers==0.21.1 +tomlkit==0.13.2 +torch==2.1.0 +torchmetrics==1.7.0 +torchvision==0.16.0 +tqdm==4.67.1 +transformers==4.50.3 +triton==2.1.0 +typeguard==4.4.2 +typer==0.15.2 +typing-inspection==0.4.0 +typing_extensions==4.13.0 +tzdata==2025.2 +urllib3==2.3.0 +utils==1.0.2 +uvicorn==0.34.0 +websockets==15.0.1 +wordsegment==1.3.1 +yarl==1.18.3 diff --git a/api_chat/start.sh b/api_chat/start.sh new file mode 100755 index 0000000..792c987 --- /dev/null +++ b/api_chat/start.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# 设置工作目录 +cd "$(dirname "$0")" + +# 创建日志目录 +mkdir -p logs + +# 创建存放PID文件的目录 +mkdir -p pids + +# 定义要启动的服务 +services=( + "tts.py" + "asr.py" + "chat.py" +) + +# 启动所有服务 +for service in "${services[@]}"; do + echo "启动 $service..." + # 直接在后台运行Python服务 + python3 "$service" > "logs/${service%.py}.log" 2>&1 & + # 记录进程ID + echo $! > "pids/${service%.py}.pid" + # 等待几秒钟,确保服务正常启动 + sleep 2 +done + +echo "所有服务已启动,请检查logs目录下的日志文件" +echo "使用 'cat logs/*.log' 查看日志" + +# 保持容器运行 +while true; do + sleep 1 +done \ No newline at end of file diff --git a/api_chat/tools/.gitkeep b/api_chat/tools/.gitkeep deleted file mode 100755 index e69de29..0000000 diff --git a/api_chat/tts.py b/api_chat/tts.py index a2ad58e..ef8b7b3 100644 --- a/api_chat/tts.py +++ b/api_chat/tts.py @@ -5,8 +5,8 @@ import hashlib import json import traceback from kafka import KafkaConsumer -from tools.i18n.i18n import I18nAuto -from GPT_SoVITS.inference_webui import change_gpt_weights, change_sovits_weights, get_tts_wav +from TTS.tools.i18n.i18n import I18nAuto +from TTS.GPT_SoVITS.inference_webui import change_gpt_weights, change_sovits_weights, get_tts_wav from dotenv import load_dotenv import torch diff --git a/api_chat/weight.json b/api_chat/weight.json index 8002545..e573a1e 100644 --- a/api_chat/weight.json +++ b/api_chat/weight.json @@ -1 +1 @@ -{"GPT": {"v1": "GPT_SoVITS/pretrained_models/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt", "v2": "GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s1bert25hz-5kh-longer-epoch=12-step=369668.ckpt"}, "SoVITS": {"v1": "GPT_SoVITS/pretrained_models/s2G488k.pth", "v2": "GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s2G2333k.pth"}} \ No newline at end of file +{"GPT": {"v1": "TTS/GPT_SoVITS/pretrained_models/s1bert25hz-2kh-longer-epoch=68e-step=50232.ckpt", "v2": "TTS/GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s1bert25hz-5kh-longer-epoch=12-step=369668.ckpt"}, "SoVITS": {"v1": "TTS/GPT_SoVITS/pretrained_models/s2G488k.pth", "v2": "TTS/GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s2G2333k.pth"}} \ No newline at end of file diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..6855ba4 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,79 @@ +#!/bin/bash + + +# 创建基础目录结构 +echo -e "${GREEN}创建目录结构...${NC}" +mkdir -p /dockerdata/{api,api_chat,producer,producer_chat,models,task/{upload,result,audio_files}} +mkdir -p /dockerdata/api_chat/{TTS,sample} + +# 复制配置文件 +echo -e "${GREEN}复制配置文件...${NC}" + +# API 配置文件 +if [ -f "api/config.py" ]; then + cp api/config.py /dockerdata/api/ + echo "已复制 api/config.py" +else + echo "警告: api/config.py 不存在" +fi + +# API-Chat 配置文件 +if [ -f "api_chat/.env" ]; then + cp api_chat/.env /dockerdata/api_chat/ + echo "已复制 api_chat/.env" +else + echo "警告: api_chat/.env 不存在" +fi + +# Producer 配置文件 +if [ -f "producer/config.py" ]; then + cp producer/config.py /dockerdata/producer/ + echo "已复制 producer/config.py" +else + echo "警告: producer/config.py 不存在" +fi + +# Producer-Chat 配置文件 +if [ -f "producer_chat/.env" ]; then + cp producer_chat/.env /dockerdata/producer_chat/ + echo "已复制 producer_chat/.env" +else + echo "警告: producer_chat/.env 不存在" +fi + +# 复制 TTS 和 sample 目录内容(如果存在) +if [ -d "api_chat/TTS" ]; then + cp -r api_chat/TTS/* /dockerdata/api_chat/TTS/ + echo "已复制 api_chat/TTS 目录内容" +fi + +if [ -d "api_chat/sample" ]; then + cp -r api_chat/sample/* /dockerdata/api_chat/sample/ + echo "已复制 api_chat/sample 目录内容" +fi + +# 设置目录权限 +echo -e "设置目录权限..." +chmod -R 755 dockerdata + + +# # 停止并删除现有容器 +# echo -e "停止并删除现有容器..." +# docker-compose down + +# # 启动服务 +# echo -e "启动服务..." +# docker-compose up + +# # 检查服务状态 +# echo -e "检查服务状态..." +# docker-compose ps + +# echo -e "部署完成!" +# echo "目录结构:" +# tree dockerdata + +# # 显示日志 +# echo -e "显示服务日志..." +# echo -e "按 Ctrl+C 退出日志查看" +# docker-compose logs -f \ No newline at end of file diff --git a/docker-compose-api-chat.yml b/docker-compose-api-chat.yml new file mode 100644 index 0000000..1a3fab2 --- /dev/null +++ b/docker-compose-api-chat.yml @@ -0,0 +1,24 @@ +services: + api-chat: + image: api_chat:latest + volumes: + - /dockerdata/models:/obscura/models + - /dockerdata/task/audio_files:/obscura/task/audio_files + - /dockerdata/api_chat/TTS:/api_chat/TTS + - /dockerdata/api_chat/sample:/api_chat/sample + - /dockerdata/api_chat/.env:/api_chat/.env + - /dockerdata/api_chat/logs:/api_chat/logs + - /dockerdata/api_chat/pids:/api_chat/pids + - /dockerdata/nltk_data:/root/nltk_data + environment: + - TZ=Asia/Shanghai + - CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 + - NLTK_DATA=/root/nltk_data + network_mode: "host" + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] diff --git a/docker-compose-api.yml b/docker-compose-api.yml new file mode 100644 index 0000000..95ee3a2 --- /dev/null +++ b/docker-compose-api.yml @@ -0,0 +1,64 @@ +services: + api_yolo: + image: api_yolo:latest + volumes: + - /dockerdata/models:/obscura/models + - /dockerdata/task/upload:/obscura/task/upload + - /dockerdata/task/result:/obscura/task/result + - /dockerdata/api/config.py:/api/config.py + - /dockerdata/api/logs:/api/logs + - /dockerdata/api/pids:/api/pids + - /dockerdata/models/yolo11n-face.pt:/obscura/models/yolo11n-face.pt + - /dockerdata/models/yolo11n-pose.pt:/obscura/models/yolo11n-pose.pt + - /dockerdata/models/yolo11n.pt:/obscura/models/yolo11n.pt + - /dockerdata/models/yolov8n-fall.pt:/obscura/models/yolov8n-fall.pt + environment: + - TZ=Asia/Shanghai + network_mode: "host" + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] + api_vlm: + image: api_vlm:latest + volumes: + - /dockerdata/task/upload:/obscura/task/upload + - /dockerdata/task/result:/obscura/task/result + - /dockerdata/api/config.py:/api/config.py + - /dockerdata/api/logs:/api/logs + - /dockerdata/api/pids:/api/pids + - /dockerdata/models/QWEN/Qwen2___5-VL-7B-Instruct:/obscura/models/QWEN/Qwen2___5-VL-7B-Instruct + - /dockerdata/models:/obscura/models + environment: + - TZ=Asia/Shanghai + network_mode: "host" + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] + api_face: + image: api_face:latest + volumes: + - /dockerdata/task/upload:/obscura/task/upload + - /dockerdata/task/result:/obscura/task/result + - /dockerdata/api/config.py:/api/config.py + - /dockerdata/api/logs:/api/logs + - /dockerdata/api/pids:/api/pids + - /dockerdata/models:/obscura/models + - /dockerdata/models/face_landmarker.task:/obscura/models/face_landmarker.task + environment: + - TZ=Asia/Shanghai + network_mode: "host" + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] diff --git a/docker-compose-producer.yml b/docker-compose-producer.yml new file mode 100644 index 0000000..19a634a --- /dev/null +++ b/docker-compose-producer.yml @@ -0,0 +1,36 @@ +services: + producer: + image: producer:latest + network_mode: "host" + volumes: + - /dockerdata/task/upload:/obscura/task/upload + - /dockerdata/task/result:/obscura/task/result + - /dockerdata/producer/config.py:/obscura/producer/config.py + environment: + - TZ=Asia/Shanghai + - CUDA_VISIBLE_DEVICES=2,3 + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] + + producer-chat: + image: producer_chat:latest + network_mode: "host" + volumes: + - /dockerdata/task/upload:/obscura/task/upload + - /dockerdata/producer_chat/.env:/obscura/producer_chat/.env + - /dockerdata/task/audio_files:/obscura/task/audio_files + environment: + - TZ=Asia/Shanghai + - CUDA_VISIBLE_DEVICES=2,3 + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] \ No newline at end of file diff --git a/producer/Dockerfile b/producer/Dockerfile new file mode 100644 index 0000000..6a383fb --- /dev/null +++ b/producer/Dockerfile @@ -0,0 +1,71 @@ +# 构建阶段 +FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvidia/cuda:12.4.1-cudnn-runtime-ubuntu22.04 AS builder + +ENV DEBIAN_FRONTEND=noninteractive +ENV TZ=Asia/Shanghai + +# 配置apt源为清华源 +RUN sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list && \ + sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list + +# 安装系统依赖和Python +RUN apt-get update && apt-get install -y \ + software-properties-common \ + curl \ + build-essential \ + && add-apt-repository ppa:deadsnakes/ppa \ + && apt-get update \ + && apt-get install -y python3.11 python3.11-dev python3.11-distutils \ + && curl -sS https://bootstrap.pypa.io/get-pip.py -o get-pip.py \ + && python3.11 get-pip.py -i https://pypi.tuna.tsinghua.edu.cn/simple \ + && rm -rf /var/lib/apt/lists/* get-pip.py + +# 设置Python 3.11为默认版本 +RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1 && \ + update-alternatives --set python3 /usr/bin/python3.11 + +WORKDIR /producer + +# 配置pip源为清华源 +RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple + +# 安装依赖 +COPY requirements.txt . +RUN python3 -m pip install --no-cache-dir -r requirements.txt + +# 最终阶段 +FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvidia/cuda:12.4.1-cudnn-runtime-ubuntu22.04 + +ENV DEBIAN_FRONTEND=noninteractive +ENV TZ=Asia/Shanghai + +# 配置apt源为清华源 +RUN sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list && \ + sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list + +# 安装运行时依赖 +RUN apt-get update && apt-get install -y \ + ffmpeg \ + libgl1-mesa-glx \ + software-properties-common \ + && add-apt-repository ppa:deadsnakes/ppa \ + && apt-get update \ + && apt-get install -y python3.11 python3.11-distutils \ + && rm -rf /var/lib/apt/lists/* + +# 设置Python 3.11为默认版本 +RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1 && \ + update-alternatives --set python3 /usr/bin/python3.11 + +WORKDIR /producer + +# 从构建阶段复制Python包 +COPY --from=builder /usr/local/lib/python3.11/dist-packages /usr/local/lib/python3.11/dist-packages + +# 复制应用代码 +COPY . . + +# 创建必要的目录 +RUN mkdir -p /obscura/task/upload /obscura/task/result + +CMD ["python3", "producer.py"] \ No newline at end of file diff --git a/producer/__pycache__/config.cpython-311.pyc b/producer/__pycache__/config.cpython-311.pyc old mode 100644 new mode 100755 diff --git a/producer/config.py b/producer/config.py index 5a6714f..16e2ae3 100755 --- a/producer/config.py +++ b/producer/config.py @@ -21,16 +21,6 @@ RESULT_DIR = "/obscura/task/result" os.makedirs(UPLOAD_DIR, exist_ok=True) os.makedirs(RESULT_DIR, exist_ok=True) -# 模型配置 -YOLO_MODEL_PATH = "/obscura/models/yolov11n.pt" -POSE_MODEL_PATH = "/obscura/models/yolov11n-pose.pt" -QWEN_MODEL_PATH = "/obscura/models/QWEN/Qwen2___5-VL-7B-Instruct" -FALL_MODEL_PATH = "/obscura/models/yolov8n-fall.pt" -FACE_MODEL_PATH = "/obscura/models/yolov11n-face.pt" -MEDIAPIPE_MODEL_PATH = "/obscura/models/face_landmarker.task" -# Ollama配置 -OLLAMA_URL = "https://ffgregevrdcfyhtnhyudvr.myfastools.com/api/generate" - # 各个worker的配置 WORKER_CONFIGS = { "yolo": { diff --git a/producer/producer.py b/producer/producer.py index e6c1067..3d30f81 100755 --- a/producer/producer.py +++ b/producer/producer.py @@ -20,10 +20,6 @@ app = FastAPI() v1_app = FastAPI() app.mount("/v1", v1_app) - -# CORS设置 -# ALLOWED_ORIGINS = ['https://beta.obscura.work'] - app.add_middleware( CORSMiddleware, allow_origins=["*"], diff --git a/producer/requirements.txt b/producer/requirements.txt old mode 100755 new mode 100644 index 06e2a4c..7dba6ca --- a/producer/requirements.txt +++ b/producer/requirements.txt @@ -1,12 +1,8 @@ -fastapi -uvicorn -python-multipart -kafka-python -redis -pillow -decord -pydantic -requests -python-jose[cryptography] -passlib[bcrypt] -sqlalchemy \ No newline at end of file +fastapi==0.115.12 +uvicorn==0.34.0 +python-multipart==0.0.20 +pillow==11.1.0 +decord==0.6.0 +kafka-python==2.1.5 +redis==5.2.1 +python-dotenv==1.1.0 \ No newline at end of file diff --git a/producer_chat/.env b/producer_chat/.env index dde182b..c0c8b35 100755 --- a/producer_chat/.env +++ b/producer_chat/.env @@ -21,58 +21,8 @@ REDIS_SESSION_DB_ZH=48 REDIS_SESSION_DB_EN=49 REDIS_SESSION_DB_KO=50 - - - -# GPT-SoVITS 配置 -GPT_MODEL_PATH=GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s1bert25hz-5kh-longer-epoch=12-step=369668.ckpt -SOVITS_MODEL_PATH=GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s2G2333k.pth -REF_AUDIO_PATH=sample/woman.wav -REF_TEXT_PATH=sample/woman.txt -REF_LANGUAGE=中文 -TARGET_LANGUAGE=多语种混合 -OUTPUT_PATH=/obscura/task/audio_files - -# VOICE_CONFIGS -GIRL_REF_AUDIO=sample/gril.wav -GIRL_REF_TEXT=sample/gril.txt - -WOMAN_REF_AUDIO=sample/woman.wav -WOMAN_REF_TEXT=sample/woman.txt - - -MAN_REF_AUDIO=sample/man.wav -MAN_REF_TEXT=sample/man.txt - -LEIJUN_REF_AUDIO=sample/leijun.wav -LEIJUN_REF_TEXT=sample/leijun.txt - -DUFU_REF_AUDIO=sample/dufu.wav -DUFU_REF_TEXT=sample/dufu.txt - -HEJIONG_REF_AUDIO=sample/hejiong.wav -HEJIONG_REF_TEXT=sample/hejiong.txt - -MAHUATENG_REF_AUDIO=sample/mahuateng.wav -MAHUATENG_REF_TEXT=sample/mahuateng.txt - -LIDAN_REF_AUDIO=sample/lidan.wav -LIDAN_REF_TEXT=sample/lidan.txt - -YUHUA_REF_AUDIO=sample/yuhua.wav -YUHUA_REF_TEXT=sample/yuhua.txt - -LIUZHENYUN_REF_AUDIO=sample/liuzhenyun.wav -LIUZHENYUN_REF_TEXT=sample/liuzhenyun.txt - -DABING_REF_AUDIO=sample/dabing.wav -DABING_REF_TEXT=sample/dabing.txt - -LUOXIANG_REF_AUDIO=sample/luoxiang.wav -LUOXIANG_REF_TEXT=sample/luoxiang.txt - -XUZHIYUAN_REF_AUDIO=sample/xuzhiyuan.wav -XUZHIYUAN_REF_TEXT=sample/xuzhiyuan.txt +UPLOAD_DIR = "/obscura/task/upload" +RESULT_DIR = "/obscura/task/result" REDIS_GIRL_DB = 51 diff --git a/producer_chat/Dockerfile b/producer_chat/Dockerfile new file mode 100644 index 0000000..fa9e05f --- /dev/null +++ b/producer_chat/Dockerfile @@ -0,0 +1,70 @@ +# 构建阶段 +FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvidia/cuda:12.4.1-cudnn-runtime-ubuntu22.04 AS builder + + +ENV DEBIAN_FRONTEND=noninteractive +ENV TZ=Asia/Shanghai + +# 配置apt源为清华源 +RUN sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list && \ + sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list + +RUN apt-get update && apt-get install -y \ + software-properties-common \ + curl \ + build-essential \ + && add-apt-repository ppa:deadsnakes/ppa \ + && apt-get update \ + && apt-get install -y python3.11 python3.11-dev python3.11-distutils \ + && curl -sS https://bootstrap.pypa.io/get-pip.py -o get-pip.py \ + && python3.11 get-pip.py -i https://pypi.tuna.tsinghua.edu.cn/simple \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# 设置Python 3.11为默认版本 +RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1 && \ + update-alternatives --set python3 /usr/bin/python3.11 + +WORKDIR /producer_chat + +# 配置pip源为清华源 +RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple + +# 安装依赖 +COPY requirements.txt . +RUN python3 -m pip install --no-cache-dir -r requirements.txt + +# 最终阶段 +FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvidia/cuda:12.4.1-cudnn-runtime-ubuntu22.04 + +ENV DEBIAN_FRONTEND=noninteractive +ENV TZ=Asia/Shanghai + +# 配置apt源为清华源 +RUN sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list && \ + sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list + +RUN apt-get update && apt-get install -y \ + ffmpeg \ + libgl1-mesa-glx \ + python3.11 \ + python3.11-distutils \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# 设置Python 3.11为默认版本 +RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1 && \ + update-alternatives --set python3 /usr/bin/python3.11 + +WORKDIR /producer_chat + +# 从构建阶段复制Python包 +COPY --from=builder /usr/local/lib/python3.11/dist-packages /usr/local/lib/python3.11/dist-packages + +# 复制应用代码 +COPY . . + +# 创建必要的目录 +RUN mkdir -p /obscura/task/upload /obscura/task/result /obscura/task/audio_files + +CMD ["python3", "producer_chat.py"] \ No newline at end of file diff --git a/producer_chat/producer_chat.py b/producer_chat/producer_chat.py index 75a70d2..9098001 100755 --- a/producer_chat/producer_chat.py +++ b/producer_chat/producer_chat.py @@ -10,7 +10,6 @@ import json import uuid from datetime import datetime, timezone from dotenv import load_dotenv -import tempfile import hashlib from pydantic import BaseModel, Field @@ -65,8 +64,7 @@ KAFKA_TTS_TOPIC = os.getenv('KAFKA_TTS_TOPIC') KAFKA_ASR_TOPIC = os.getenv('KAFKA_ASR_TOPIC') KAFKA_CHAT_TOPIC = os.getenv('KAFKA_CHAT_TOPIC') -OUTPUT_PATH= os.getenv('OUTPUT_PATH') - +UPLOAD_DIR = os.getenv('UPLOAD_DIR') # 初始化 Kafka Producer producer = KafkaProducer( bootstrap_servers=[KAFKA_BROKER], @@ -261,7 +259,6 @@ async def tts_request(request: TTSRequest, api_key_info: dict = Depends(verify_a async def asr_request(audio: UploadFile = File(...), api_key_info: dict = Depends(verify_api_key)): task_id = str(uuid.uuid4()) - UPLOAD_DIR = "/obscura/task/audio_upload" os.makedirs(UPLOAD_DIR, exist_ok=True) file_path = os.path.join(UPLOAD_DIR, f"{task_id}.wav") diff --git a/producer_chat/requirements.txt b/producer_chat/requirements.txt old mode 100755 new mode 100644 index a0f9b40..22d7d90 --- a/producer_chat/requirements.txt +++ b/producer_chat/requirements.txt @@ -1,7 +1,17 @@ -fastapi -uvicorn -pydantic -kafka-python -redis -python-dotenv -python-multipart \ No newline at end of file +fastapi>=0.115.0 +uvicorn>=0.34.0 +pydantic>=2.11.0 +kafka-python>=2.1.0 +redis>=5.2.0 +python-dotenv>=1.1.0 +bcrypt>=4.3.0 +python-jose>=3.4.0 +passlib>=1.7.0 +cryptography>=44.0.0 +requests>=2.32.0 +numpy>=2.2.0 +pillow>=11.1.0 +decord>=0.6.0 +python-multipart>=0.0.20 +typing_extensions>=4.13.0 +async_timeout>=4.0.0 \ No newline at end of file