deploy docker

This commit is contained in:
2025-04-10 09:45:41 +00:00
parent 1955f05876
commit b3fc313a15
46 changed files with 1024 additions and 169 deletions
+2 -20
View File
@@ -1,23 +1,5 @@
api_history/OpenBMB/* api_chat/TTS/*
!api_history/OpenBMB/.gitkeep !api_chat/TTS/.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/GPT_weights api_chat/GPT_weights
api_chat/GPT_weights_v2 api_chat/GPT_weights_v2
+1
View File
@@ -3,6 +3,7 @@
该项目为所有API集合,集成了视觉分析、聊天对话和语音处理等功能。 该项目为所有API集合,集成了视觉分析、聊天对话和语音处理等功能。
## 更新日志 ## 更新日志
- 20250410 部署到docker
- 20250403 部署到222.186.20.67时的更新 - 20250403 部署到222.186.20.67时的更新
## 项目结构 ## 项目结构
+49
View File
@@ -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"]
+63
View File
@@ -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"]
+52
View File
@@ -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"]
Binary file not shown.
+5 -8
View File
@@ -1,16 +1,13 @@
import os import os
# GPU 环境变量设置
# 首先检查可用的 GPU
import torch import torch
# 强制使用 CPU
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
device = torch.device('cuda:1')
import cv2 import cv2
import torch import torch
import numpy as np import numpy as np
from redis import Redis from redis import Redis
from ultralytics import YOLO
import json import json
from kafka import KafkaConsumer from kafka import KafkaConsumer
import threading import threading
@@ -65,8 +62,8 @@ class FaceComparator:
embeddings = DeepFace.represent( embeddings = DeepFace.represent(
frame, frame,
model_name="Facenet512", model_name="Facenet512",
detector_backend='retinaface', detector_backend="retinaface",
align=True, # 添加对齐选项 align=True,
enforce_detection=False enforce_detection=False
) )
@@ -225,7 +222,7 @@ def preprocess_frame(frame):
frame_transposed = frame_resized.transpose((2, 0, 1)) frame_transposed = frame_resized.transpose((2, 0, 1))
frame_contiguous = np.ascontiguousarray(frame_transposed) frame_contiguous = np.ascontiguousarray(frame_transposed)
frame_tensor = torch.from_numpy(frame_contiguous).float() 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) frame_batched = frame_normalized.unsqueeze(0)
return frame_batched return frame_batched
+7 -2
View File
@@ -14,9 +14,13 @@ REDIS_PASSWORD = "Obscura@2024"
MAIN_REDIS_DB = 30 MAIN_REDIS_DB = 30
REDIS_API_DB = 31 REDIS_API_DB = 31
REDIS_API_USAGE_DB = 32 REDIS_API_USAGE_DB = 32
# 目录配置 # 目录配置
UPLOAD_DIR = "/obscura/task/upload" BASE_PATH = '/obscura'
RESULT_DIR = "/obscura/task/result" MODELS_PATH = '/obscura/models'
UPLOAD_DIR = '/obscura/task/upload'
RESULT_DIR = '/obscura/task/result'
# 确保目录存在 # 确保目录存在
os.makedirs(UPLOAD_DIR, exist_ok=True) 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" FACE_MODEL_PATH = "/obscura/models/yolo11n-face.pt"
MEDIAPIPE_MODEL_PATH = "/obscura/models/face_landmarker.task" MEDIAPIPE_MODEL_PATH = "/obscura/models/face_landmarker.task"
DEEPFACE_MODEL_PATH = "/obscura/models" DEEPFACE_MODEL_PATH = "/obscura/models"
# Ollama配置 # Ollama配置
OLLAMA_URLS = [ OLLAMA_URLS = [
"http://222.186.20.67:11434/api/generate", "http://222.186.20.67:11434/api/generate",
+2 -2
View File
@@ -81,7 +81,7 @@ class MediaAnalysisSystem:
raise ValueError(f"Empty video data for {object_name}") raise ValueError(f"Empty video data for {object_name}")
print(f"Processing video: {object_name}, data size: {len(video_data)} bytes") print(f"Processing video: {object_name}, data size: {len(video_data)} bytes")
frames = self.encode_video(video_data) frames = self.encode_video(video_data)
question = """请对这段监控视频进行详细分析,包括以下方面: question = """请对这段视频进行详细分析,包括以下方面:
1. 场景中人数的精确统计 1. 场景中人数的精确统计
2. 每个人的个人行为分析 2. 每个人的个人行为分析
3. 面部表情识别和情绪状态评估 3. 面部表情识别和情绪状态评估
@@ -128,7 +128,7 @@ class MediaAnalysisSystem:
def process_image(self, image_data, object_name): def process_image(self, image_data, object_name):
image = Image.open(io.BytesIO(image_data)) image = Image.open(io.BytesIO(image_data))
question = """请对这张监控图像进行详细分析,包括以下方面: question = """请对这张图像进行详细分析,包括以下方面:
1. 场景中人数的精确统计 1. 场景中人数的精确统计
2. 每个人的个人行为分析 2. 每个人的个人行为分析
3. 面部表情识别和情绪状态评估 3. 面部表情识别和情绪状态评估
-1
View File
@@ -1,6 +1,5 @@
import os import os
import cv2 import cv2
import torch
import numpy as np import numpy as np
from redis import Redis from redis import Redis
import json import json
+26 -11
View File
@@ -75,17 +75,20 @@ class PoseDetector:
bbox = box.xyxy[0].cpu().numpy() bbox = box.xyxy[0].cpu().numpy()
bbox_scaled = [ bbox_scaled = [
bbox[0] * scale_x, bbox[1] * scale_y, float(bbox[0] * scale_x), # 转换为Python float类型
bbox[2] * scale_x, bbox[3] * scale_y 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_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({ formatted_results.append({
"bbox": bbox_scaled, "bbox": bbox_scaled,
"confidence": box.conf.item(), "confidence": float(box.conf.item()), # 转换为Python float类型
"keypoints": kpts_scaled.tolist() "keypoints": kpts_list
}) })
return formatted_results return formatted_results
@@ -231,7 +234,12 @@ def process_task():
print(f"图像 {filename} 处理完成,结果已保存") print(f"图像 {filename} 处理完成,结果已保存")
else: else:
print(f"图像 {filename} 处理失败") 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 else: # video
print(f"开始处理视频: {filename}") print(f"开始处理视频: {filename}")
json_results = process_video(file_path) json_results = process_video(file_path)
@@ -253,13 +261,20 @@ def process_task():
print(f"视频 {filename} 处理完成,结果已保存") print(f"视频 {filename} 处理完成,结果已保存")
else: else:
print(f"视频 {filename} 处理失败") print(f"视频 {filename} 处理失败")
main_redis_client.hset(f"task:{task_id}", "status", "failed") main_redis_client.hset(f"task:{task_id}",
except Exception as e: mapping={
print(f"处理任务 {task_id} 时出错: {str(e)}")
main_redis_client.hset(f"task:{task_id}", {
"status": "failed", "status": "failed",
"error": str(e) "error": str(e)
}) }
)
except Exception as e:
print(f"处理任务 {task_id} 时出错: {str(e)}")
main_redis_client.hset(f"task:{task_id}",
mapping={
"status": "failed",
"error": str(e)
}
)
print(f"任务 {task_id} 处理完毕,等待下一个Kafka消息...") print(f"任务 {task_id} 处理完毕,等待下一个Kafka消息...")
def listen_redis_changes(): def listen_redis_changes():
+1 -1
View File
@@ -104,7 +104,7 @@ class MediaAnalysisSystem:
"role": "user", "role": "user",
"content": [ "content": [
media_content, media_content,
{"type": "text", "text": f"""请对这{'监控视频' if media_type == 'video' else '监控图像'}进行详细分析,包括以下方面: {"type": "text", "text": f"""请对这{'段视频' if media_type == 'video' else '张图像'}进行详细分析,包括以下方面:
1. 场景中人数的精确统计 1. 场景中人数的精确统计
2. 每个人的个人行为分析 2. 每个人的个人行为分析
3. 面部表情识别和情绪状态评估 3. 面部表情识别和情绪状态评估
+34 -16
View File
@@ -1,16 +1,34 @@
fastapi # Web框架
uvicorn fastapi==0.115.12
python-multipart uvicorn==0.34.0
kafka-python==2.0.2 python-multipart==0.0.20
six>=1.10.0 # 添加six包来解决kafka依赖问题 starlette==0.46.1
redis
python-dotenv # 图像处理
requests Pillow==10.2.0
pydantic[email] opencv-python==4.11.0.86
pydub opencv-contrib-python==4.11.0.86
httpx decord==0.6.0
sqlalchemy
passlib[bcrypt] # 深度学习
pymysql ultralytics==8.3.103
python-jose[cryptography]
Pillow # 添加用于图片处理 # 数据处理
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
+40
View File
@@ -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
+35
View File
@@ -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
+24
View File
@@ -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
+12 -11
View File
@@ -6,31 +6,32 @@ cd "$(dirname "$0")"
# 创建日志目录 # 创建日志目录
mkdir -p logs mkdir -p logs
# 创建存放PID文件的目录
mkdir -p pids
# 定义要启动的服务 # 定义要启动的服务
services=( services=(
"yolo.py"
"pose.py"
"qwenvl_scene.py" "qwenvl_scene.py"
"qwenvl_analyze.py" "qwenvl_analyze.py"
"cpm_scene.py" "cpm_scene.py"
"cpm_analyze.py" "cpm_analyze.py"
"fall.py"
"face.py"
"media.py"
"compare.py"
) )
# 启动所有服务 # 启动所有服务
for service in "${services[@]}"; do for service in "${services[@]}"; do
echo "启动 $service..." echo "启动 $service..."
# 使用screen创建新的会话并运行Python服务 # 直接在后台运行Python服务
screen_name="${service%.py}" python3 "$service" > "logs/${service%.py}.log" 2>&1 &
screen -dmS "$screen_name" bash -c "python3 $service > logs/${screen_name}.log 2>&1" # 记录进程ID
echo $! > "pids/${service%.py}.pid"
# 等待几秒钟,确保服务正常启动 # 等待几秒钟,确保服务正常启动
sleep 2 sleep 2
done done
echo "所有服务已启动,请检查logs目录下的日志文件" echo "所有服务已启动,请检查logs目录下的日志文件"
echo "使用 'screen -ls' 查看所有screen会话"
echo "使用 'screen -r [会话名]' 连接到特定会话"
echo "使用 'cat logs/*.log' 查看日志" echo "使用 'cat logs/*.log' 查看日志"
# 保持容器运行
while true; do
sleep 1
done
+26
View File
@@ -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
+15
View File
@@ -0,0 +1,15 @@
# 排除 TTS 目录
TTS/
# 排除 sample 目录
sample/
# 排除其他不需要的文件
__pycache__/
*.pyc
*.pyo
*.pyd
.Python
env/
venv/
.env
*.log
+3 -3
View File
@@ -25,13 +25,13 @@ REDIS_SESSION_DB_KO=50
# GPT-SoVITS 配置 # GPT-SoVITS 配置
GPT_MODEL_PATH=GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s1bert25hz-5kh-longer-epoch=12-step=369668.ckpt GPT_MODEL_PATH=TTS/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 SOVITS_MODEL_PATH=TTS/GPT_SoVITS/pretrained_models/gsv-v2final-pretrained/s2G2333k.pth
REF_AUDIO_PATH=sample/woman.wav REF_AUDIO_PATH=sample/woman.wav
REF_TEXT_PATH=sample/woman.txt REF_TEXT_PATH=sample/woman.txt
REF_LANGUAGE=中文 REF_LANGUAGE=中文
TARGET_LANGUAGE=多语种混合 TARGET_LANGUAGE=多语种混合
OUTPUT_PATH=/obscura/task/audio_files OUTPUT_PATH=${OBSCURA_AUDIO_PATH:-/obscura/task/audio_files}
# VOICE_CONFIGS # VOICE_CONFIGS
GIRL_REF_AUDIO=sample/gril.wav GIRL_REF_AUDIO=sample/gril.wav
+82
View File
@@ -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"]
Binary file not shown.
View File
View File
View File
+1
View File
@@ -0,0 +1 @@
2699902
+1
View File
@@ -0,0 +1 @@
2700008
+1
View File
@@ -0,0 +1 @@
2699821
+129
View File
@@ -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
+36
View File
@@ -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
View File
+2 -2
View File
@@ -5,8 +5,8 @@ import hashlib
import json import json
import traceback import traceback
from kafka import KafkaConsumer from kafka import KafkaConsumer
from tools.i18n.i18n import I18nAuto from TTS.tools.i18n.i18n import I18nAuto
from GPT_SoVITS.inference_webui import change_gpt_weights, change_sovits_weights, get_tts_wav from TTS.GPT_SoVITS.inference_webui import change_gpt_weights, change_sovits_weights, get_tts_wav
from dotenv import load_dotenv from dotenv import load_dotenv
import torch import torch
+1 -1
View File
@@ -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"}} {"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"}}
Executable
+79
View File
@@ -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
+24
View File
@@ -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]
+64
View File
@@ -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]
+36
View File
@@ -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]
+71
View File
@@ -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"]
View File
-10
View File
@@ -21,16 +21,6 @@ RESULT_DIR = "/obscura/task/result"
os.makedirs(UPLOAD_DIR, exist_ok=True) os.makedirs(UPLOAD_DIR, exist_ok=True)
os.makedirs(RESULT_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的配置
WORKER_CONFIGS = { WORKER_CONFIGS = {
"yolo": { "yolo": {
-4
View File
@@ -20,10 +20,6 @@ app = FastAPI()
v1_app = FastAPI() v1_app = FastAPI()
app.mount("/v1", v1_app) app.mount("/v1", v1_app)
# CORS设置
# ALLOWED_ORIGINS = ['https://beta.obscura.work']
app.add_middleware( app.add_middleware(
CORSMiddleware, CORSMiddleware,
allow_origins=["*"], allow_origins=["*"],
Executable → Regular
+8 -12
View File
@@ -1,12 +1,8 @@
fastapi fastapi==0.115.12
uvicorn uvicorn==0.34.0
python-multipart python-multipart==0.0.20
kafka-python pillow==11.1.0
redis decord==0.6.0
pillow kafka-python==2.1.5
decord redis==5.2.1
pydantic python-dotenv==1.1.0
requests
python-jose[cryptography]
passlib[bcrypt]
sqlalchemy
+2 -52
View File
@@ -21,58 +21,8 @@ REDIS_SESSION_DB_ZH=48
REDIS_SESSION_DB_EN=49 REDIS_SESSION_DB_EN=49
REDIS_SESSION_DB_KO=50 REDIS_SESSION_DB_KO=50
UPLOAD_DIR = "/obscura/task/upload"
RESULT_DIR = "/obscura/task/result"
# 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
REDIS_GIRL_DB = 51 REDIS_GIRL_DB = 51
+70
View File
@@ -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"]
+1 -4
View File
@@ -10,7 +10,6 @@ import json
import uuid import uuid
from datetime import datetime, timezone from datetime import datetime, timezone
from dotenv import load_dotenv from dotenv import load_dotenv
import tempfile
import hashlib import hashlib
from pydantic import BaseModel, Field 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_ASR_TOPIC = os.getenv('KAFKA_ASR_TOPIC')
KAFKA_CHAT_TOPIC = os.getenv('KAFKA_CHAT_TOPIC') KAFKA_CHAT_TOPIC = os.getenv('KAFKA_CHAT_TOPIC')
OUTPUT_PATH= os.getenv('OUTPUT_PATH') UPLOAD_DIR = os.getenv('UPLOAD_DIR')
# 初始化 Kafka Producer # 初始化 Kafka Producer
producer = KafkaProducer( producer = KafkaProducer(
bootstrap_servers=[KAFKA_BROKER], 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)): async def asr_request(audio: UploadFile = File(...), api_key_info: dict = Depends(verify_api_key)):
task_id = str(uuid.uuid4()) task_id = str(uuid.uuid4())
UPLOAD_DIR = "/obscura/task/audio_upload"
os.makedirs(UPLOAD_DIR, exist_ok=True) os.makedirs(UPLOAD_DIR, exist_ok=True)
file_path = os.path.join(UPLOAD_DIR, f"{task_id}.wav") file_path = os.path.join(UPLOAD_DIR, f"{task_id}.wav")
Executable → Regular
+17 -7
View File
@@ -1,7 +1,17 @@
fastapi fastapi>=0.115.0
uvicorn uvicorn>=0.34.0
pydantic pydantic>=2.11.0
kafka-python kafka-python>=2.1.0
redis redis>=5.2.0
python-dotenv python-dotenv>=1.1.0
python-multipart 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