ASR 语音识别速查(CPU 服务器部署 · 跟读评测场景)¶
版本基线: faster-whisper v1.2.1(CTranslate2 4.8.5)· FunASR v1.4.24(funasr-onnx v0.4.3)· sherpa-onnx v2.0.1 · Vosk v0.3.50 · WhisperX v3.8.6 · OpenAI Whisper 权重最新多语言模型仍为 large-v3 / large-v3-turbo(2024-10,2026 年无同级新模型)· Paraformer-zh / SenseVoiceSmall 仍为 FunASR 中文主力模型· whisper.cpp v1.9.5(2026-10-07,MIT)· whisper-asr-webservice v1.10.0(2026-08-09,MIT)· SenseVoice-Small(FunAudioLLM,2024-07 开源,代码 MIT / 权重 Apache-2.0,官方称 GPU 上 10 秒音频仅 70ms、FunASR 官方基准 CPU 约 17× 实时;仓库最后提交 2025-12,无 release tag)· FireRedASR(小红书 FireRedTeam,AED-L 1.1B / LLM-L 8.3B,2025-01/02,Apache-2.0;FireRedASR2 全家桶 2026-02)· Moonshine(Useful Sensors→Moonshine AI,tiny 27M / base 58M,MIT,英文为主)· NVIDIA Parakeet-TDT-0.6B v2(英文,2025-05)/ v3(25 种欧洲语言,2025-08),权重 CC-BY-4.0,NeMo 工具包(核对日期 2026-11-11,来源:GitHub Releases / PyPI / funasr.com / HF / ModelScope)
宿主机约束(必读): Windows Server,2×Xeon Gold 6138(40 核 80 线程)、256GB 内存、F 盘 895G 剩 862G。无独立 GPU,纯 CPU 推理。所有服务以 Docker 容器部署,产物只存
F:\EricLiu\下;模型权重统一放F:\EricLiu\labs\models\。业务目标: 跟读评测(TTS 朗读→用户跟读→识别打分)。打分需要词级时间戳对齐(对比朗读文本与跟读音频的逐词时间),选型时
word_timestamps/ 时间戳能力是硬指标。
1. 选型对比¶
| 项目 | 定位 | 中文效果 | CPU 速度(int8 量级,40 核 Xeon) | 内存 | 许可证 | 推荐场景 |
|---|---|---|---|---|---|---|
| faster-whisper | Whisper 的 CTranslate2 加速重实现 | 好(Whisper large 系,中文准确但需外挂标点模型) | small:1 分钟音频约 10–20 秒;large-v3-turbo:1 分钟音频约 60–120 秒(int8,非流式) | small 约 1GB;large-v3-turbo 约 3–4GB | MIT | 高准确率离线转写、带词级时间戳的评测打分 |
| FunASR (Paraformer-zh) | 阿里达摩院工业级 ASR 工具包 | 中文最佳(Paraformer 专为中文优化,内置标点恢复 FSMN-VAD) | paraformer-zh:1 分钟音频约 10–25 秒;SenseVoiceSmall 约 5–10 秒(CPU 非流式) | 2–4GB(ASR+VAD+标点组合) | MIT | 中文场景首选:转写、打分、长音频、需要标点的直接输出 |
| sherpa-onnx | next-gen Kaldi + ONNXRuntime 推理框架 | 良好(Zipformer/Paraformer ONNX 版,流式非流式都有) | 流式 Zipformer:单路 RTF ≈ 0.1–0.2(1 分钟音频约 6–12 秒);内存极小 | <1GB | Apache-2.0 | 流式实时识别(低延迟跟读反馈)、嵌入式/低资源 |
| Vosk | Kaldi 离线轻量 ASR | 一般(中文小模型可用但准确率落后 Whisper 一档) | small-cn:1 分钟音频约 20–40 秒;模型小、延迟低 | 300MB–1GB | Apache-2.0 | 离线轻量、边缘设备、实时性优先准确率其次 |
| WhisperX | Whisper + wav2vec2 对齐 + 说话人分离 | 好(同 Whisper) | 面向 GPU 设计;纯 CPU 强制对齐较重,本项目仅了解,不推荐部署 | ≥5GB | BSD-2-Clause | GPU 服务器上的词对齐/分离,了解即可 |
| SenseVoice-Small (FunAudioLLM) | 非自回归多语种语音理解一体模型(ASR+语种识别+情感识别+音频事件检测) | 优(zh/yue/en/ja/ko 五语种;中文/粤语优于 Whisper,"富文本"转写可带情感/事件标签;2024-11 起 CTC 时间戳支持) | ✅✅ 极快:官方 GPU 上 10 秒音频仅 70ms、比 Whisper-Large 快 15 倍;FunASR 官方基准 CPU 约 17× 实时(1 分钟音频约 3-4 秒),比 faster-whisper small 还快一档 | 1-2GB(权重仓 940MB) | 代码 MIT;权重 ModelScope(iic/SenseVoiceSmall)标注 Apache-2.0(HF 仓库标 FunASR 模型许可,商用前以实际下载仓库许可页为准) | 中文转写/情感标注增强:FunASR 内一行切换(model="iic/SenseVoiceSmall"),与 paraformer-zh 并列的主力模型 |
| FireRedASR (小红书 FireRedTeam) | 工业级中文 ASR:AED-L 1.1B(效率)/ LLM-L 8.3B(Encoder-Adapter-LLM 精度上限),含方言与歌声识别 | 优秀(公开中文基准 SOTA:四集平均 CER 3.05-3.18%,AISHELL-1 最低 0.55%;后继 FireRedASR2 于 2026-02 集成 VAD/LID/标点) | ❌ CPU 回避:官方推理路径按 CUDA 设计,未声明 CPU 支持;8.3B 本机不可行,1.1B AED 无官方 CPU 路径(社区有非官方 GGUF/CrispASR 路线,不入生产) | 3-8GB(1.1B)/ 16GB+(8.3B,另需 Qwen2-7B) | Apache-2.0(代码+权重) | GPU 环境的中文精度参考线;本机仅技术观察 |
| Moonshine (Useful Sensors→Moonshine AI) | 边缘/端侧轻量 ASR(变长输入不 pad 30s、ONNX、流式变体) | ❌ 英文为主:tiny 27M / base 58M 为英文模型;后出的多语种 base 版(含 Mandarin)较新、准确率不及中文专用模型 | ✅✅ 极轻:tiny CPU 数十倍实时(约 37× 量级),峰值内存 <300MB;Q8 权重仅 ~33MB | <500MB | MIT(代码+权重) | 英文低延迟语音命令/边缘设备选配;中文跟读打分场景不用 |
| NVIDIA Parakeet / NeMo | FastConformer-TDT 高吞吐 ASR(v2 英文 / v3 25 种欧洲语言,HF Open ASR 榜前列) | ❌ 无中文(v3 仅覆盖欧洲语言) | ⚠️ GPU 导向:官方基准全在 A100;CPU 可跑(社区 ONNX)但慢,且无中文则对本项目无意义 | 2-4GB | 权重 CC-BY-4.0(NeMo 工具包 Apache-2.0) | 回避本机(GPU 依赖 + 无中文);仅作 GPU 场景参考 |
选型速览(跟读评测): 服务化主链路 = faster-whisper int8(word_timestamps=True 词级时间戳,RTF 可控);中文增强 = FunASR paraformer-zh(中文最优 + 自带标点 + 字符级时间戳),双引擎并行;流式即时反馈 = sherpa-onnx 流式 Zipformer。完整首选/选配/回避判据见 §1.2。
⚠️ 速度数字为 2026-11 基于公开基准(faster-whisper README、sherpa-onnx 官方 benchmark、社区实测)在 Xeon Gold 6138 int8 下的估算量级,上线前必须用真实跟读音频实测校准(见第 6 节守则)。
1.1 整合/聚合型项目(推荐与回避)¶
推荐逻辑:本地首选 faster-whisper 直连(第 4 节自封装,可控 RTF 上报与词级时间戳);需要现成 HTTP 服务、不想自维护封装时用 whisper-asr-webservice(开箱即用,内部也走 faster_whisper 引擎);追求 CPU 极致性能或想脱离 Python 依赖时用 whisper.cpp(AVX-512 + Q5 量化)。FunASR 自带服务端(runtime 部署)属本文档既有范畴,不在此重复。三者均为 MIT,无许可证风险。
| 项目 | 定位 | 维护状态 | 许可证 | CPU 可行性 | 结论:推荐用/选配/回避 |
|---|---|---|---|---|---|
| whisper-asr-webservice (ahmetoner,镜像 onerahmet/openai-whisper-asr-webservice) | 现成 Whisper HTTP 服务:Docker 拉起即用,Swagger UI;ASR_ENGINE 三选一(openai_whisper / faster_whisper / whisperx),词级时间戳、VAD、输出 text/JSON/VTT/SRT/TSV | 维护中但节奏放缓:v1.10.0(2026-08-09)距上一版 v1.9.1 间隔约 13 个月 | MIT | ✅ 官方 CPU 镜像开箱即用;模型缓存挂载持久化;ASR_DEVICE=cpu |
选配(推荐):需要"拿来即用"的标准 ASR HTTP 服务时直接用,省去第 4 节的自封装;生产使用 pin v1.10.0,ASR_MODEL_PATH 指向 F:\EricLiu\labs\models\ 并离线化。自封装方案(第 4 节)仍是主力:可带真实 RTF 上报(守则第 4 条) |
| whisper.cpp (ggml-org) | Whisper 的 C/C++ + ggml 重实现,CPU 性能天花板(AVX2/AVX-512,本机 Xeon 6138 支持 AVX-512) | 极活跃:v1.9.5(2026-10-07),月度级发版 | MIT | ✅✅ 纯 CPU 最优路径之一;内存极省(small 约 852MB,Q5 量化更小) | 选配:当前 faster-whisper 已满足打分场景,whisper.cpp 作为"性能瓶颈出现时的升级路径"或无 Python 环境的嵌入式方案;自带 examples/server HTTP 服务与 whisper-cli;注意 ggml 模型格式与 faster-whisper 的 CTranslate2 权重不通用,需单独下载 |
| FunASR 自带服务端 | funasr runtime / docker 部署(funasr 官方 docs) | 活跃(随 FunASR 主仓) | MIT | ✅ 本文档既有内容 | 推荐(已在册):中文主力路径,见 §2.2 与 §1.2 推荐结论;此处仅登记,不重复展开 |
1.2 限制与回避(选型红线)¶
- WhisperX:面向 GPU 设计(wav2vec2 强制对齐 + 说话人分离),纯 CPU 上对齐阶段比识别本身还慢,回避部署,只作 GPU 环境参考。
- faster-whisper:无原生流式 API;标点靠外挂(FunASR ct-punc);CTranslate2 权重与 whisper.cpp 的 ggml 格式不通用,两套模型要各下一份。
- FunASR:中文最强,但生态绑定 ModelScope/PyTorch、镜像体积大;英文与多语种不如 Whisper 系稳。
- Vosk:中文准确率落后一档,只适合低资源/边缘;不适合当打分主力。
- whisper-asr-webservice:维护节奏放缓(v1.10.0 距上一版约 13 个月),必须 pin 版本 + 权重离线化。
- FireRedASR(2026-11 补充核实):中文精度天花板级(Apache-2.0),但官方推理路径按 CUDA 设计、未声明 CPU 支持,8.3B 更是不可行——回避本机部署,只作 GPU 环境参考。
- NVIDIA Parakeet/NeMo(2026-11 补充核实):GPU 依赖 + v2/v3 均无中文,本机双重回避。
- Moonshine(2026-11 补充核实):MIT + CPU 极轻(tiny 数十倍实时),但英文为主,中文打分场景不适用;仅英文边缘场景选配。
推荐结论(跟读评测):
- 首选 = faster-whisper int8 自封装(compute_type="int8" + word_timestamps=True):词级时间戳直接喂 SOE、RTF 可真实上报,是服务化基线。
- 中文增强首选 = FunASR paraformer-zh(自带标点 + 字符级时间戳),与 faster-whisper 双引擎并行;流式即时反馈 = sherpa-onnx 流式 Zipformer。
- SenseVoice-Small(2026-11 补核实后结论:进入"中文增强"推荐档,但不替换打分主链路):官方基准 CPU 约 17× 实时、比 paraformer-zh 更快,且中文/粤语准确率优于 Whisper 系,还能输出情感/事件标签;但其时间戳为 CTC 对齐粒度、成熟度不及 paraformer-zh 的字符级时间戳。跟读打分主链路仍用 paraformer-zh;SenseVoice 作为快速转写与情感标注的补充引擎(同为 FunASR AutoModel 一行切换,无额外框架成本),是否全面顶替以实测 CER + 时间戳质量为准。
- 选配 = whisper-asr-webservice v1.10.0(MIT,拿来即用的 HTTP 服务)/ whisper.cpp v1.9.5(MIT,AVX-512 极致 CPU 性能、无 Python 依赖);CPU 性能遇瓶颈或要嵌嵌入式时再切 whisper.cpp。
- 回避 = WhisperX 在纯 CPU 部署(GPU 设计,对齐阶段过重);FireRedASR / NVIDIA Parakeet(CUDA 导向,后者无中文);Moonshine 中文场景不用(英文为主)。
2. 安装¶
2.1 faster-whisper(pip / docker)¶
# pip(宿主机或容器内均可)
pip install faster-whisper==1.2.1
# 依赖 CTranslate2 4.x(CPU 路径无需 CUDA/cuDNN)
# 模型下载(首次运行自动从 HuggingFace 下载;建议显式下载到统一目录)
# Windows: set HF_HOME=F:\EricLiu\labs\models\huggingface
export HF_HOME=/f/EricLiu/labs/models/huggingface
python -c "from huggingface_hub import snapshot_download; snapshot_download('Systran/faster-whisper-small')"
python -c "from huggingface_hub import snapshot_download; snapshot_download('Systran/faster-whisper-large-v3-turbo')"
Docker 镜像(自建,官方无维护镜像,用 python:3.11-slim 基底):
FROM python:3.11-slim
RUN pip install --no-cache-dir faster-whisper==1.2.1 fastapi uvicorn python-multipart
ENV HF_HOME=/models
# docker-compose 关键段(完整版见第 4 节)
services:
asr:
build: .
volumes:
- F:\EricLiu\labs\models\huggingface:/models # 权重只放 labs\models
cpus: 8 # 限制核数,避免抢占其它服务
deploy:
resources:
limits: { memory: 8G }
int8 量化参数(CPU 必开): WhisperModel(model_size, device="cpu", compute_type="int8", cpu_threads=8)。
可用的 compute_type:int8(推荐,速度/精度/内存最佳)、int8_float32、float32。CPU 上 int8 相比 float32 通常快 2–4 倍、内存减半以上。
2.2 FunASR(中文路径)¶
# 依赖 PyTorch CPU 版(省去 CUDA 包,体积小很多)
pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu
pip install funasr==1.4.24
# 可选 Silero VAD(v1.4.3+)
pip install "funasr[silero]==1.4.24"
中文模型(首次自动从 ModelScope 下载,用环境变量指到统一目录):
import os
os.environ["MODELSCOPE_CACHE"] = r"F:\EricLiu\labs\models\modelscope"
from funasr import AutoModel
model = AutoModel(
model="paraformer-zh", # 识别;中文主力
vad_model="fsmn-vad", # 长音频切分
punc_model="ct-punc", # 标点恢复
device="cpu",
)
离线部署:先在联网机把 paraformer-zh / fsmn-vad / ct-punc(ModelScope 仓 iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch 等)下载齐,连 MODELSCOPE_CACHE 目录一起拷进容器,之后设置 disable_update=True 并禁外网。
ONNX 轻量路径:pip install funasr_onnx==0.4.3(模型转为 ONNX,CPU 推理更快、无 torch 依赖,见 modelscope FunASR onnx 模型仓库)。
2.3 Vosk(离线轻量)¶
pip install vosk==0.3.50
# 中文模型手动下载(vosk-model-small-cn-0.22 约 42MB / vosk-model-cn-0.22 约 1.3GB)
# 下载解压到 F:\EricLiu\labs\models\vosk\vosk-model-small-cn-0.22
from vosk import Model, KaldiRecognizer
model = Model(r"F:\EricLiu\labs\models\vosk\vosk-model-small-cn-0.22")
2.4 sherpa-onnx(了解/流式备选)¶
pip install -U sherpa-onnx>=2.0.1
# 模型从 GitHub k2-fsa/sherpa-onnx Releases 或其官方模型页下载流式 zipformer 中文模型
# 解压到 F:\EricLiu\labs\models\sherpa-onnx\
3. 高频用法¶
3.1 faster-whisper CLI/Python¶
from faster_whisper import WhisperModel
model = WhisperModel(
"small", # 或 large-v3-turbo;也可直接传本地路径
device="cpu",
compute_type="int8", # CPU 必开 int8
cpu_threads=8,
)
segments, info = model.transcribe(
"read_aloud.wav",
language="zh",
beam_size=5,
vad_filter=True, # Silero VAD 过滤静音,长音频提速
word_timestamps=True, # ★ 词级时间戳 —— 跟读打分(SOE)必需,务必开启
)
print(info.language, info.duration)
for seg in segments:
print(f"[{seg.start:.2f}→{seg.end:.2f}] {seg.text}")
for w in seg.words: # 每个词的 start/end,用于逐词对齐打分
print(f" {w.word} {w.start:.2f}-{w.end:.2f}")
命令行批量:
# 无官方 CLI,用 python -c 或写薄封装脚本;批量建议走第 4 节 HTTP API
python transcribe.py F:\EricLiu\asr_jobs\*.wav --model small --int8
3.2 FunASR¶
from funasr import AutoModel
model = AutoModel(model="paraformer-zh", vad_model="fsmn-vad",
punc_model="ct-punc", device="cpu",
disable_update=True)
res = model.generate(input="read_aloud.wav", batch_size_s=60)
print(res[0]["text"]) # 带标点的转写
print(res[0]["timestamp"]) # ★ 字符级时间戳 [[ms_start, ms_end], ...]
# 打分时按字→词聚合后对齐
# 流式(Paraformer 流式版,2s chunk 边收边出)
from funasr import AutoModel
stream_model = AutoModel(model="paraformer-streaming-zh", device="cpu")
★ 时间戳说明:FunASR paraformer-zh 返回的是字符级时间戳(毫秒),比 Whisper 的词级更细;faster-whisper
word_timestamps=True返回词级(中文按词切分)。两者都能支撑 SOE 时间对齐,但单位不同,打分代码要分别适配。
3.3 Vosk¶
import wave, json
from vosk import Model, KaldiRecognizer
model = Model(r"F:\EricLiu\labs\models\vosk\vosk-model-small-cn-0.22")
wf = wave.open("read_aloud.wav", "rb")
rec = KaldiRecognizer(model, wf.getframerate())
rec.SetWords(True) # 开启词级时间戳
while True:
data = wf.readframes(4000)
if len(data) == 0: break
if rec.AcceptWaveform(data):
print(json.loads(rec.Result()))
print(json.loads(rec.FinalResult())) # result 里含 word/start/end
4. 服务化:faster-whisper + FastAPI¶
4.1 app.py(含 /health)¶
import os, tempfile, time
from fastapi import FastAPI, UploadFile, File
from faster_whisper import WhisperModel
MODEL_DIR = os.environ.get("ASR_MODEL", "/models/Systran/faster-whisper-small")
model = WhisperModel(MODEL_DIR, device="cpu", compute_type="int8", cpu_threads=int(os.environ.get("CPU_THREADS", "8")))
app = FastAPI(title="ASR Service")
@app.get("/health")
def health():
return {"status": "ok", "model": MODEL_DIR, "compute_type": "int8"}
@app.post("/transcribe")
async def transcribe(file: UploadFile = File(...), language: str = "zh"):
suffix = os.path.splitext(file.filename)[1] or ".wav"
with tempfile.NamedTemporaryFile(delete=False, suffix=suffix) as tmp:
tmp.write(await file.read())
path = tmp.name
try:
t0 = time.time()
segments, info = model.transcribe(path, language=language,
vad_filter=True, word_timestamps=True)
segs, words = [], []
for seg in segments:
segs.append({"start": round(seg.start, 3), "end": round(seg.end, 3), "text": seg.text})
for w in seg.words:
words.append({"word": w.word, "start": round(w.start, 3), "end": round(w.end, 3)})
audio_sec = info.duration
cost_sec = time.time() - t0
return {"text": "".join(s["text"] for s in segs), "segments": segs, "words": words,
"duration": round(audio_sec, 2), "cost": round(cost_sec, 2),
"rtf": round(cost_sec / max(audio_sec, 0.01), 3)}
finally:
os.unlink(path)
返回里的
rtf(实时率 = 处理耗时 / 音频时长)必须真实上报,用于持续校准本文档的 CPU 速度估算。
4.2 docker-compose.yml(放 F:\EricLiu\labs\docker\asr\)¶
services:
asr:
build: .
container_name: asr-faster-whisper
ports: ["127.0.0.1:8101:8000"]
environment:
- ASR_MODEL=/models/Systran/faster-whisper-small
- CPU_THREADS=8
- HF_HOME=/models
- HF_HUB_OFFLINE=1 # 权重已就位后禁外网下载,避免运行时拉模型
volumes:
- F:\EricLiu\labs\models\huggingface:/models
cpus: 8
deploy:
resources:
limits: { memory: 8G }
restart: unless-stopped
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request as u; u.urlopen('http://127.0.0.1:8000/health')"]
interval: 30s
timeout: 5s
retries: 3
4.3 流式 vs 非流式¶
- 非流式(上文模板):整段音频一次识别,准确率最高,延迟 = 音频时长 × RTF。跟读评测的"读完整段再打分"走这条路。
- 流式:音频分块送入,边收边出部分结果(sherpa-onnx / funasr 流式模型 / Vosk 逐 chunk)。延迟可到 0.5–2s,但准确率略降。用户"边读边显示文字"的即时反馈走这条路。
- 注意:faster-whisper 本身不提供原生流式 API;流式需求交给 sherpa-onnx 或 FunASR 流式模型,或对 faster-whisper 做 VAD 分段近似(短分段循环调用)。
5. 排障¶
| 症状 | 原因 | 处置 |
|---|---|---|
| 模型下载慢/超时 | HuggingFace/ModelScope 国内网络 | 设 HF_ENDPOINT=https://hf-mirror.com(HF 镜像);FunASR 换 ModelScope 本就国内快;终极方案:联网机下载→拷 labs\models\→容器内 HF_HUB_OFFLINE=1 / MODELSCOPE_CACHE 指过去 |
| 中文无标点/一逗到底 | Whisper 系不带标点模型 | 用 FunASR(内置 ct-punc);或 faster-whisper 输出后接 funasr ct-punc 二次处理 |
| 长音频 OOM/极慢 | 一次性喂长音频、attention 内存涨 | vad_filter=True + FunASR batch_size_s=60 切分;faster-whisper 分段循环;容器内存限 8G 并监控 |
| 首次请求慢 10s+ | 模型加载在首个请求内 | 启动时预加载模型(app.py 顶层加载,如上文);compose 加 healthcheck 就绪后再放流量 |
| 时间戳对不上 | 未开词级时间戳 / 两引擎单位不同 | faster-whisper 必须 word_timestamps=True;FunASR 用 res["timestamp"](毫秒、字符级);打分代码统一换算成毫秒 |
| int8 精度明显下降 | 极少出现 | 换 int8_float32 或 float32,用同一批跟读音频对比字错率 CER |
| Windows 路径挂载失败 | Docker Desktop 路径格式 | compose 里用 F:\EricLiu\labs\models:/models 原生写法;bash 操作时用 /f/EricLiu/... |
6. AI 操作守则¶
- 先读后写:改任何配置/代码前先读现有文件;模型权重只允许放
F:\EricLiu\labs\models\,产物只写F:\EricLiu\下,禁止写到 C 盘或其它盘。 - 版本固定:生产 compose/pip 一律 pin 具体版本号(本文基线为 2026-11-11 核对结果),升级前先查 GitHub Releases changelog,不得盲目
pip install -U。 - 实测优先:文档中的 RTF/内存是估算量级。每次换模型、换量化类型,必须用 ≥5 条真实跟读音频跑分(记录 RTF、内存峰值、CER),结果回填到选型表旁。
- 诚实上报:服务
/health与响应体必须携带真实 RTF/耗时,禁止编造性能数据;评测打分逻辑上线前用人工标注样本验证对齐正确性。 - 离线优先:容器内设
HF_HUB_OFFLINE=1/disable_update=True,禁止服务运行时在线拉模型;下载走联网机→labs\models\人工同步。 - 资源隔离:每容器限
cpus与memory(ASR 建议 8 核 8G 起步),多引擎并存时留足余量(宿主机 256G 内存充足,瓶颈在 CPU 核)。 - 破坏性操作需确认:删除模型目录、重建容器卷、清理 F 盘数据前必须向用户确认。
- 隐私:跟读音频含用户语音,临时文件用完即删(参考 app.py 的 finally unlink),禁止上传外部服务。