ubuntu基于docker部署呼叫中心质检【支持情绪,话术对比】
最终部署流程:基于 Docker 的 FunASR 质检系统(中国大陆优化版)
以下是为中国大陆用户优化的详细部署流程,包含 Docker 镜像加速、FunASR 模型下载优化、依赖安装加速 等步骤,确保快速稳定部署。
1. 环境准备
(1)系统更新
# 更新系统并安装基础工具
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget git vim htop tmux unzip
(2)配置 Docker 镜像加速(阿里云)
# 创建 Docker 配置文件
sudo mkdir -p /etc/docker
# 添加阿里云镜像加速器配置
sudo tee /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://<你的阿里云加速器地址>.mirror.aliyuncs.com"]
}
EOF
# 重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
注:
- 登录 阿里云容器镜像服务控制台 → 获取专属加速器地址(需注册阿里云账号)。
- 替换
https://<你的阿里云加速器地址>.mirror.aliyuncs.com
为实际地址。
2. 安装 Docker 和 Docker Compose
(1)安装 Docker(使用国内源)
# 使用阿里云镜像源安装 Docker
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 启动 Docker 并加入用户组
sudo systemctl enable docker
sudo systemctl start docker
sudo usermod -aG docker $USER
newgrp docker # 刷新用户组
(2)安装 Docker Compose
# 使用国内镜像下载 Docker Compose
sudo curl -L "https://ghproxy.com/https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
3. 创建项目目录
mkdir -p /data/funasr-docker
cd /data/funasr-docker
4. 编写 Dockerfile(国内镜像优化)
创建 Dockerfile
:
# 使用阿里云镜像加速
FROM registry.cn-hangzhou.aliyuncs.com/library/python:3.9-slim
# 设置工作目录
WORKDIR /app
# 安装系统依赖(使用阿里云源)
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && \
apt update && apt install -y ffmpeg
# 使用清华 PyPI 镜像安装 Python 依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 复制代码
COPY . .
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["celery", "-A", "tasks", "worker", "--loglevel=info"]
5. 编写 Docker Compose 文件
创建 docker-compose.yml
:
version: "3.8"
services:
redis:
image: registry.cn-hangzhou.aliyuncs.com/library/redis:latest # 使用阿里云镜像
container_name: redis
ports:
- "6379:6379"
volumes:
- redis_data:/data
celery-worker:
build: .
container_name: celery-worker
depends_on:
- redis
environment:
- CELERY_BROKER_URL=redis://redis:6379/0
- CELERY_RESULT_BACKEND=redis://redis:6379/0
volumes:
- .:/app
fastapi:
build: .
container_name: fastapi
ports:
- "8000:8000"
command: uvicorn api:app --host 0.0.0.0 --port 8000
depends_on:
- redis
environment:
- CELERY_BROKER_URL=redis://redis:6379/0
- CELERY_RESULT_BACKEND=redis://redis:6379/0
volumes:
- .:/app
volumes:
redis_data:
6. 编写代码文件
(1)创建 requirements.txt
funasr
torch==2.0.1
torchaudio==2.0.2
celery
redis
fastapi
uvicorn
snownlp
sentence-transformers
jieba
scikit-learn
ahocorasick
(2)创建 tasks.py
from celery import Celery
from funasr import AutoModel
from snownlp import SnowNLP
import ahocorasick
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
# 初始化 Celery
app = Celery("tasks", broker="redis://redis:6379/0", backend="redis://redis:6379/0")
# 加载 FunASR 模型(使用国内模型路径)
model = AutoModel(model="/app/models/paraformer-zh")
# 违规词检测配置
violation_keywords = ["投诉", "退款", "举报", "转上级"]
automaton = ahocorasick.Automaton()
for idx, word in enumerate(violation_keywords):
automaton.add_word(word, (idx, word))
automaton.make_automaton()
# 标准话术模板
templates = [
"您好,请问有什么可以帮您?请提供订单号。",
"感谢来电,祝您生活愉快!"
]
sbert_model = SentenceTransformer("paraphrase-multilingual-mpnet-base-v2")
# 情绪分析
def analyze_sentiment(text):
sentiment = SnowNLP(text).sentiments
return "积极" if sentiment > 0.6 else "中性" if sentiment > 0.4 else "消极"
# 违规词检测
def detect_violations(text):
return [{"word": word, "position": (end-len(word)+1, end)} for (end, (_, word)) in automaton.iter(text)]
# 话术对比
def calculate_similarity(text):
return cosine_similarity(
sbert_model.encode([text]),
sbert_model.encode(templates)
).tolist()
# 任务定义
@app.task
def transcribe_audio(audio_path):
result = model.generate(input=audio_path)
text = result[0]["text"]
return {
"text": text,
"sentiment": analyze_sentiment(text),
"violations": detect_violations(text),
"similarity": calculate_similarity(text)
}
(3)创建 api.py
from fastapi import FastAPI
from tasks import transcribe_audio
from celery.result import AsyncResult
app = FastAPI()
@app.post("/transcribe")
async def transcribe(audio_path: str):
task = transcribe_audio.delay(audio_path)
return {"task_id": task.id}
@app.get("/result/{task_id}")
async def get_result(task_id: str):
result = AsyncResult(task_id)
return result.get() if result.ready() else {"status": "pending"}
7. 下载 FunASR 模型(国内加速)
# 创建模型目录
mkdir -p models
# 使用代理或国内镜像下载模型
wget -O models/paraformer-zh https://modelscope.cn/api/v1/models/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/repo?Revision=master\&FilePath=model.pb
8. 构建并启动服务
# 构建镜像(使用缓存加速)
docker-compose build
# 启动服务
docker-compose up -d
# 查看运行状态
docker-compose ps
9. 测试服务
(1)提交测试音频
# 上传测试文件(示例:example.wav)
cp /path/to/your/audio.wav /data/funasr-docker/example.wav
# 调用 API
curl -X POST http://localhost:8000/transcribe -H "Content-Type: application/json" -d '{"audio_path":"/app/example.wav"}'
(2)获取结果
# 替换 <task_id> 为实际任务 ID
curl http://localhost:8000/result/<task_id>
10. 常见问题解决
(1)Docker 镜像拉取失败
- 方案:检查
/etc/docker/daemon.json
中的镜像加速地址是否正确。
(2)模型下载缓慢
- 方案:手动下载模型后放入
models
目录,或使用迅雷等工具加速。
(3)依赖安装超时
- 方案:在
Dockerfile
中增加--default-timeout=1000
参数:RUN pip install --default-timeout=1000 -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
总结
通过以上步骤,可成功部署支持 语音识别、情绪分析、违规词检测、话术对比 的质检系统。所有环节均针对中国大陆网络环境优化,确保快速稳定运行。后续可通过增加 Celery Worker 实例提升并发能力。