当前版本边界
把”项目现在能做什么”和”当前不能做什么”分开,避免误用。
✅ 已经稳定可用
- FreeSWITCH × mod_audio_fork × sherpa-onnx 全链路打通
- 流式 ASR(默认中文 int8 zipformer,可切中英双语预设)+ silero-vad
- 离线 TTS(默认 Kokoro 中英双语多音色,可切回 Matcha / VITS),支持普通合成 +
POST /tts-stream边合成边播的流式链路(依赖ffmpeg+mod_shout) - 业务编排(callflow-esl)覆盖呼入 / 呼出 / 桥接 / 会议 / 录音 / DTMF
- 17 类典型场景全部有可参考实现
- 智能外呼子系统(callout-server/webpage):活动 / 名单 / 批次调度 / 并发与工作时段 / 自动重试 / 可选回铃音 + 嘟声检测 / 外呼策略中心 / DNC 免打扰 / 角色鉴权 / 坐席工作台 / 转人工会议(盲转 · 协商转 · 主管监听/插话)/ 线路号码池 / 实时作战大屏
- 通话后情绪分析(emotion-analysis-server):文本 BERT + 音频 wav2vec2 融合,外呼可按客户情绪筛选线索
- 管理控制台(callflow-server/webpage):FreeSWITCH 数据看板、号码 → 业务路由配置、运行时 TTS/录音 配置热重载、TTS 音色试听
- 单机部署 → 单节点 application host → 多节点水平扩展
⚠️ 已知局限
| 局限 | 影响 |
|---|---|
| ASR / TTS / callflow-esl 均无 graceful shutdown | Ctrl+C / SIGTERM 直接终止 accept 与 worker,会中断在途请求与连接 |
| 无鉴权、无限流 | 仅适合内网部署;外网入口必须加反代鉴权 / 限流 |
| TTS 服务无 LRU / TTL | wav 文件持续累积,需外部定时清理 |
| ASR 仅支持 16kHz / mono / PCM16 | 上游必须重采样 / 调声道;不支持 WebSocket 帧分片 |
流式 TTS 依赖外部 ffmpeg |
需 mp3EncoderPath 对应的可执行可用,且 FS 端启用 mod_shout |
| 业务侧无全局 KV | 跨通话状态共享只能靠 DB / channel variable |
ctx.conference.hear 必须绑定当前通道 |
无法实现”AI 不入会、只听” |
| 当前默认 ASR 为中文 int8 流式模型 | 需中英混说可切 bilingual 预设;其他语种需换模型 |
| 内置 TTS 覆盖中英双语(Kokoro) | 更多语种 TTS 需换模型 |
| PostgreSQL 强依赖 | 业务路由表与运行时配置当前依赖 PostgreSQL;暂未抽象多数据库 |
❌ 当前不在范围内
- 通话级实时翻译
- 声纹识别 / 说话人分割
- 实时(通话中)情绪分析 —— 通话后的离线情绪分析已支持,见 情绪分析服务
- 多模态(视频 / 屏幕共享)
- 第三方云 ASR/TTS 适配层(Azure、阿里云、火山引擎等)
- WebRTC 直接接入
- 浏览器端 SDK
演进方向
按优先级分三档。优先级根据”用户呼声 × 实现成本 × 价值密度”评估,仅供参考,可以随业务需要调整。
P0 — 工程鲁棒性
让现有功能在生产环境更稳。
| 项 | 描述 |
|---|---|
| Graceful shutdown | 各常驻服务都需要:收到 SIGTERM 后停止接受新连接,等存量请求完成再退出 |
| 限流与鉴权 | ASR/TTS 增加 API key / mTLS;按 IP 限速 |
| 健康检查 + readiness | callflow-esl 增加 /health /ready;TTS 增加 /health |
| 结构化指标 | Prometheus 端点:连接数、合成 RTF、识别延迟、队列长度 |
| 全链路 trace ID | 一通通话从 SIP 到 ASR/TTS 全程可追踪 |
| TTS wav LRU | 内置按时间 / 容量回收,去掉外部清理脚本依赖 |
| 数据库可替换 | 业务路由层抽象,支持内置 SQLite 或其它数据库 |
P1 — 能力扩展
让平台覆盖更多业务场景。
| 项 | 描述 |
|---|---|
| 多语种 ASR | 内置 SenseVoice 离线多语种 / Whisper 流式 |
| 多语种 TTS | 在 Kokoro 中英双语多音色基础上,扩展更多语种(日 / 韩等) |
| 声纹识别 | 用 sherpa-onnx 声纹模型识别说话人,会议场景下区分发言人 |
| 关键词唤醒 | 整通 ASR 之外,加一个轻量关键词检测器 |
| AI 主持人模式 | ctx.conference.hear 支持不入会、纯监听 + 注入 TTS |
显式 stopRecording |
runtime 内显式控制录音生命周期 |
| 跨通话 KV | runtime 内置可订阅的 KV,业务间共享状态 |
| 业务热加载 | 不重启服务的情况下加载 / 替换业务函数 |
| 流式 TTS 替代编码器 | 当前依赖 ffmpeg,未来可探索内嵌 lame / vorbis,去掉外部依赖 |
P2 — 生态对接
让平台融入更大的生态。
| 项 | 描述 |
|---|---|
| 浏览器 SDK | 网页端直接通过 WebRTC 接入业务编排 |
| Slack / 钉钉 / 飞书机器人 | 把通话事件 / 文本推到 IM |
| OpenAI Realtime / Gemini Live 适配 | 把 ASR + LLM + TTS 替换为云上一体化 voice agent |
| 第三方云 ASR/TTS | Azure / 阿里云 / 火山引擎适配层,混合部署 |
| 长期会话存储 | 通话 + 转写 + 录音 + 标签的长期检索(OpenSearch / pg) |
| 业务可视化编辑 | 不写代码,拖拽配置 IVR 流程 → 生成业务函数 |
| 实时质检 | 通话过程中按规则触发告警(敏感词、情绪、超时) |
已确认不做
避免重复造轮子或越过项目定位:
| 项 | 为什么不做 |
|---|---|
| 实现自己的软交换 | FreeSWITCH 已经是事实标准;本项目专注 AI 接入层 |
| 实现 SIP 协议栈 | FreeSWITCH 内置 sofia-sip,足够稳定 |
| 训练自家 ASR/TTS 模型 | sherpa-onnx 生态模型足够丰富;可拿来直接用 |
| 重写 ESL 协议 | 已实现,且面向业务暴露 CallContext,无需让业务层碰协议细节 |
模型升级路线
模型与代码完全解耦,下面是当前在评估中的替代方案:
| 当前 | 候选 | 收益 | 代价 |
|---|---|---|---|
| 当前 | 候选 | 收益 | 代价 |
| —— | —— | —— | —— |
| zh-int8 streaming zipformer | bilingual zh-en 预设 | 中英混说更稳 | 模型更大、非 int8 |
| zh-int8 streaming zipformer | sense-voice 整段 | 多语种 / 准确率高 | 失去流式,不适合实时交互 |
| kokoro-multi-lang-v1_1 | matcha-icefall-zh-en | 单说话人下更轻量 | 音色单一 |
| kokoro-multi-lang-v1_1 | vits-zh-aishell3 | 纯中文多说话人 | 自然度与流式体验需对比 |
| silero_vad | webrtcvad / ten-vad | 不同场景下更鲁棒 | 协议适配 |
参与方式
如果你想:
- 试用 / 反馈使用问题 → 提 issue(在 mod_audio_fork 或 ai-voice-platform 仓库)
- 贡献业务模式 → 直接 PR 一个新业务文件 + 在
business-registry.ts注册 - 贡献新模型适配 → 在
sherpa-asr-online-server/sherpa-tts-server加配置项 / 加适配代码 - 贡献部署模式 → 写一份你环境的 docker-compose / k8s manifest,加到
deployment/子目录
版本注记
本文档随项目同步更新。关键状态:
- 当前版本:与仓库
ai-voice-platformmaster 分支对齐 - 模型默认:
zh-int8 streaming zipformer+silero_vad+kokoro-multi-lang-v1_1 - 已包含智能外呼(callout)、管理控制台(callflow-server/webpage)与通话后情绪分析(emotion-analysis-server)子系统
- 当前不再依赖
mod_unimrcp(早期版本曾依赖,已完全替换为mod_audio_fork)
如发现文档与代码不一致,以代码为准;并欢迎反馈帮助文档对齐。