- 音频/视频转双语(英/中)SRT 字幕,Docker 容器化,CPU 开发/GPU 生产同一份代码 - faster-whisper ASR(词级时间戳) + 断句时间戳重算 + NLLB 翻译(模型不共驻) - 分片上传(断点续传) + SQLite 持久化 + 主页/历史/日志页面 - 历史页文件名搜索;缓存定时清理(默认保留7天,可配置) - 双 Dockerfile(cpu/gpu) + setup/start/stop 脚本
56 lines
1.8 KiB
Bash
Executable File
56 lines
1.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# 启动 audio2text 容器(幂等:已在跑则跳过)。
|
||
# CPU dev:直接跑 audio2text:cpu
|
||
# GPU prod:检测到 audio2text:gpu 镜像且 --gpus 可用时走 GPU 模式
|
||
set -euo pipefail
|
||
|
||
cd "$(dirname "$0")"
|
||
ROOT="$(pwd)"
|
||
|
||
CONTAINER="audio2text"
|
||
PORT="${AUDIO2TEXT_PORT:-8000}"
|
||
|
||
# 已在运行则跳过
|
||
if docker ps --format '{{.Names}}' | grep -qx "$CONTAINER"; then
|
||
echo "audio2text 已在运行:$(docker port $CONTAINER $PORT 2>/dev/null || echo "$PORT")"
|
||
exit 0
|
||
fi
|
||
# 清理已退出的同名容器
|
||
docker rm -f "$CONTAINER" >/dev/null 2>&1 || true
|
||
|
||
# 选镜像:优先 gpu,回退 cpu
|
||
GPU_ARGS=()
|
||
IMAGE="audio2text:cpu"
|
||
if docker image inspect audio2text:gpu >/dev/null 2>&1; then
|
||
if command -v nvidia-smi >/dev/null 2>&1; then
|
||
IMAGE="audio2text:gpu"
|
||
GPU_ARGS=(--gpus all)
|
||
echo "检测到 GPU 镜像 + nvidia-smi,使用 GPU 模式。"
|
||
else
|
||
echo "有 GPU 镜像但本机无 nvidia-smi,回退 CPU 镜像。"
|
||
fi
|
||
fi
|
||
|
||
# 数据卷:上传/中间产物/输出 + 模型缓存(跨容器复用,避免重下模型)
|
||
mkdir -p "$ROOT/data/uploads" "$ROOT/data/.work" "$ROOT/data/outputs" "$ROOT/models"
|
||
|
||
echo "启动容器(镜像 $IMAGE,端口 ${PORT})..."
|
||
docker run -d --name "$CONTAINER" \
|
||
"${GPU_ARGS[@]}" \
|
||
-p "${PORT}:8000" \
|
||
-v "$ROOT/data:/data" \
|
||
-v "$ROOT/models:/models" \
|
||
-v "$ROOT/config.yaml:/app/config.yaml:ro" \
|
||
-e CONFIG_PATH=/app/config.yaml \
|
||
--restart unless-stopped \
|
||
"$IMAGE"
|
||
|
||
echo
|
||
echo "audio2text 已启动:"
|
||
echo " - 主页(上传 + 最近任务):http://127.0.0.1:${PORT}/"
|
||
echo " - 历史任务:http://127.0.0.1:${PORT}/history"
|
||
echo " - 日志页: http://127.0.0.1:${PORT}/logs"
|
||
echo " - API 文档:http://127.0.0.1:${PORT}/docs"
|
||
echo " - 容器日志:docker logs -f $CONTAINER"
|
||
echo " - 停止: ./stop.sh"
|