独立自动转写 / 人声分离服务
算力服务器 CPU 单队列运行 FunASR Paraformer(含 FSMN VAD / CT-Transformer 标点)与 HTDemucs;48 仅进行有界素材准备、状态管理、对象存储归档。CPU 推理不占用千问或视频高清的显存。systemd 限制 4 核 / 12GiB;Python 推理线程 2;一次一个作业。
安装
Python 3.12 独立环境,先从官方 https://download.pytorch.org/whl/cpu 安装 torch/torchaudio 2.6.0 CPU wheel,再安装 requirements.txt。运行 prepare_models.py 下载 models.json 中固定 SHA-256 的官方语音模型运行文件;模型说明文档可变化,不参与运行文件校验。运行 services/smart-edit/prepare_separation.py 安装固定 SHA-256 的官方 HTDemucs。权重不进入 Git。
node services/audio-processing/build.cjs 产出 bundle 和 Python 脚本,安装到 /opt/audio-processing/current/。设置仅 root 可读的 /etc/audio-processing.env:
AUDIO_API_TOKEN:独立随机密钥,至少 32 字符。AUDIO_PORT=18342,AUDIO_HOST=127.0.0.1。AUDIO_PYTHON=/opt/audio-processing/venv/bin/python。AUDIO_DATA_DIR=/var/lib/audio-processing,由专用audio-processing用户持有。SMART_EDIT_ASR_MODEL、SMART_EDIT_VAD_MODEL、SMART_EDIT_PUNC_MODEL:三个完整本地模型目录。SMART_EDIT_SEPARATION_MODEL_DIR:HTDemucs 目录。HF_HOME、MODELSCOPE_CACHE、XDG_CACHE_HOME:服务数据目录下的可写缓存。
部署 audio-processing.service 和私有反向 SSH 隧道,沿用专用受限隧道账号,仅增加 localhost 18342 监听权限。主项目配置 SMART_EDIT_AUDIO_URL=http://127.0.0.1:18342 与匹配的 SMART_EDIT_AUDIO_TOKEN。模型或服务不可用时能力接口返回 false,不自动切回主机重推理。
协议与恢复
全部接口需要 Bearer 认证,禁止面向公网暴露。
POST /v1/audio-jobs:{id,tenant,plan:{operation,sha256,bytes}},operation 为 transcribe / separate;id 与 tenant 是 64 位十六进制。- 新任务为 awaiting-input;
PUT /v1/audio-jobs/:id/input上传原始 WAV。流式校验大小和 SHA-256,通过后才入队。 GET /v1/audio-jobs/:id返回真实状态、字幕时间戳或两音轨校验值。分离结果通过/vocals、/background下载。GET /health认证后返回能力与队列状态;启动时检查模型和依赖是否存在。
客户端编号取决于用户隔离标识、持久主任务编号、操作和输入内容;重试复用同一任务,参数冲突 409。状态先 fsync 再确认成功;先持久化结果再清理输入,避免重启丢失结果。正在执行的任务重启后继续,最多三次。网络中断和队列繁忙保存为可恢复状态,失败不会冒充生成结果。
仅允许 180 秒以内 PCM WAV、1/2 声道、固定采样率;分离输入必须 44.1kHz 双声道。单文件 ≤70MiB;30 个待处理/待上传作业、200 个记录;结果 7 天清理;剩余磁盘不足10GiB停止接新处理。每作业10分钟处理超时。请求不能指定模型、命令或本地路径;推理关闭联网更新,模型代码禁止 trust_remote_code。
模型来源:FunASR、官方 Paraformer、Demucs。保留安装包许可证和模型说明。
真实 API 验证脚本:AUDIO_QA_ENV=/etc/audio-processing.env <venv-python> scripts/qa/audio-processing-service.py speech.wav mixed.wav output-dir --restart。仅在专用测试或空闲服务部署窗口使用 --restart;使用合成测试语音,脚本会重启该服务验证恢复。凭据、模型、输入和输出不提交 Git。