Initial commit: audio2text 双语字幕生成服务

- 音频/视频转双语(英/中)SRT 字幕,Docker 容器化,CPU 开发/GPU 生产同一份代码
- faster-whisper ASR(词级时间戳) + 断句时间戳重算 + NLLB 翻译(模型不共驻)
- 分片上传(断点续传) + SQLite 持久化 + 主页/历史/日志页面
- 历史页文件名搜索;缓存定时清理(默认保留7天,可配置)
- 双 Dockerfile(cpu/gpu) + setup/start/stop 脚本
This commit is contained in:
2026-07-06 06:54:19 +00:00
commit 00e2a95fb7
44 changed files with 4110 additions and 0 deletions

55
start.sh Executable file
View File

@@ -0,0 +1,55 @@
#!/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"