SmartMeeting 智能会议

这是一个基于 Docker Compose 的智能会议部署项目,包含 Speakr 前后端、Paraformer ASR、声纹向量提取服务以及实时 WebSocket 转写桥接服务。

目录结构

/storage01/home/xll/202607/voice
├── docker-compose.yml          # 统一启动文件
├── config.env                  # 运行环境变量,主要改这里
├── asr/main.py                 # ASR 适配服务代码
├── speakr/                     # Speakr 前后端代码
├── voice-dected/               # 声纹向量提取服务代码
├── fastapi_wss/                # 实时 WebSocket 桥接服务代码
└── deploy/data/                # 运行数据,已被 git 忽略

启动和停止

启动全部服务:

cd /storage01/home/xll/202607/voice
docker compose up -d

查看状态和日志:

docker compose ps
docker compose logs -f

停止服务:

docker compose down

服务和端口

服务 容器名 端口 作用
Speakr voice-speakr 8899 页面和后端
ASR asr-test 59805 Paraformer HTTP / WebSocket 识别
Python 实时 ASR funasr-online 10096 FunASR Python WebSocket保留用于回退
官方 Runtime 实时 ASR funasr-runtime-2pass 10097 FunASR 官方 C++/ONNX 2pass WebSocket
声纹提取 voice-dected 18000 /extract_embedding 声纹向量服务
实时桥接 fastapi-wss 10095 页面实时 ASR WebSocket 桥接
Redis voice-redis 16380 实时桥接的缓存/会话存储

页面访问地址:

http://192.168.0.46:8899/tool/speakr/

浏览器麦克风录音需要安全上下文。局域网 IP 的 HTTP 页面可能无法调用麦克风。最快的本机访问方式是开 SSH 隧道:

ssh -L 8899:127.0.0.1:8899 xll@192.168.0.46

然后浏览器打开:

http://localhost:8899/tool/speakr/

配置文件

主要修改这个文件:

/storage01/home/xll/202607/voice/config.env

改服务地址、模型地址、LLM 配置、声纹匹配阈值时,优先改 config.env。修改后执行:

cd /storage01/home/xll/202607/voice
docker compose up -d

重要变量:

ASR_BASE_URL=http://asr-test:59805
FUNASR_WEBSOCKET_IP=ws://fastapi-wss:10095/websocket_offline
TARGET_WS_URL=ws://funasr-runtime-2pass:10095
# 如需回退到 Python 版实时 ASR可改为
# TARGET_WS_URL=ws://funasr-online:10096
VOICE_DETECTED_URL=http://voice-dected:8000
SPEAKER_DET_URL=http://voice-dected:8000/extract_embedding
REDIS_URL=redis://redis:6379/0

TEXT_MODEL_BASE_URL=http://192.168.0.46:59800/v1
TEXT_MODEL_NAME=46-qwen3.5-35B
TEXT_MODEL_API_KEY=none

VOICEPRINT_STORE=/data/asr_voiceprints.json
VOICEPRINT_MATCH_THRESHOLD=0.45

说明:

  • Compose 内部服务互相访问时,用 asr-testvoice-dectedredis 这种服务名。
  • 宿主机或外部机器访问时,用 192.168.0.46:59805192.168.0.46:18000192.168.0.46:10095 这种宿主机端口。
  • FUNASR_WEBSOCKET_IP 是 Speakr 后端实时录音代理要连接的 WebSocket 地址。
  • TARGET_WS_URLfastapi-wss 再往后连接的 ASR WebSocket 地址。
  • VOICEPRINT_MATCH_THRESHOLD 是声纹匹配阈值。值越低越容易匹配,值越高越不容易误匹配。

运行数据

运行数据放在:

/storage01/home/xll/202607/voice/deploy/data/

常见子目录:

deploy/data/speakr/uploads/      # 上传和录音文件
deploy/data/speakr/instance/     # Speakr SQLite 数据库
deploy/data/asr/                 # ASR 声纹库
deploy/data/redis/               # Redis 持久化数据

这些运行数据已被 .gitignore 忽略,不会提交到仓库。

声纹流程

Speakr 声纹管理页面会调用 ASR 适配层的兼容接口:

POST   /voice_insert
GET    /get_voice_name
DELETE /delete_voice

ASR 适配层会把声纹向量保存到:

deploy/data/asr/asr_voiceprints.json

转录时,/asr 会先把上传音频转成 16k 单声道 wav,再调用 voice-dected 提取声纹向量,并和已录入声纹做相似度匹配。如果分数超过 VOICEPRINT_MATCH_THRESHOLD,返回匹配到的说话人名称。

目前这个逻辑是“整段音频匹配一个最像的人”。如果一段录音里多人轮流说话,还需要进一步接入分段说话人识别。

常用检查命令

检查 ASR

curl http://127.0.0.1:59805/health

检查声纹列表:

curl http://127.0.0.1:59805/get_voice_name

检查 Speakr 配置:

curl http://127.0.0.1:8899/tool/speakr/api/config

检查实时 WebSocket 链路:

docker exec -it fastapi-wss python - <<'PY'
import asyncio, json, websockets

async def main():
    async with websockets.connect("ws://127.0.0.1:10095") as ws:
        await ws.send(json.dumps({"mode": "2pass", "is_speaking": True}))
        await ws.send(json.dumps({"type": "stop", "is_speaking": False}))
        print(await ws.recv())

asyncio.run(main())
PY

Git 操作

仓库地址:

https://gitea.zkzdht.com/Ascend/SmartMeeting.git

常用命令:

cd /storage01/home/xll/202607/voice
git status
git add .
git commit -m "更新说明"
git push
Description
No description provided
Readme 65 MiB
Languages
JavaScript 44.3%
Python 26.6%
HTML 25.8%
CSS 2.8%
Shell 0.2%
Other 0.3%