发布说明(Release Notes)
本文件记录 AI Voice Platform 的版本发布信息,并为后续编写更新日志(CHANGELOG)提供依据。 如发现文档与代码不一致,以代码为准。
2.2.0
全平台扁平化动作语义 RPC、三端 Hono 统一架构与前端 Pinia 化版,在 2.1.0(ad53bb6)之上累积。
| 项 | 值 |
|---|---|
| 版本 | 2.2.0 |
| 发布日期 | 2026-10-16 |
| 源码版本(最后一次提交) | 4fb72f788f49e6caecd03ce3cd42135e94c5b3e5(短 4fb72f7) |
| 上一版本 | 2.1.0(ad53bb6,2026-10-06) |
| 累计提交数 | 772 |
用户可见的关键变更:全平台 HTTP API 全面收敛为扁平化动作语义 RPC 规范(Breaking)——三端后端(callflow-server / callout-server / callflow-esl)废除动态路径参数与
PUT/PATCH/DELETE方法,统一静态扁平路径与POST + JSON请求体,删除契约统一为{ ids, deleted },AI 策略与流程脚本接口去/api/v1前缀归并至/api/ai/*与/api/scripts/*;三端后端统一迁移至 Hono 框架与洋葱圈中间件体系——结构化访问与耗时审计日志、声明式鉴权与 RBAC 权限守卫、Zod 入参强校验,领域路由高内聚拆分,后台守护任务统一收口;双端前端 Pinia 化与 API 客户端强类型重构——登录会话、权限路由与全局参考数据收口至 Pinia Store,ASR 调试页实时重采样下沉至AudioWorklet;全双工打断信令对齐kill_audio规范并重新装配双平台 Go 网关交付包;callout-server 启动期种子数据统一收口(RBAC 默认角色/菜单/按钮、引导管理员与默认外呼线路幂等初始化);整体移除stream-vad-proxy(Breaking);工具链精简——移除旧版稳定性压测、批量识别与固定行数扫描工具,Rust 服务拨测脚本统一收口至scripts/;FreeSWITCH 容器基线部署包与全平台文档同步刷新。
新增
三端后端 HTTP 服务全面重构迁移至 Hono 框架与洋葱圈中间件体系(
callflow-server/callout-server/callflow-esl):- 统一 Hono 应用引擎:
apps/callflow-server、apps/callout-server与apps/callflow-esl(HTTP 控制面)全面迁移至基于 Web Standards 的 Hono 框架(src/app.ts/src/http/app.ts),彻底移除手写router.ts、server.ts、conference-server.ts等分散路由分发器。 - 标准化洋葱圈中间件管道:统一构建
middleware/logger.ts(结构化 HTTP 访问与耗时审计日志)、middleware/auth.ts(声明式 Bearer 会话鉴权、服务间内部 Token 鉴权与 RBAC 权限码守卫)及middleware/validator.ts(基于@hono/zod-validator的入参强类型校验与统一400响应拦截)。 - 领域路由高内聚拆分:
callflow-server拆分为auth、callflow、conference、freeswitch-monitor、media五大路由模块;callout-server拆分为agent、ai、auth、campaign、dashboard、internal、live-call、rbac、resource、system十大路由模块并将后台守护任务统一收口至src/workers/index.ts;callflow-eslHTTP 层拆分为conference、freeswitch、live-call、outbound、softphone五大路由模块。
- 统一 Hono 应用引擎:
全平台 HTTP API 全面收敛为扁平化动作语义 RPC 规范(Breaking):
- 静态扁平路径与动作语义命名:全面废除业务路由中的动态路径参数(如
/:id、/:conferenceId、/:sessionId、/:callKey)与PUT/PATCH/DELETE方法,统一收敛为纯静态扁平路径并以明确动作语义结尾(/list、/detail、/create、/update、/delete等)。 - 请求方法与载荷收敛:无参请求、简单只读查询与 SSE 长连接统一使用
GET(Query 传参,如GET /api/softphone-sessions/events?sessionId=...);复杂分页查询、多条件组合筛选以及全部数据变更与控制动作一律使用POST + JSON扁平请求体。 - 删除接口契约统一:全平台删除操作统一为
POST .../delete,请求体固定接收{ ids: number[] | string[] },响应统一返回{ ids, deleted },全面下线历史/batch-delete与DELETE /:id路由。 - AI 策略中心与流程脚本接口去
/api/v1前缀化:callout-server原/api/v1/*接口全面归并至/api/ai/*(如POST /api/ai/nlu/analyze、POST /api/ai/chat/stream、GET /api/ai/llm-config、POST /api/ai/llm-config/update、POST /api/ai/usage/records/list、POST /api/ai/usage/summary)与/api/scripts/*(如POST /api/scripts/runtime、POST /api/scripts/node-prompt-update),callflow-esl上行客户端(src/config/callout-api.ts)同步对齐。
- 静态扁平路径与动作语义命名:全面废除业务路由中的动态路径参数(如
双端前端(
callout-webpage/callflow-webpage)状态管理 Pinia 化与 API 客户端重构:- Pinia 状态中心与路由守卫统一:
callflow-webpage与callout-webpage的登录会话、权限判定、动态菜单路由注入与全局参考数据缓存全面收口至 Pinia Store(src/stores/auth.ts、src/router/auth-routing.ts、src/stores/callout-reference.ts),移除callflow-webpage旧版src/services/auth*.ts。 - 领域 API 客户端与严格类型边界:重构双端
src/api/request.ts(泛型默认值收紧为unknown,统一解包{ code, data, msg }信封),按业务领域拆分src/api/*.ts并全量对齐后端扁平化 POST RPC 接口契约;callout-webpage流程脚本画布组件下沉归拢至src/components/flow-scripts/。 - ASR 实时采样下沉至
AudioWorklet:callflow-webpageASR 调试页新增public/asr-pcm-worklet.js,将浏览器麦克风实时音频流重采样(16kHz 单声道 PCM16)下沉至独立AudioWorklet音频线程,消除主线程阻塞。
- Pinia 状态中心与路由守卫统一:
ASR 联调与压测工具链增强(
onnx-platform):各服务scripts/下的 ASR 测试客户端(request-ws.js、request-http.js、bench-stream-latency.mjs)内置默认中文样本并新增 WAV 格式校验,开箱即可拨测与压测;同步增强元数据一致性校验(0a7a0a0)。
变更
数据库启动期种子数据统一收口(
callout-serversrc/db/seed.ts):- 新增集中式
ensureSeedData()启动种子机制,幂等初始化 RBAC 默认角色/菜单树/按钮权限、引导管理员账号以及默认外呼线路(inner内线直拨、out-001网关外呼、inner-gateway模拟局端内网网关),移除分散的seed-rbac.ts。
- 新增集中式
全双工打断信令严格对齐为
kill_audio规范:audio-fork-server协议传输层:对齐 FreeSWITCHmod_audio_fork最新信令规范,下行打断控制帧OutboundEvent.Type由历史驼峰killAudio统一规范为蛇形小写kill_audio({"type":"kill_audio","data":{"speakId":"..."}}),保证mod_audio_fork在收到打断时准确命中流媒体控制分支,即时清空下行环形缓冲区并向 FreeSWITCH 事件总线分发mod_audio_fork::kill_audio事件。callflow-esl运行时与单测对齐:DuplexController收到打断事件后的 reason 统一规范为"kill_audio",清理业务演示、测试用例与架构文档中残留的killAudio标识,并保留对历史载荷的容错解析。- 双平台二进制重新编译装配:已重新构建 Windows x64 与 Linux x64 纯静态自包含交付包至
dist/win_x64/与dist/linux_x64/。
Rust 推理服务测试脚本目录规范化(
onnx-platform/*):- 将
sherpa-asr-server、sherpa-tts-server、funasr-asr-server、emotion-analysis-server四个服务的拨测与压测脚本统一收口至各自目录下的scripts/子目录。
- 将
全平台接口入参校验与容错加固:
callout-server补齐各路由 Zod 入参 Schema 与过滤字段(1092c50),公共整型预处理与通话监控接口容错(e8aa4a1、517f44b);callflow-server号码映射参数整型校验与容错(6eb7ded);callflow-esl会议控制器增强 FreeSWITCH 响应校验与多行容错(ff646d3)。坐席管理服务统一响应信封与状态广播重构(
callout-server):坐席服务全面对齐{ code, data, msg }响应信封并重构状态广播链路,配套扩充单元测试(86cd9d4)。Callout 通话与转写关联表外键删除策略规范化:转写分段(
transcript_segments)对通话尝试与坐席通话记录启用级联删除,坐席通话记录与会议会话对外呼尝试采用置空(set null)策略(646d8e4)。外呼管理前端交互优化(
callout-webpage):任务详情页拆分独立组件并支持调度参数快捷编辑(25f4e22)、切换线路弹窗检索与多选交互(f39cc72)、详情看板与调度批次体验优化(5fc476a)、任务表单流程脚本实时刷新与状态联动(9f5c7c3)、错误文案统一与重复通知消除(3fdef85、2970952)、手动派发数量校验与中文错误提示(7330131)。FreeSWITCH 容器基线部署包资产同步刷新(
5e58c06、6df3e8e)。工程脚本与代码清理:全平台清理弃用 TypeScript API 与遗留类定义(
99b888d);构建、启动与维护脚本统一补充职责说明(e151ba1);部署技能脚本优化 PowerShell 参数解析与多项目扁平化传递(c3bbfeb);对齐双端前端会议管理接口类型定义并补充会控单元测试(6745afd、4e57b97、ee4c70e)。全平台文档体系同步刷新:文档与发布说明全面对齐扁平化 RPC 规范、最新开发环境与质量门禁(
5129ce0、2859222、df09c22、c2529ae、9872fa8、c58be6f、30306c5、96351b8、1e022da、fa8aff2);文档站启用严格死链校验(ignoreDeadLinks: false),并清理失效路由、排除规则与下载资产引用。
移除
整体移除
stream-vad-proxy(Breaking):删除代理服务及其科大讯飞私有云 IAT 适配能力,同时移除dev:vad、build:native vad、Docker 构建目标、部署注册、专属环境变量(STREAM_VAD_PROXY_CONFIG_PATH、IFLYTEK_IAT_URL、IFLYTEK_IAT_APPID)、WSL Compose 服务和 FRP20093 → 12005映射,不提供兼容服务;旧文档入口统一重定向至服务目录。清理
callflow-esl历史冗余脚本:移除根目录废弃的request-outbound-call.js与scripts/test-duplex-e2e.ts。移除旧版稳定性压测与批量识别工具(
onnx-platform):移除stability-test.mjs、onnx-platform/docs/stability-test.md以及sherpa-asr-server、funasr-asr-server下的scripts/batch-recognize.js;联调压测统一使用各服务scripts/目录下的拨测与压测脚本(4fb72f7)。移除固定行数扫描工具与检查入口:移除
.agents/skills/code-review/scripts/scan-metrics.mjs与根package.json的check:metrics命令(f5af3f8)。
破坏性变更(Breaking)
- 全平台 HTTP API 扁平化动作语义 RPC 规范:
- 业务路由全面废除动态路径参数(如
/:id、/:conferenceId、/:sessionId、/:callKey)与PUT/PATCH/DELETE方法,统一为纯静态扁平路径并以动作语义结尾(/list、/detail、/create、/update、/delete); - 删除操作统一为
POST .../delete(请求体{ ids: number[] | string[] },响应{ ids, deleted }),历史/batch-delete与DELETE /:id路由全部下线; callout-server原/api/v1/*接口归并至/api/ai/*与/api/scripts/*;- 直连三端后端的自研脚本、自动化测试与外部集成方需按新契约适配。
- 业务路由全面废除动态路径参数(如
- 整体移除
stream-vad-proxy:代理服务与专属配置、部署注册、FRP 映射全部移除且不提供兼容服务;已部署实例需自行退役并按下方升级提示切换audioFork.wsUrl。 - Callout 通话与转写关联表外键删除策略变更:删除外呼尝试将级联删除其转写分段,坐席通话记录与会议会话的
attemptId置空;依赖旧外键行为的数据维护流程需按新策略调整(646d8e4)。
升级提示(2.1.0 → 2.2.0)
- 前端与调用方适配扁平 RPC:三端后端路由路径、请求方法与删除契约全面变更(见上「破坏性变更」);
callout-webpage/callflow-webpage已同步,自研脚本、自动化测试与第三方集成需按/list、/detail、/create、/update、/delete契约改造,AI 策略相关调用从/api/v1/*迁移至/api/ai/*与/api/scripts/*。 - 依赖安装与服务重启:根目录执行
bun install(三端后端新增hono与@hono/zod-validator依赖);callflow-server、callout-server、callflow-esl均需重启加载新路由与中间件。 - 数据库结构同步:在
apps/callout-server下执行bun run db:push,应用通话与转写关联表的外键删除策略。 stream-vad-proxy退役切换:将audioFork.wsUrl直接指向现有 ASR 服务或对应语音网关(端口与命令见服务目录);停用旧代理服务与专属环境变量(STREAM_VAD_PROXY_CONFIG_PATH、IFLYTEK_IAT_URL、IFLYTEK_IAT_APPID)及 FRP20093 → 12005映射;speech-start、partial、final打断策略保持不变,开嗓打断能力由所选 ASR 的事件支持决定;本次仅更新仓库,已部署实例的退役须另行执行。- 校验命令:
bun run typecheck校验全部前端与网关工程,bun run docs:build校验文档站死链,bun run check:rust校验 Rust 语音服务。
2.1.0
Voice Agent 深度赋能、全链路变量模板引擎与极简原生架构版,在 2.0.0(13280d5)之上累积。
| 项 | 值 |
|---|---|
| 版本 | 2.1.0 |
| 发布日期 | 2026-10-06 |
| 源码版本(最后一次提交) | ad53bb6b805d2e62cf26a5f326c54b26678595d6(短 ad53bb6) |
| 上一版本 | 2.0.0(13280d5,2026-09-26) |
| 累计提交数 | 703 |
用户可见的关键变更:Voice Agent 深度赋能与大模型对话生态——外呼流程多轮对话(Chat)节点全面支持角色定位、挂机告别语、禁用思考流与单轮最大 token 数等高级推理控制,callflow-esl 构建独立 Voice Agent SDK(结构化画像、双链路 Provider、一行式编排器、开场白不可打断门控与全双工打断);全链路随路变量(Context Variables)与模板渲染体系——支持联系人自定义业务随路变量导入与动态元数据解析,外呼调度申领注入 Redis 缓存与 FreeSWITCH 通道变量透传,流程画布 Start 节点定义外部入参变量并支持严格模板依赖校验与合法覆盖,新增光标聚焦即时插入与语法诊断话术编辑器
TemplateTextarea;外呼回铃检测与失败归因闭环——加固回铃期运营商提示音判定(空号/关机/停机/忙线等)并对齐重试调度流转,Web 端外显结构化诊断原因与提示音分类标签;转人工会议架构解耦与多出口流转——解耦坐席离会与客户通道强拆(支持主管复盘与多职员在会),支持坐席挂断后客户顺延后续节点流转(满意度评价等),转人工节点规范默认与超时双出口校验与画布连线;callflow-esl 极简原生改造(Breaking)——剥离 winston 改用 Bun 原生高性能结构化日志,剥离 Drizzle ORM 改用 Bun 原生 SQL,数据库迁移职责统一收敛至 callflow-server,通话业务重构为精简清晰的四分类体系(outbound/inbound/assist/demo),HTTP 控制面全面统一为{ code, data, msg }响应信封;音频流、协议与算法性能压降——FunASR 2-Pass 乐观投机定稿将离线算力藏入静音窗口,Barge-in 抢话续播延迟由 300~400ms 降至 3~4ms,阿里云网关支持原生 PCM 流式 TTS 与 ASR 轮次泛热词,规范 TTS 流式 profile 为stream并基于audio_fork://彻底根治会议混音卡顿,FreeSWITCH 容器包修复mod_audio_fork编码不一致与混音卡顿;生产环境部署安全与配置加固——阿里云公网节点 FreeSWITCH 内部 SIP 端口安全收敛至15321,背景音对齐标准 MOH 流,Docker 编译镜像补齐 OpenSSL 依赖,FRP 穿透模板脱敏;前端调试台卡片化重构——新增统一语音服务连接卡片,重构 TTS 试听与 ASR 调试页(双列实时时序流展示);全面移除 OpenSpec 规范驱动开发流程与工具集。平台内置通话业务 26 项(10 核心 + 16 演示)。
新增
- Voice Agent 深度赋能外呼流程多轮对话(Chat)节点:
- 流程设计器与三栏策略工作台升级(
callout-webpage):多轮对话节点支持配置「角色画像/助手定位(role)」、「挂机告别语(goodbye_prompt)」与高级推理控制(禁用思考流disable_thinking极速开嗓、单轮最大max_tokens);画布节点副标题联动展示角色名(如角色:金牌销售顾问),彻底告别死板的general-assistant(e18ea13)。 - 外呼执行引擎闭环(
callflow-eslchat-node.ts):全面接入 Voice Agent 规范化组装算法composeSystemPrompt(自动注入电话语音基线、防 Markdown/防幻觉);高级采样参数透传至大模型,消灭漫长思考延迟;原生集成挂机意图识别(isHangupIntent),用户表达再见/拒绝时优先播报告别语并优雅退出。 - 节点自包含架构(Flow-Centric):坚持零查表、零新增数据库表设计,配置随
flowJson直接下发至通话引擎,无网络二次查询负担。 - 画布流程演示支持 Chat 节点流式对话(
callout-webpageFlowDemoDrawer.vue):前端流程演示抽屉完整支持 Chat 节点 SSE 流式对话与多轮仿真,所见即所得调试语音模型输出(f0d2518)。
- 流程设计器与三栏策略工作台升级(
- Voice Agent SDK:大模型驱动对话的易用 API(
callflow-eslsrc/llm/agent/):persona.ts:结构化VoiceAgentDefinition(role/constraints/examples/style/sampling/ 话术)+defineVoiceAgent()+composeSystemPrompt()。chat-provider.ts:ChatStreamProvider抽象 +createOpenAiChatProvider/createCalloutChatProvider双链路;VoiceChatTurnRunner支持注入 provider。voice-agent.ts:一行式编排器runVoiceAgent(),内置 speakGate 互斥与全双工打断(c4d49b5)。- 开场白不可打断配置(
greetingInterruptible):支持配置智能体首句开场白是否允许用户抢话打断;置为false时用户首句发音不会中断开场播报,保障合规免责声明与关键信息完整交代(952d0fe、c5dcf5b)。 - 新增演示业务
voice-agent-demo-business(业务代码9015,分类demo)。
- 全链路联系人随路业务变量(Context Variables)与模板渲染体系:
- 联系人随路业务变量维护与解析(
callout-server/callout-webpage):号码导入阶段支持 CSV/TSV 任意表头自动解析并归集至联系人custom_variables(JSONB 随路变量字段);双栏紧凑号码导入页与详情页重构,新增ContactVariablesCell.vue随路变量徽标卡片与键值抽屉,支持元数据更新与动态映射(ba94827、97f1b93、5a04466)。 - 调度申领与通道变量透传:外呼任务调度申领(claim)时,将联系人随路变量提取并写入呼叫调度上下文声明并缓存至 Redis;通话发起时作为 FreeSWITCH 通道变量透传至
callflow-esl(0218353)。 - 流程画布 Start 节点外部变量与各节点模板插值:画布 Start 节点支持定义外部入参变量规范(变量名、描述、默认值、必填性);服务端与画布校验引擎严格校验各节点模板中
引用的合法性,确保引用的变量来自 Start 节点入参或当前节点可达的上游节点(collect 采集字段、router 分支、transfer 属性),且允许下游节点合法覆盖上游变量(3ab99a6、65086ab)。 - 全新话术模板编辑器
TemplateTextarea.vue:光标聚焦处一键即时插入上游可用变量,实时诊断未定义变量与语法错误,精简模板诊断展示(315ee17、9b942ea)。 - 单元测试覆盖:补充外呼流程模板变量解析、缺失检测与拓扑覆盖单元测试(
7f20c14、65086ab)。
- 联系人随路业务变量维护与解析(
- 外呼失败诊断与提示音分类标签外显(
callout-webpage):- 任务详情与通话记录页外显结构化失败诊断原因、运营商提示音分类标签(如「检测到提示音: 关机」)、识别到的原话文本(
detectedText)与重试倒计时进度(0f54b97)。 - 拨号线路展示与快捷切换(
74fbb80):任务详情与列表支持外呼线路外显与快捷切换。
- 任务详情与通话记录页外显结构化失败诊断原因、运营商提示音分类标签(如「检测到提示音: 关机」)、识别到的原话文本(
- 转人工会议架构解耦与多出口流转(
callflow-esl/callout-server/callout-webpage):- 解耦坐席离会与客户通道强拆,支持多职员会内复盘(
3eefa10):解耦坐席离会与通道强拆,当坐席挂断离会时,不再无差别强杀会议与客户通话,支持主管、多坐席等继续在会复盘或交接。 - 支持坐席挂断后客户即时流转至后续节点(
fcd90f3):callout-flow-business转人工节点支持流程延续:坐席挂断后,客户不再被直接挂断,而是顺延转人工节点的出口分支继续执行后续节点(如服务满意度评价、收集反馈、告别播报等)。 - 规范转人工节点双出口与画布呈现(
0ffd703):规范转人工节点默认出口(default/routed=true)与超时/失败出口(timeout/routed=false)的语义与拓扑校验,画布直观呈现双分支连线。 - 会议散会生命周期与通道级联挂断保障(
2a132d8):严格散会状态机,主叫/主持人解散会议时保证关联通道与后台媒体 bug 级联挂断释放,杜绝残留孤儿通道。
- 解耦坐席离会与客户通道强拆,支持多职员会内复盘(
- 阿里云语音网关原生 PCM 流式 TTS 与 ASR 轮次泛热词(
speech-gateway/aliyun-speech-gateway):POST /tts-stream增加原生 PCM 流式下行(format="pcm"),消除服务端 MP3 转码与 FreeSWITCH 端的解码延迟,首包延迟压降 200~300ms(9fbfe93)。- 支持 ASR 会话中按轮次注入业务泛热词表与权重(
custom_vocabulary/vocabulary_id),大幅提升专业领域识别率。
- Barge-in 抢话续播延迟优化:乐观启动 + Event-UUID 精确归位(
callflow-esl):- 每次 playback execute 通过 sendmsg 的
Event-UUID精确关联,被打断播放移入 retiring 非阻塞收尾; - hear 识别成功且 prompt 已被打断时走快路,不阻塞等待完成事件,下一句回显立即下发;抢话续播延迟由 300~400ms 降至 3~4ms(
fd3207e)。
- 每次 playback execute 通过 sendmsg 的
- FunASR 2-Pass 识别延迟优化:乐观投机定稿与离线异步调度(
onnx-platform/funasr-asr-server):- 乐观投机定稿(
speculativeFinalize,默认开启):VAD 静音确认倒计时期间并行预跑离线二阶段,把离线算力藏入静音窗口内; - 离线异步 offload 走
spawn_blocking,不阻塞 Tokio 协程; - VAD 端点精确尾裁剪与离线独立线程数(
offlineInferenceThreads,6883003、206ab53)。
- 乐观投机定稿(
- 管理台语音调试与试听页卡片化重构(
callflow-webpage):- 新增统一语音服务连接状态卡片组件
SpeechServiceCard.vue(4ec75ab); - 重构 TTS 试听页:卡片化发音人展示与多引擎快速切换(
50233e5); - 重构 ASR 调试页:输入平铺与双列实时结果展示(左列文本、右列事件帧时序流,
2160f9c、01af6c7)。
- 新增统一语音服务连接状态卡片组件
- 工程构建与运维命令完善:
- 重构原生服务构建与 Rust 门禁脚本:统一根目录
bun run check:rust与bun run build:native(51f3d32); package.json新增子项目独立启动脚本:dev:callflow-esl、dev:callflow-server、dev:callflow-webpage、dev:callout-server、dev:callout-webpage(b5ace95);- 更新 MicroSIP 演示软电话客户端包并补充 Android 移动端软电话配置与联调文档(
b15518f、6bb737f); - 补充 Docker 原生构建镜像
libssl-dev编译依赖,保障 Linux 容器环境下 Rust 语音推理服务原生编译(d7e0807)。
- 重构原生服务构建与 Rust 门禁脚本:统一根目录
变更
- callflow-esl 极简原生日志重构(剥离 Winston):自研基于 Bun 原生
process.stdout.write+ 高性能流式按天按大小日志切分与归档,废除 winston 依赖,开箱即用零三方依赖,性能大幅跃升(096a5d4)。 - callflow-esl 数据访问层原生 SQL 重构(剥离 Drizzle ORM):移除 Drizzle ORM 与 drizzle-kit 依赖,全面切换为 Bun 原生高性能 SQL(
bun:sqlite/postgres),零抽象层开销,大幅降低内存占用与提升高并发读写吞吐(4071fee)。 - callflow 数据库迁移职责收敛至
callflow-server:callflowschema 结构定义与drizzle.config.ts迁移维护职责统一收敛至apps/callflow-server,ESL 专注执行引擎,消除跨子项目双重维护迁移脚本的割裂(c0c1cde)。 - 通话业务四分类体系重构:将业务主场景分类从原八值协议彻底重构收敛为更加直观聚焦的四分类体系(
outbound/inbound/assist/demo),分类仅用于展示/筛选,彻底解耦配置模块循环依赖(7d584e2、0dba6e7)。 - callflow-esl HTTP 控制面统一响应信封
{ code, data, msg }:callflow-eslHTTP 控制面(默认9912端口)全面对齐平台规范,所有 JSON 接口统一采用{ code: "0000", data, msg }响应信封;新增会议实时对话流(GET /api/conference/:conferenceId/dialogue-stream)与 AI 播报接口(POST /api/conference/:conferenceId/ai-broadcast,df2f7a4)。 - 规范 TTS 流式 Profile 命名为
stream并默认启用audio_fork://原生 PCM:配置段从历史兼容的shout正式规范为stream([tts.profiles.stream],use.call = "stream",use.conference = "stream");默认流式前缀推荐audio_fork://,实现原生 PCM 裸流推流平替mod_shout,彻底根治会议混音卡顿与 CPU 尖峰(7075b8b)。 - FreeSWITCH 容器化部署包更新与媒体流卡顿修复:更新
deploy/freeswitch/docker_fs_server.tar.gz发布包,修复mod_audio_fork在采样率或音频编码不一致时的异常卡顿问题(9fca198),并彻底根治会议混音中的流式播放卡顿与 CPU 尖峰(2444b88)。 - 阿里云公网生产节点 SIP 端口安全收敛与背景音配置:生产环境内部 SIP 端口由默认
5060/5061调整为高位端口15321/15322(规避公网恶意 SIP 扫描探测与爆破),统一会议背景音流路径为标准local_stream://moh/16000(e40903b)。 - FRP 穿透部署模板安全加固:脱敏
deploy/aliyun/frp/frps.toml与deploy/wsl-docker/frpc/frpc.toml中的认证令牌(58669bf)。 - 外呼回铃检测判定与重试调度状态流转优化:将
carrier_prompt_detected规范化收敛至外呼结果与联系人失败状态,依据任务maxRetries与retryIntervalSeconds精确计算nextRetryAt,避免无限重试或漏重试;修复外呼任务批量申领类型转换与已接听超时状态(1a94f68、1da6f2b)。 - 移除 Chat 出口判定置信度:移除含糊的
confidence浮点数,直接由shouldExit布尔决策驱动出口(8d42580)。 - 默认呼叫业务打断触发模式调整为
partial:默认打断触发模式从speech-start调整为更抗底噪误触的partial出字打断(bfe1379)。 - Rust 语音服务滚动日志文件名后缀规范与 ONNX Runtime 启动冗余日志抑制(
0d0a397、b981ecf)。 - 双端平台 404 缺省页设计与快捷导航优化(
c17cd27)。 - 前端表单控件字体样式与排版一致性规范(
61bd4c3)。 - 全栈业务分类统一收敛为四值体系(涵盖
callflow-server):将callflow-server的BusinessCategory契约定义与测试用例从历史八值彻底重构收敛为四值体系(outbound/inbound/assist/demo),与数据库 CHECK 约束、callflow-esl和双端前端 Web 彻底对齐闭环(ad53bb6)。 - 规范车险电销业务描述去特定品牌化:对齐
insurance-chat-business代码注释与用例文档,去除特定商业品牌前缀(eebb5e9)。 - ESL 基础日志单测输出隔离与容器部署包同步:单测输出重构至系统临时目录规避工作区污染(
81d0849),更新 FreeSWITCH 容器部署包资产指针(5509bf5),重构文档站侧边栏导航并修复相对死链(ec25141)。
移除
- 移除 OpenSpec 规范驱动开发流程与工具集:全面移除
openspec/目录(配置、规格与变更归档)、.agents/skills/下 OpenSpec 扩展技能与.agents/workflows/opsx-*.md工作流(8d71301)。 - 下线重复生产回铃检测业务
carrier-ringback-detection-business(代码 1007):下线冗余业务,统一保留演示业务carrier-ringback-detection-demo-business(代码 9006,4ddd90c)。 - 移除 NLU 评估旧版别名路由:移除
POST /api/ai/nlu/eval历史别名,统一为POST /api/v1/ai/nlu/eval(728901f)。 - 下线呼叫流程动态运行时配置模块:移除
callflow-server中的callflow_runtime_configs数据库表、/api/callflow/runtime-configs*接口及auth.enabled配置项,同步下线callflow-webpage的/runtime-configs页面(路由保留向/number-mappings的兼容重定向,c6cdc4a)。
破坏性变更(Breaking)
- callflow-esl HTTP 控制面响应信封契约统一为
{ code, data, msg }:- 原返回裸 JSON 对象或
{ ok: true, data }的 HTTP 接口(POST /api/outbound-call、POST /api/conferences、POST /api/softphone-sessions等)全部统一为{ code: "0000", data, msg: "请求成功" }(HTTP 200 携带业务状态码)。直连 callflow-esl9912端口管理接口的客户端与自动化脚本需适配改判code === "0000"。
- 原返回裸 JSON 对象或
- callflow-esl 数据库管理职责收敛至 callflow-server 并剥离 ORM:
- 剥离 Drizzle ORM,改用 Bun 原生 SQL;
callflowschema 迁移与drizzle.config.ts统一收敛至apps/callflow-server。不再在apps/callflow-esl下执行bun run db:push,改为统一在apps/callflow-server下执行bun run db:push。
- TTS 配置流式 Profile 键名规范化(
shout→stream):config.toml中[tts.profiles.shout]正式重命名为[tts.profiles.stream],use.call与use.conference推荐配置为"stream"。配置解析器虽向下兼容历史shout键名,但旧版配置文件建议主动迁移至stream。
- 通话业务主场景分类从八值重构为四值体系:
- 业务
category字段由原八值协议彻底收敛为outbound/inbound/assist/demo。callflow-esl、callflow-server与前端统一对齐四值字符串枚举,数据库callflow.call_businesses约束同步收敛为四值枚举。存量数据库中已有的分类需由启动期双向对账自动刷新,依赖旧分类字符串的查询与筛选逻辑需对齐。
- 业务
- 移除 OpenSpec 目录与相关技能工作流:
- 彻底移除
openspec/目录及相关 agent 技能,项目不再以 opsx specs 形式维护变更提案。
- 彻底移除
- 移除 NLU 评估旧版别名路由
POST /api/ai/nlu/eval:- 移除旧版别名,统一使用规范路由
POST /api/v1/ai/nlu/eval。
- 移除旧版别名,统一使用规范路由
- 下线核心业务
carrier-ringback-detection-business(代码 1007):- 下线重复的生产回铃检测业务,仅保留演示业务
carrier-ringback-detection-demo-business(代码 9006)。存量数据库若有关联该业务编码的号码映射需调整。
- 下线重复的生产回铃检测业务,仅保留演示业务
- 外呼流程 Chat 节点结果移除
confidence字段(8d42580):- 彻底移除浮点型
confidence(置信度),流程引擎与外呼对话流不再产生或消费confidence,出口决策严格由shouldExit布尔值驱动。若有外部系统或统计分析依赖routeTrace或ChatNodeResult中的confidence字段需移除引用。
- 彻底移除浮点型
- 阿里云公网生产节点内部 SIP 端口变更(
5060→15321)与背景音路径对齐(e40903b):- 阿里云公网现场 FreeSWITCH 内部 SIP 端口从运营商高危封锁与公网扫描的
5060迁移至15321,外部软电话或 SIP 客户端若直连阿里云内部 profile 需调整端口;现场背景音流streamUrl调整为local_stream://moh/16000。
- 阿里云公网现场 FreeSWITCH 内部 SIP 端口从运营商高危封锁与公网扫描的
- 默认呼叫业务打断触发模式调整为
partial(bfe1379):- 默认全局打断策略从
speech-start调整为更抗底噪误触的partial(出字打断)。若特定业务必须要求开嗓即断,需在业务或配置中显式声明bargeInTrigger: "speech-start"。
- 默认全局打断策略从
升级提示(2.0.0 → 2.1.0)
- 业务分类对账与数据库 schema 同步顺序:
- 由于
apps/callflow-server的 schema 为callflow.call_businesses新增了严格的四值 CHECK 约束(ck_call_businesses_business_category:'outbound', 'inbound', 'assist', 'demo'),若直接对包含历史 8 值分类数据的数据库执行db:push会触发 PostgreSQL 约束校验异常。 - 推荐升级顺序:先启动新版
callflow-esl,使其通过syncRegisteredCallBusinesses()自动完成业务双向对账与新分类回填(并将下线的1007业务标记为禁用/软删除);或手工预先执行 SQL 回填:sqlUPDATE callflow.call_businesses SET "businessCategory" = 'demo' WHERE "businessCategory" NOT IN ('outbound', 'inbound', 'assist', 'demo'); - 随后执行
bun run --cwd apps/callflow-server db:push(注意:已收敛至callflow-server,无需在callflow-esl下执行)同步最新的数据库结构与 CHECK 约束。
- 由于
- 配置文件校准:
- 将
apps/callflow-esl/config.toml中的[tts.profiles.shout]更新为[tts.profiles.stream],确认use.call = "stream"、use.conference = "stream"以及playbackPrefix = "audio_fork://"; - 若部署在阿里云生产环境,确认 SIP 端口更新为
15321,背景音streamUrl确认指向local_stream://moh/16000。
- 将
- 服务依赖安装与原生构建:
- 在项目根目录执行
bun install安装最新依赖(已剥离 winston 与 drizzle-orm,依赖更精简); - 执行
bun run check:rust验证 5 个 Rust 语音服务的编译、Clippy 规范与单元测试; - 若在 Linux Docker 容器环境编译,确认更新 Dockerfile 包含
libssl-dev。
- 在项目根目录执行
- 业务双向对账与启动验证:
- 启动
callflow-esl,观察启动日志事件call_businesses_synced:自动对账会将业务分类刷回四分类体系(10 核心 + 16 演示),并自动将下线的1007业务标记为禁用/软删除。
- 启动
- 流程脚本与变量模板使用:
- 存量流程脚本完全向后兼容;
- 如需使用随路业务变量,可在 Start 节点声明入参,并在后续各节点使用
插值,通过全新的TemplateTextarea组件进行光标处即时插入与模板合法性诊断; - 编辑转人工节点时,确认连线包含默认出口(
default)与超时出口(timeout);Chat 节点无需配置已废弃的置信度。
2.0.0
全双工语音与全栈 Rust 化版,在 1.3.0(7c17d58)之上累积。
| 项 | 值 |
|---|---|
| 版本 | 2.0.0 |
| 发布日期 | 2026-09-26 |
| 源码版本(最后一次提交) | 13280d59ff733b2ed9c2b6bc4909eedd27a25709(短 13280d5) |
| 上一版本 | 1.3.0(7c17d58,2026-07-16) |
| 累计提交数 | 624 |
关于提交锚点:本仓库在 1.3.0 之后重建过 git 历史,1.3.0 及更早版本记录的短 SHA(如
7c17d58、a5cd832)在当前仓库已无法解析,仅作历史标注保留。2.0.0 以当前HEAD(13280d5;当前历史首次提交ccda64f,2026-05-02)为源码锚点,累计提交数按当前历史统计。
用户可见的关键变更:真正的全双工语音——上行送识别与下行灌音在同一条 WebSocket 长连接并发(新增 Go 全双工 网关
audio-fork-server、callflow-esl 原生ctx.duplex控制器、sherpa-tts-server 原生 PCM16 流式合成, 并以「代际时序控制」修复打断残留音频);ASR / TTS 全面 Rust 化——C++ 的 sherpa ASR 在线/离线双服务统一 重构为单进程双端口 Rustsherpa-asr-server,TTS 重构为纯 Rust,另有统一 FunASR Rust 服务,ONNX Runtime 升至1.29.0,下游零改动;AI 策略由「外部 profile 引用」改为「流程节点内联提示词」并配套三栏一体化策略 工作台,callout-server 公开 JSON 接口统一{code, data, msg}契约(Breaking);转人工会议多角色实时转写 + 主管耳语(whisper)+ 两阶段看门狗 + 会议生命周期自愈;外呼默认忽略早期媒体、基于 FreeSWITCHbillsec的通话时长校准、软电话记录软删除、全局用户事件流 SSE 迁移与指数退避重连。此外整体并入上一阶段累积的成果: AI 策略中台原生收敛入外呼系统、insurance-chat-business车险电销业务、stream-vad-proxy前置 VAD 与科大讯飞 私有云实时识别、deploy/双主机生产拓扑部署资产、callflow.call_businesses主键改为businessCode、打断触发 策略三态枚举重构、原apps/llm-server及过渡期callai-*服务整体下线等(均为 Breaking,见下)。平台内置通话 业务 26 项(11 核心 + 15 演示),默认bun run dev并发启动 9 个服务(新增 Go 全双工网关)。
新增
- 真正的全双工语音:Go 全双工网关
speech-gateway/audio-fork-server。新增独立 Go 服务(Go 1.23, 纯静态编译CGO_ENABLED=0),在同一条 WebSocket 长连接上桥接 FreeSWITCHmod_audio_fork(上行 PCM + 控制信令)与本地sherpa-asr-server/sherpa-tts-server:上行麦克风 PCM 转发识别、下行 TTS PCM 灌音, 上下行真正并发。默认 WebSocket 端口10091(路径/audio、子协议audio.drachtio.org),健康检查GET http://127.0.0.1:10091/health;上游 ASRws://127.0.0.1:10096/audio、TTShttp://127.0.0.1:9080(POST /tts-stream,format=pcm)。核心是代际(generation)时序控制(atomic.Uint64):每次speak与每次打断均递增代际,唯一写协程只发送「当前代际」的二进制音频帧、旧代际排队音频直接丢弃,而killAudio/speak_start等控制帧仍按队列顺序送达——这正是「打断后残留音频」修复的核心;起播突发预充前 25 帧(约 500ms) 消首包延迟,之后按 20ms 节拍平滑推流。构建/运行:bun run dev:audio-fork:air(air 热重载,已并入默认bun run dev)、bun run audio-fork:build:win/audio-fork:build:linux;支持AUDIO_FORK_PORT/AUDIO_FORK_ASR_WS_URL/AUDIO_FORK_TTS_BASE_URL等环境变量覆盖。 - callflow-esl 原生全双工控制器与
[duplex]配置段。CallContext新增ctx.duplex.{start, speak, interrupt, stop}与回调onTranscription / onFinal / onBargeIn / onError / onStop;每句speak生成speakId,killAudio事件携带speakId,控制器据此忽略「迟到的跨句打断」,避免旧句 killAudio 误杀新句。 打断/停止只用uuid_fileman <uuid> stop,严禁uuid_break all(避免重置 RTP 丢 ASR 首字)。新增配置段[duplex](enabled/wsUrl/healthUrl/bugName/bargeInTrigger/sampleRate/mixType/connectTimeoutMs);duplex 激活期与ctx.speak/ctx.hear/ctx.callHear互斥、仅限单呼通道(不支持 会议室)。新增演示业务duplex-ai-chat-demo-business,新增文档apps/callflow-esl/docs/duplex-communication.md。 - ASR / TTS 全面 Rust 化 + 统一 FunASR Rust 服务。原 C++17 的
sherpa-asr-online-server(WS10096)与sherpa-asr-offline-server(HTTP10095)统一重构为单进程双端口的纯 Rustonnx-platform/sherpa-asr-server(Tokio + Axum 0.8;WS10096流式识别 + HTTP10095离线转写,共享 SenseVoice 2-Pass/离线识别池,Whisper 兼容端点/v1/audio/transcriptions);C++ TTS 重构为纯 Rustonnx-platform/sherpa-tts-server(默认9080, 模型池化 + 带读取租约的 O(1) LRU 磁盘/内存淘汰);新增统一 FunASR 纯 Rust 服务onnx-platform/funasr-asr-server(WS10099+ HTTP10094,bun run dev:funasr/funasr:build:linux)。对外端口、WS/HTTP 契约与响应 JSON 与 C++ 版 100% 一致,下游(mod_audio_fork、callflow-esl、callout-server)零改动;内存共享单份模型、消除 C++ 内存安全风险,构建仅依赖 Rust 1.80+ 与仓库内置预编译sherpa-onnxSDK。ONNX Runtime 预编译资产升级1.26.0 → 1.29.0(Windows / Linux x64 / Linux aarch64 / macOS ARM64 全平台对齐)。 - sherpa-tts-server 原生 HTTP Chunked PCM16 流式合成。
POST /tts-stream新增format字段:"pcm"/"raw"在内存中把 TTS 采样做增益 + tanh 软限幅后量化为 PCM16 小端裸流、经 HTTP Chunked 直接推送,无需拉起ffmpeg、无 MP3 编解码(默认仍为mp3),响应头Content-Type: audio/pcm;rate=<sr>。callflow-esltts.profiles.shout.playbackPrefix默认由shout://改为audio_fork://(PCM 平替mod_shout,首包再降 约 200~300ms)。 - 原生内嵌 AI 决策中台与策略中心(
apps/callout-server9920与apps/callout-webpage19920)。 将大模型 NLU 语义决策/抽取、Chat SSE 多轮流式与非流式对话、流程脚本话术生成与拟真客户仿真, 以及 AI 策略与用量的持久化管理原生集成至callout-server,彻底消除跨服务代理网络开销与端口割裂。 callout-server 维护的 AI 策略数据表保留ai_llm_configs、ai_usage_records(策略/提示词本身改为内联进 流程脚本flowJson节点,原ai_nlu_profiles/ai_chat_profiles已下线,见「破坏性变更」)。 推理后端地址既可由config.toml的llm段指定,也可留空由数据库中启用的ai_llm_configs记录动态提供(GET/PUT /api/v1/ai/llm-config、POST /api/v1/ai/llm-config/test)。 - 流程节点内联 AI 策略 + 三栏一体化策略工作台(
apps/callout-webpage「AI 策略运营中心」/ai/strategies)。 AI 策略/提示词不再依赖外部 profile 引用,而是内联嵌入流程脚本节点的flowJson.nodes[i].data:router节点带system_prompt+branches、collect带system_prompt+ 字段定义、chat带system_prompt+exit_prompt+temperature,callout-server 直接从请求体读取提示词、零数据库查表。工作台重构为三栏:左栏话术 与节点大纲树(StrategyScriptOutline),中栏节点深度调优区(StrategyNodeEditor,微拓扑 + 提示词编辑 + 温度 + 「一句话 AI 生成」+ 原子保存),右栏常驻即时拨测中心(StrategyLivePlayground,直接对未保存草稿拨测,含 Raw Output / Thinking 折叠)。新增PATCH /api/v1/scripts/:scriptId/nodes/:nodeId/prompt(单节点原子更新)与POST /api/v1/scripts/:scriptId/nodes/:nodeId/generate-profile(一句话生成);独立/ai/playground页下线并 重定向到/ai/strategies。平台默认bun run dev并发启动服务由 8 个增至 9 个(新增 Go 全双工网关)。 - 新增生产核心业务
insurance-chat-business(车险电销对话)。业务代码1010, 主场景分类08 车险电销,基于大模型流式对话并内置上下文防复述护栏机制、改号纠错与多轮意图识别, 使全平台业务总数扩展至 26 项(11 项核心生产业务 + 15 项测试/演示业务)。 - 部署资产成体系。
deploy/aliyun/(Nginx、callflow-esl、FRPS、coturn、文档站与对应 systemd unit) 与deploy/wsl-docker/(Dockerfile、docker-compose.yml、各服务configs/*.toml、FRPC) 覆盖当前双主机拓扑;镜像不含业务二进制与模型,均为外部挂载。 - 会议背景音注入与打断保护(callflow-esl)。
ctx.conference新增startBackgroundAudio()/stopBackgroundAudio()/getBackgroundAudio(),ctx.conference.join({ backgroundAudio })可在入会时自动起底噪;底层是conference <id> play <target> async,与业务放音(TTS/WAV)由会议混音器并发叠加。 三处关键行为:会议室尚未在 FreeSWITCH 建起来时(-ERR ... not found)请求挂起为 pending,首个成员入会时自动补启动;barge-in 只停业务放音,背景音被listInterruptibleConferencePlaybacks显式排除,整会议停止用stop current保留 async 流;会议结束/成员清空时自动停止。config.toml新增backgroundAudio段 (enabled/defaultProfile/profiles.<name>.streamUrl/profiles.<name>.volume), 其中enabled与volume目前解析后无消费方,播放与音量由调用方与素材决定。 新增演示业务conference-background-audio-demo-business。此后叠加 WSL 16k 对齐与入会抖动消除:背景音默认 profileoffice的streamUrl改为复用 WSL 原生 16k 流(消除 8k→16k 重采样 CPU 尖峰与Unknown source告警);conference.conf.xmldefaultprofile 加固——energy-level归 0、加member-flags=waste(恒定 20ms RTP)、moh-sound置空、comfort-noise关闭,根治入会 0~1s 卡顿;并把双采样率素材(ambient/office/{8000,16000}) 与local_stream.conf.xml、mod_local_stream加载同步进deploy/aliyun/freeswitch/发布包(wav 素材不入库, 仓库仅保留 XML 事实源)。 - 转人工会议多角色实时转写 + 主管协同(含耳语 whisper)(callflow-esl / callout-server / callout-webpage)。 转人工路由成功后以
ctx.conference.hear({ partialResults: true })起会议级 ASR,ConferenceRole扩展出agent/supervisor;主管monitor(静音)态转写丢弃,仅barge/ 开麦发言入库,partial→final 按参与者 去重(一句一行)。主管加入接口POST /api/conference-sessions/:conferenceId/participants的mode扩展为monitor | barge | whisper(新增whisper耳语,底层mod_conference relatenospeak+nohear双保险, 仅坐席能听到主管);主管已在会时为就地切换(不新建agentCallRecords、不重呼)。盯屏CallTranscriptView/live-monitor将主管渲染为右侧深紫气泡。POST /api/call-results的transcript[].speaker扩充为 5 值 (bot/customer/agent/supervisor/unknown,向后兼容,无需db:push)。 - 两阶段转人工看门狗(callflow-esl,
src/business/shared/human-transfer.ts)。joinConferenceWithAgentWatchdog改为两阶段状态机:阶段一waiting_for_agent(振铃超时 30s + 5s 宽限、500ms 轮询,超时自退agent_join_timeout), 阶段二in_call_guard(事件驱动member-left/member-joined+ 1.5~2s 心跳)。新增可选配置emptyGraceSeconds(空房间防抖,默认 3s、范围 2~5s),到期复核conference list count后自退agent_left;callout-flow/kb-audio-chat/kb-llm-chat三业务共享,业务代码零改动。 - 实时坐席状态广播 + 会议自动结案(callout-server / callout-webpage)。坐席状态每次流转(预占/接听/释放/手动) 都经 SSE 事件
agent_status({ agentId, status, lastStatusAt })广播,GlobalEventHub单例 + Redis Pub/Sub 跨实例;前端由单条 SSE 长连接驱动、移除原 10 秒轮询定时器,改为重聚焦时一次性对账。客户CHANNEL_HANGUP_COMPLETE时会议自动结案:conference_sessions.status=ended、uuid_kill所有在会坐席/主管腿、坐席释放为空闲,另有 60s 对账 worker 兜底。 - 会议生命周期与幽灵会议自愈(callflow-esl 事件驱动 + 查询期自愈,callout-server 后台对账 + 409 护栏)。会议 状态严格
created → active(首个成员入会)→ ended(conference-destroy或末位成员离开),移除会「复活已结束 会议」的错误 upsert;GET /conferences及详情查询期执行两段式对账(DB 快路径 → FreeSWITCHconference <id> list count探测,含 15s / 60s 保护窗防「建会-首入会」竞态),FS-ERR ... not found视为解散。callout-server 新增conference-reconcileworker 与配置conferenceReconcile.intervalMs(默认 30000)/graceMs(默认 60000), 列表/详情响应补liveMemberCount/liveStatus(live/ended/unknown)计算字段;已结束会议的加成员/踢人接口 返回409 Conflict,前端转为只读归档视图并停轮询。新增文档apps/callflow-esl/docs/conference-lifecycle-and-reconcile.md。 mod_local_stream办公室底噪素材。deploy/freeswitch/local_stream.conf.xml新增ambient/office/8000与ambient/office/16000两个目录,素材data/05_office-ambience-6322_{8k,16k}.wav随仓库提供,modules.conf.xml打开mod_local_stream;背景音默认 profileoffice即指向local_stream://ambient/office/16000。deploy/freeswitch/改为容器化部署包 + 专题文档库。原「供新环境合并的配置参考树」 替换为docker_fs_server.tar.gz(Debian 13 Trixie + FreeSWITCH 1.11.2 +mod_audio_fork+mod_shout+ 录音托管 Nginx + 4 个依赖共享库)与README.md, 并拆出五篇专题文档docs/network-and-nat.md、docs/sip-profiles.md、docs/ai-and-modules.md、docs/module-configs.md、docs/integration-and-dialplan.md。 线上现场配置快照仍在deploy/aliyun/freeswitch/。- OpenSpec 规范驱动开发配置。新增
openspec/config.yaml、.agents/workflows/opsx-*.md与.agents/skills/openspec-*/SKILL.md(探索 / 提案 / 应用 / 校验 / 归档 / 同步规格等), 变更提案与规格落在openspec/changes/*。 - 全平台自动化部署技能整合。原
deploy-ai-voice-apps与deploy-ai-voice-onnx两套 PowerShell + Shell 脚本合并为单一.agents/skills/deploy-ai-voice-platform(scripts/deploy.ts,Bun 实现),并支持配置同步与健康检查重试。 - 基于 FreeSWITCH
billsec的通话时长校准(callout-server)。durationSeconds改为四级兜底阶梯:保留已有正值 (防覆写)→variable_billsec→variable_duration→ 推算;并对endedAt < answeredAt的时钟回拨自愈重算, 修复 WSL / 跨主机时钟漂移导致时长归零、界面显示-的问题。 - 外呼中台独立对话策略(state-free)(callout-server)。新增内部端点
POST /api/v1/conversation(action: "start" | "query",HeaderX-Callout-Internal-Token)与GET /api/v1/conversation/capabilities: 一套确定性、不走模型推理的轻量单/多轮问答机制,供 callflow-esl 知识库录音对话业务与集成测试使用;同时把话术 生成/仿真的服务间调用下沉到内部令牌通道POST /api/v1/script/generate、/api/v1/script/simulate-user,并新增 会话续期POST /api/auth/refresh。 - 坐席通话记录批量/单条软删除(callout-server / callout-webpage,权限
agent:operate)。基于既有deletedAt软删callout.agent_call_records(无新增列、无需db:push),查询统一按deletedAt IS NULL过滤;新增POST /api/softphone-calls/delete({ callIds:number[] })、DELETE /api/softphone-calls、DELETE /api/softphone-calls/:softphoneCallId,去重、写审计日志,前端支持多选删除。 - 全局用户事件流 SSE 统一路由 + 指数退避重连(callout-server / callout-webpage)。用户事件(
connected/agent_status/kickout单点登录互踢,: ping心跳 25s)统一到GET /api/user/events(EventSource 以access_token+appCode查询参数鉴权);前端指数退避重连(基础 2s、倍率 1.5、上限 30s,重连前刷新 Token), 并监听visibilitychange/online做休眠/断网自愈与重聚焦对账,废除原低频空轮询。 - 前端导航配置解耦 + 强类型事件总线(callout-webpage)。导航元数据从
MainLayout.vue剥离到独立src/config/navigation.ts(按权限过滤,服务端动态菜单加载失败时的静态兜底);新增基于 QuasarEventBus的 强类型单例appBus(src/utils/event-bus.ts)+ 随组件卸载自动解绑的useAppEventListener,坐席状态实时变色 改走事件总线;软电话高频控制台日志默认静音,仅在localStorageDEBUG_SIP="true"时开启调试输出。 - ASR 2-Pass 延迟优化 + 流式延迟压测脚本(
onnx-platform/sherpa-asr-server/funasr-asr-server)。新增[concurrency].offlineNumThreads(离线 2-Pass 独立线程数,默认 2、推荐 2~4,回退numThreads),把整句离线 重识别延迟由 300ms+ 压到约 80~120ms;离线language由auto锁定为zh(跳过 LID 分类头,约省 20ms,可按 会话经 WS 查询串/元数据覆盖),预热会话 16→32;每条 final 以结构化info!日志输出latency_ms/rtf等 指标。新增高并发首包延迟压测脚本bench-stream-latency.mjs(实时 20ms/640B 推流,度量 TTF-VAD / TTFP / VTFP / FFL 及 P50~P99)。 - FreeSWITCH 分机管理脚本
manage_ext.sh。纯 Bash + AWK/SED、零第三方依赖,提供list/add/batch-add/passwd/disable/enable/delete/reload/status子命令与交互式 TUI,覆盖分机全生命周期(强转义防 Shell$$PID 展开、防覆盖、删除前时间戳备份),并联动fs_cli一键reloadxml与查询实时注册状态。 - callout-server 启动链路拆分与领域类型抽取。
server.ts拆为server-http.ts+server-workers.ts(startBackgroundWorkers()),graceful shutdown 覆盖 SIGINT/SIGTERM;~1400 行的types/api.tsgod 文件拆分为agent/ai/auth/campaign/policy五个领域类型模块。 - 前置 VAD 流式代理
stream-vad-proxy(10093,仓库首个 Rust 服务)。透明串接在mod_audio_fork与上游 ASR 之间,本地用 Silero VAD(参数默认与onnx-platform/sherpa-asr-server/config.toml一致)在用户开嗓那一帧即刻向下游注入 真实 VAD 事件帧,使不支持 VAD 的云端流式识别也能命中bargeInTrigger: "speech-start"毫秒级打断(实测比上游首个非空 partial 早约 470ms);gate.mode默认speech-only, 静音期不转发上游(带 500ms pre-roll 预缓冲),可切passthrough回退全量透传。 下游协议与sherpa-asr-server兼容,接入只需把audioFork.wsUrl指向代理,apps/callflow-esl零改动。根脚本bun run dev:vad(不在默认dev启动组)、bun run check:rust、bun run vad:build:linux。 stream-vad-proxy可直接驱动科大讯飞私有云实时识别(IAT)。新增upstream.kind:默认platform-ws(行为与此前完全一致,上游须已实现本平台 ASR WS 契约), 切iflytek-iat则由代理自己说厂商私有协议——HTTP JSON-RPCssb→auw→grs→sse, 一个本地 VAD 语音段对应一次厂商会话(即一句真正的 final),并内置 16k → 8k 抗混叠降采样。 只对自身既无语音起始事件、也无服务端断句的 API 开这一档:阿里云 / Azure 自带服务端断句, 仍走各自的 TS 网关。新增iflytek配置段(url/appid/svc/type/busid/authNeed/sampleRate/chunkBytes/maxChunkBytes/requestTimeoutMs/grsPollIntervalMs/grsMaxPolls),凭据用IFLYTEK_IAT_URL/IFLYTEK_IAT_APPID环境变量注入(仓库内config.toml留空);该档在启动期强制gate.mode = "speech-only"与upstream.sendZeroLengthOnSegmentEnd = true(那是它唯一的断句来源)。/health增upstreamKind字段。新增文档stream-vad-proxy/docs/upstream-adapters.md。
变更
- 外呼默认忽略早期媒体 +
consume隔离回铃检测(callflow-esl / callout-server)。两端[freeswitch]段新增ignoreEarlyMedia(布尔,默认true,环境变量CALLOUT_FREESWITCH_IGNORE_EARLY_MEDIA,支持 per-callrequest.variables.ignore_early_media覆盖):普通外呼默认注入ignore_early_media=true,严格等被叫真实摘机 (200 OK)再接入 ESL 业务,避免彩铃吃字/漏播首句/未接听误判;回铃检测路径的ignore_early_media由"false"改为"consume"——回铃阶段仍消费CHANNEL_PROGRESS_MEDIA做嘟声检测,但绝不判定为已接通,从而隔离「回铃检测」 与「真实接通」。此为默认行为变更(详见「破坏性变更」)。 - 精准事件订阅默认化 + audio_fork 播放预缓冲(callflow-esl / FreeSWITCH)。
eventSubscriptionMode默认由"all"改为"channel-plus-custom"(每条 Outbound 连接只订阅myevents+PLAYBACK_STOP+DETECTED_TONE- 必要
CUSTOM mod_audio_fork::…,新增connect_failed/kill_audio),高并发下减少全量事件复制解析;订阅命令 改为sendCheckedCommand,失败即抛错使会话失败、不再静默降级到event plain ALL("all"保留为显式应急 回退)。FreeSWITCH 新增audio_fork.conf.xml(ws-prebuffer-ms=200/http-prebuffer-ms=200),同步进deploy/发布包。
- 必要
- 流程脚本收集节点字段设置整改。移除从未有运行时语义的「敏感」字段开关(存量脚本残留值由编辑器剥离、 服务端与运行时忽略);字段校验规则改为按类型生效(number →
min/max,text →pattern,enum →enum),切换类型时自动清理不适用的规则,新增 number 字段min <= max校验;越界 / 格式 / 枚举错误 分别播报「xx需在 A 到 B 之间。」「xx格式不正确,请重新说明。」「xx请在 A、B 中选择。」,必填缺失仍为 「请补充:xx。」,流程演示与真实通话逐字一致;校验规则随字段定义进入 NLU 抽取提示词(ExtractField.validation);routeTrace的 collect 项新增invalidFields。见apps/callout-server/docs/flow-script-nlu-development.md「collect 节点规范」。 - AI 策略与外呼系统原生深度集成。废除过渡期的独立 AI 代理模式,
callout-server直接在自有端口 (默认9920)原生提供/api/v1/nlu与/api/v1/chat/stream,callflow-esl统一通过[callout]直连;callout-webpage界面完成一体化重构,提供原生「AI 策略中心」,策略增删改查实现本地数据引用完整性原子校验。 - callflow-esl 业务注册体系重构。业务按「核心生产业务 +
demo/演示业务」归类,src/business/index.ts汇总allBusinesses供business-registry.ts消费。 - 通话业务增加代码权威主场景分类。
callflow-esl业务注册项category使用统一八值协议(default/outbound/conference/agent_assist/ai_conversation/carrier/verification/test),启动同步写入callflow.call_businesses.businessCategory;callflow-server、callout-server 与两个网页 透传并按分类分组展示。分类只用于展示/筛选,不参与业务路由、号码映射、campaign 或 FreeSWITCH 变量。升级顺序为:先新增varchar(32) NOT NULL DEFAULT 'default'列及八值 CHECK,再启动新版 callflow-esl 回填权威分类,随后部署两个 API,最后发布网页。 - 呼叫控制服务端会话鉴权与网页端软电话控制台增强(
callflow-server/ 两个 webpage 的use-sip-softphone)。 - 启动期业务同步改为双向强制对账(
apps/callflow-esl/src/db/call-business-sync.ts)。 除了按代码侧注册表 upsert(isEnabled=1、deletedAt=null,可复活被软删的记录), 现在还会把数据库里代码侧已不存在的业务编码强制软删(isEnabled=0、deletedAt=now()),并把两份清单一起记进启动日志事件call_businesses_synced的syncedBusinessCodes/deactivatedBusinessCodes——数据库里出现「失联」业务时 启动日志即可发现,不必等到路由命中才报错。 - FreeSWITCH 音视频 WSS 与 Nginx 公网反向代理。
deploy/aliyun/打开mod_verto与verto.conf.xml,补 ACL、dialplan 与vars.xml校准;nginx/ai-voice-public.conf扩到覆盖 WSS 与文档站,新增nginx/README.md;软电话 ICE/TURN 指南同步更新。 - 部署编排与集群穿透收敛。清理废弃的独立 AI 容器与配置(删除
llm-*与callai-*), FRP 穿透端口范围规范收敛为12000-12012(移除12013与12014),Nginx 虚拟主机数量收敛至 8 个域名。 - 文档站导航与全局文档同步(
docs/index.md、docs-site/、部署架构与语音服务模块导航), 全面对齐默认 9 进程(含 Go 全双工网关)、2 API + 2 Web 拓扑以及标准 TOML 配置语法。 - 前端修复与格式规范化:外呼前端切换角色登录后侧边菜单未同步刷新;演示环境默认登录 凭据说明;ASR 联调测试页
computed内的副作用;ASR 健康检查路由单测断言; 呼叫与外呼前端组件代码格式统一。
破坏性变更(Breaking)
- 独立 AI 服务(
apps/llm-server及过渡期apps/callai-server9930 /apps/callai-webpage19930)彻底下线。 大模型 NLU 决策抽取、Chat SSE 流式对话与策略中台全面原生并入apps/callout-server(9920/29920) 与apps/callout-webpage(19920)。升级须知:- 调用方(如
callflow-esl)将 NLU 与 Chat 请求地址由原 9930 改为直连callout-server(9920), 接口路径分别为/api/v1/nlu与/api/v1/chat/stream; - FRP 隧道
12013与12014取消,公网 Nginx 废弃的callai域名与虚拟主机移除,端口范围收敛至12000-12012; - 移除独立的
callai-server与callai-webpage服务进程,平台默认本地服务进程数由此收敛至 8 个(2.0 引入 Go 全双工网关后默认为 9 个); - 首次部署或升级执行
bun run --cwd apps/callout-server db:push初始化或对齐callai策略实体表, 管理员通过callout-webpage(19920)的「AI 策略中心」统一配置与调试模型。
- 调用方(如
ollama-chat-business业务编码不再存在,对应能力由llm-chat-business承担,endpoint从 Ollama/api/chat改为 OpenAI 兼容的/v1/chat/completions, 并新增apiKey/model字段。数据库中残留的旧编码路由需要一并更新。deploy/config/目录不再存在。部署配置改到deploy/aliyun/*/与deploy/wsl-docker/configs/;引用旧路径的外部脚本需同步修改。callflow.call_businesses主键改为businessCode。id serial列与唯一索引ux_call_businesses_business_code一并删除,businessCode varchar(128)直接作主键;call_business_number_mappings.businessId integer改为businessCode varchar(128),索引idx_..._business_id更名idx_..._business_code。升级须知:- 先备份
callflowschema,再执行bun run --cwd apps/callflow-esl db:push; 存量号码映射的business_id需要人工按业务编码回填后再删旧列,db:push不会替你做数据迁移; - 管理接口
PUT /api/callflow/businesses/{id}改为PUT /api/callflow/businesses/{businessCode}; DELETE /api/callflow/businesses/{id}已下线——业务的启停由代码侧注册表 驱动,启动期对账会自动软删代码里不存在的编码,不再提供手工删除入口;- 号码映射的创建/更新请求体字段由
businessId(正整数)改为businessCode(非空字符串,最长 128),前端callflow-webpage与 API 类型已同步。
- 先备份
- 打断触发策略
BargeInTrigger彻底重构。废除旧有概念倒置的"vad"与"begin-speaking"命名,统一为语义清晰的精准三态枚举:"speech-start":开嗓即断(原"begin-speaking"),依靠 VAD 能量或算法边沿信号在开嗓毫秒级触发打断;"partial":出字即断(原"vad",现全局默认策略),出首个识别字符才打断,抗环境底噪误触最稳妥;"final":整句识别完成才打断(保持语义完整性)。 升级须知:- 业务代码及会议配置中显式声明
bargeInTrigger的位置需替换为"speech-start"/"partial"/"final"; - 运行时事件与日志中的打断原因由
barge-in:vad、barge-in:begin-speaking规范为barge-in:speech-start、barge-in:partial、barge-in:final。
- callout-server 公开 JSON 接口统一为
{ code, data, msg }契约。成功码为字符串"0000"(非0/200), 失败为{ code: "400"|"500", data: null, msg };移除rawJsonResponse工具与X-Raw-Response: true头旁路、 前端apiPostRaw(全部走apiPost/apiGet并在code !== "0000"时抛错)。已切换路由:POST /api/v1/nlu、GET /api/v1/nlu/capabilities、POST /api/v1/ai/nlu/eval、POST /api/ai/generate、POST /api/ai/simulate-user及 LLM 配置管理接口。升级须知:- 直连这些接口的调用方(含
callflow-esl的callout-flow-business)须改判code === "0000"; callflow-server不受影响;SSE/api/v1/chat/stream、/tts-stream/*、/wav/*与导出类接口不在此列;- 内部回写通道
POST /api/call-results仍保留{ ok, data }/{ ok, error }(CLAUDE.md旧述的{ ok, data }全局信封对公开 AI 接口已过时)。
- 直连这些接口的调用方(含
- AI 策略 profile 表与 CRUD 路由下线,策略改为内联进流程节点。删除数据表
ai_nlu_profiles、ai_chat_profiles(保留ai_llm_configs、ai_usage_records),移除/api/v1/ai/nlu-profiles、/api/v1/ai/chat-profiles的 增删改查与批量同步路由;策略/提示词内联进流程脚本flowJson节点,新增PATCH /api/v1/scripts/:scriptId/ nodes/:nodeId/prompt。升级须知:- 执行
bun run --cwd apps/callout-server db:push落库(同时删除早前ai_nlu_profiles.is_default列); - 无双模式兼容:不含内联提示词的存量脚本必须经画布或策略工作台重新保存(推理侧仅以内置最小通用提示词兜底 防崩,不等价于原策略)。
- 执行
- 全局用户事件流 SSE 路由迁移(无别名)。
GET /api/auth/events下线,改为GET /api/user/events(callout-server 新增system-routes.ts);事件与 25s 心跳不变,前端已同步,引用旧路径的外部脚本/反代需改。 - 外呼默认忽略早期媒体(默认行为变更)。
freeswitch.ignoreEarlyMedia默认true:接入 ESL / 起播 TTS 推迟到 被叫真实 200 OK,依赖早期媒体阶段接入业务的部署为破坏性默认变更;副作用是持续回放 183 的空号/关机可能要等到originate_timeout才判定。可用ignoreEarlyMedia=false或按调用变量回退。 - 独立
/ai/playground页下线,重定向到三栏工作台/ai/strategies(保留scriptId/nodeId参数)。 - callflow-esl 与 callout-server 移除废弃的双向音频配置。删除
bidirectionalAudioEnabled/bidirectionalAudioStreamEnabled/bidirectionalAudioStreamSampleRate三项及对应CALLOUT_RINGBACK_DETECTION_BIDIRECTIONAL_AUDIO_*环境变量(能力迁往新的全双工[duplex]段与 Go 全双工网关); 生产deploy/配置同步清理。
升级提示(1.3.0 → 2.0.0)
- 数据库 schema 同步。执行
bun run --cwd apps/callout-server db:push(删除ai_nlu_profiles/ai_chat_profiles及is_default列)与bun run --cwd apps/callflow-esl db:push(businessCode主键改造, 见第 4 条,务必先备份callflowschema 并人工回填号码映射)。其余新增能力(转人工转写、会议自愈、软删除、 billsec 校准等)均复用既有列,无需额外db:push。 - 存量流程脚本必须重存。AI 策略已改为内联提示词,旧脚本需经画布或
/ai/strategies工作台重新保存;直连 callout-server AI 接口的调用方改判响应code === "0000"(见第 6 条)。 - 调用方与反代改地址。用户事件流由
/api/auth/events改为/api/user/events(第 8 条)。 - 构建并纳入全双工网关。
bun run audio-fork:build:win/audio-fork:build:linux产出speech-gateway/audio-fork-server可执行文件;启用全双工需[duplex].enabled=true并让wsUrl指向网关10091。默认bun run dev已含该服务(并发进程 8 → 9)。 - 重新编译 Rust 语音服务。ASR/TTS/FunASR 已全面 Rust 化且 ONNX Runtime 升至
1.29.0,需按build.ps1/build.sh重新构建装配交付包;对外端口与契约不变,下游无需改动。 - 确认早期媒体默认值。
freeswitch.ignoreEarlyMedia默认true(第 9 条),依赖早期媒体接入的部署需显式 置false或按调用覆盖。
1.3.0
多实例扩展与实时协同版,在 1.2.0(d79460d)之上累积。
| 项 | 值 |
|---|---|
| 版本 | 1.3.0 |
| 发布日期 | 2026-07-16 |
| 源码版本(最后一次提交) | 7c17d589f650de03ac9f3a79ba0449bc95453fa2(短 7c17d58) |
| 上一版本 | 1.2.0(d79460d,2026-07-06) |
| 累计提交数 | 279 |
用户可见的关键变更:多 FreeSWITCH(cell)池化部署、Redis 升级为 callflow-esl 与 callout-server 的必选核心依赖、知识库录音对话业务、坐席实时盯屏与人工介入、流程脚本
transfer转人工节点、Ollama NLU profile 扩充、号码导入改为小批量同步(Breaking)、 TTS 缓存 LRU 淘汰、Apps 与 ONNX 发布包拆分、管理台外呼测试、浏览器软电话演示脚本, 以及移除仓库内一体化 / 容器化部署实现。
新增
多 FS 池化(cell 分片)与 Redis 成为核心依赖。在 cell 配置形态之上完成多实例部署所需的 全链路 cell 路由与协调,Redis 从「可选降级」升级为两个服务的硬依赖:
- 每 cell 一个 FS 事件监听器 + Redis 租约。
freeswitch-events由单监听器改为按config.cells每 cell 一个,事件对账带cellId校验;新增services/cell-lease.ts(callout:esl-listener:{cellId}SET NX PX + 心跳续期),多实例部署时每台 FS 只有一个消费者,持有实例崩溃后租约到期自动接管, Redis 为必选依赖,不再提供本地全量持有降级。 - 坐席 cell 归属 + 同 cell 转人工约束。
agents加列cell_id(注册对账 worker 按各 cellshow registrations在全局锁保护下并行查询全部 cell、批量写入归属与离线状态),转人工/会议加坐席按「与客户通话同 cell」 过滤(reserveIdleAgent新增cellId过滤);conference_sessions加列cell_id,会议成员 进出、uuid_kill、会议对账全部按会话归属 cell 路由到对应 FreeSWITCH。均带索引、bun run db:push同步。 - 软电话粘性路由 + 盯屏介入按 cell 路由。
callflow-esl-softphone代理客户端改为接收目标 callflow-esl 地址;新增services/softphone-session-routing.ts(callout:softphone:{sessionId}→ cell,12h TTL、读取续期),会话按坐席归属 cell 创建、后续消息/控制/SSE 回到创建它的实例; 盯屏人工介入按attempt.cellId转发到对应实例。 - 后台 worker 多实例化。调度器去掉全局锁改为多实例分摊(单任务仍由 campaign 级 Redis 锁 + 行锁互斥);情绪分析任务领取改为事务内
FOR UPDATE SKIP LOCKED原子认领; 生命周期对账用 try-lock 去重;会议/坐席注册对账绑定 cell 监听租约。 - 号码导入改为小批量同步处理(Breaking)。粘贴与 CSV/TSV 文件导入即时返回统一汇总, 单次最多 10,000 行、文件最大 5 MiB;仅
running任务禁止导入,写入事务锁定 campaign。 删除异步 worker、任务历史/错误 CSV API、importJobs配置和三张导入历史表;升级必须在维护 窗口备份数据库并手工删除三张旧导入历史表(SQL 见下方升级提示)。 - callflow-esl 运行时状态 Redis 化 + Redis 必选。移除
config.json的redis.enabled,缺配置或 连不上在启动期报错退出(不再有进程内 Map 降级)。坐席实时盯屏会话注册表(live-session.ts) 整体迁 Redis(会话/别名 key 带 TTL,介入信号 SET NX 受理、GETDEL 原子消费,多实例任一实例都能 路由到正确会话);运行时配置 reload 新增 Redis Pub/Sub 广播({prefix}:runtime-configs:reload), 管理端调一次全部实例同步重载;浏览器软电话 Hub 补周期过期清扫(created 闲置/终态留存 TTL), 补容量指标GET /health(当前活跃 ESL 会话数)。 - 容量指标与常驻连接。
GET /api/runtime/overview新增cellConcurrency[](各 cell 活跃数/上限);FreeSwitchApiClient由每命令新建短连接改为按 host:port 维护常驻已认证连接 + 命令串行队列 (断连/超时即弃、按需重建,签名不变)。 - TTS 缓存 LRU 淘汰。
sherpa-tts-server新增server.maxCacheEntries(默认 10000,0=不限), wav 缓存用链表 + 哈希迭代器实现 O(1) LRU,超限批量收敛至 90% 水位;活动读取受租约保护,磁盘删除失败进入重试。
- 每 cell 一个 FS 事件监听器 + Redis 租约。
知识库录音对话业务 + 坐席实时盯屏与人工介入。新增 callflow-esl 业务
kb-audio-chat-business(src/business/kb-audio-chat-business/):形态同ollama-chat-business(持续 ASR + 逐轮问答),客户话术通过 llm-chat-server 的 独立 conversation strategy 处理(契约见kb-client.ts:请求携带strategy, 先以action=start初始化,再以action=query逐轮问答),返回的answerText统一交给 callflow-esl TTS。业务配置统一迁入按稳定业务编码索引的config.json.businessConfig,本业务使用kb-audio-chat-business子项。 在此之上叠加实时盯屏基础设施(business/shared/live-session.ts):逐轮对话 片段即时 POST callout-server/api/call-progress(由callout.calloutServer.baseUrl构造), 会话注册进liveCallSessionRegistry,callflow-esl 新增POST /live-call-sessions/ :sessionKey/intervene接收介入信号,业务每秒轮询消费后带指定坐席走会议转人工 (human-transfer.ts//api/transfers/route新增可选agentId,走 reserveSpecificAgent 定向预占)。callout-server 新增内存态liveCallStore+ 关键词匹配:POST /api/call-progress接收上报、GET /api/live-calls快照、GET /api/live-calls/events多路复用 SSE、POST /api/live-calls/:callKey/intervene坐席认领(原子抢占,重复 409)。campaigns加列intent_keywords(意向关键词,命中客户话术推intent-alert),创建/更新 API 与前端任务表单同步,bun run db:push同步。callout-webpage 新增「实时盯屏」页 (pages/index/live-monitor.vue):网格多路通话卡片、滚动字幕、关键词高亮+提示音、 一键介入。实时上报写入 Redis 共享 TTL 快照并经 Pub/Sub 跨实例广播,不再提供内存实现;挂机后整段回写/api/call-results仍为权威。callout-server FS cell 配置形态(多 FS 池化第一步)。
config.json新增cells数组,每项描述 一台 FreeSWITCH + 配对 callflow-esl 实例(id/freeswitch/callflowEsl/media.freeswitchRecordingBaseUrl/maxConcurrency),cell 省略字段逐字段继承顶层默认值; 不配置cells时顶层freeswitch/callflowEsl/media自动包装成唯一defaultcell, 存量单 FS 部署零改动。本次只落配置结构、类型与兼容加载(含config.test.ts覆盖), 派发、事件监听等按 cell 路由的改造后续分批进行;运行时顶层字段暂为cells[0]镜像。 数据层同步加列:campaigns.cell_id(绑定 cell,空 = 自动分配;创建/更新 API 支持传cellId并校验须在 config.cells 中声明)、call_attempts.cell_id(派发时写入实际使用的 cell 快照),均带索引,bun run db:push同步。派发已按 cell 路由:每批次先选 cell (任务绑定优先,满载不换 cell;未绑定选剩余并发槽最多的),originate 的 ESL 连接与&socket回调地址均取选中 cell 配置,cells[].maxConcurrency成为任务/线路之外的 第三层并发上限(活跃数暂按 DB 统计,Redis 计数器为后续优化)。流程脚本
transfer转人工节点。callout-flow-business在start / send / collect / router / end之外 新增transfer节点:通过business/shared/human-transfer.ts调用 callout-serverPOST /api/transfers/route预占空闲坐席并把客户腿ctx.conference.join到transfer-<uuid>会议室,节点读通道变量callout_attempt_id一并回写。配置prompt/unavailable_prompt/ring_timeout_seconds/save_as:routed=true在此节点结束流程;routed=false播报unavailable_prompt并走默认出边兜底,无默认出边时自然结束。 节点类型在apps/callout-server/src/types/api.tsFlowNodeType与validation/scripts.ts同步放开。流程脚本 NLU 策略表与文档。新增
apps/callout-server/docs/flow-script-nlu-development.md, 约定collect.extract_profile/router.decision_profile是稳定接口 key、精确匹配不做回退、未注册返回 400, 并登记当前场景模板使用的 profile;与apps/llm-nlu-server/src/nlu-registry.ts一致。Ollama NLU 新增内置 profile。
decision新增service-satisfaction(售后满意度决策)、complaint-routing(投诉处理路由,含转人工分支);extract新增customer-profile(客户资料抽取)、appointment-confirm(预约回访确认)、service-feedback(售后反馈)、complaint-summary(投诉摘要), 并补handlers.test.ts覆盖。号码映射前端编辑。callflow-webpage 新增
number-mappings页面读写callflow.call_business_number_mappings, 与 callflow-server 号码映射接口配合,无需手工 SQL 插入即可维护「被叫号码 → 业务」路由。管理台外呼测试。callflow-server 新增外呼测试接口(经 callflow-esl
POST /outbound-calls发起),callflow-webpage 新增外呼测试页面,可从管理台直接对指定号码发起业务外呼验证链路。软电话自动注册开关。callflow-webpage 软电话页支持记住分机并在进入页面时自动注册, 减少演示与联调时的手工操作。
浏览器软电话演示脚本与演示文档。
deploy/softphone-test/start-chrome-softphone.ps1以受控参数 (--unsafely-treat-insecure-origin-as-secure+ 独立--user-data-dir)拉起 Chrome 打开 callflow / callout 软电话页,支持-PublicHost/-CallflowWebPort/-CalloutWebPort参数覆盖,默认指向公网演示环境,用户数据保存在同目录的chrome-user-data/且不会进入 Git 或源码发布包;新增docs/demo.md说明演示入口与注意事项。前端软电话 组件同步增加媒体环境检查(不安全源 / 无麦克风时给出明确提示而非静默失败)。ONNX 平台 Debian 12 构建镜像。新增
onnx-platform/Dockerfile.debian12,与既有 Ubuntu 22.04 / Debian 13 镜像并列;修复情绪分析服务 Linux 运行库安装,更新 Debian 12 构建文档。源码交付机制已由离线打包改为受控仓库访问。本阶段曾引入 Apps 与 ONNX 源码归档脚本及完整性校验, 该机制现已移除,不再通过 zip、tar 或其他离线源码包直接发送。现行交付通过 GitCode 私有仓库 成员或协作者机制受控访问,正式基线使用 tag,无法使用 tag 时记录完整 commit SHA;申请、 Git LFS、权限、许可与资产边界见源码仓库访问与授权。
变更与优化
移除仓库内的一体化与容器化部署实现。删除
deploy/ai-voice/下的部署产物装配、 Docker Compose、镜像构建和启停脚本;deploy/现在只保留config/服务配置样例与freeswitch/配置树,实际构建、依赖安装、进程托管、升级和回滚由部署方负责。文档一致性整备。
CLAUDE.md/AGENTS.md对齐 1.2.x 现状(补 llm-nlu-server、 语音网关、deploy/、docs/,修正 TTS 三段配置结构与服务数量);callflow-esl 文档补齐callout-flow-business、callout-review-form-business、browser-softphone-assist-business三个业务与redis/http-server.authToken配置说明,docs/新增导航页;callout-server 新增docs/softphone-sip.md(浏览器软电话/SIP 专题),README API 全表收敛为指向docs/api-reference.md的分组导航,api-reference 补流程脚本与软电话两组接口,integration.md补script_id接线契约;onnx 三份 README 的 Docker / 发布打包重复段 下沉到onnx-platform/README.md,stability-test.md基线数字与当前配置对齐;根 README 文档索引与release-and-upgrade.md开发期清单去重(各保留单一事实源);移除空文件dev-prompt.md;两个云语音网关config.json的明文凭据置空(历史提交中已出现过的 密钥应轮换,运行时改用环境变量注入)。callflow-server 模块结构重组。源码拆分为
clients//handlers//services//db/, 新增runtime-config.ts、request-body.ts、proxy-helpers.ts等,运行时配置、ESL 代理与表数据查询分层更清晰。callout-server 源码目录结构重组。拆为
app//handlers//services//freeswitch//validation//shared//types/,处理器与校验模块按职责归位。全局软电话与坐席通话台完善。callflow-esl / callout-server 软电话会话、坐席通话记录接口、坐席通话台界面、 软电话线路快照与状态提示等在 1.2.0 基线上继续完善,外呼管理与呼叫流程管理台界面同步调整。
外呼与呼叫流程管理台界面优化,号码映射、流程脚本等页面体验细化。
callout-webpage 浏览器软电话收敛为共享实例。
useSipSoftphone重构为「注册键(分机@realm|WS 地址)→ 共享实例 + 引用计数」注册表:全局弹窗与软电话页面 / 坐席通话台展示同一分机时复用同一个 JsSIP UA, 注册与通话状态天然同步,替代原先「后注册者报错互斥」的方案(坐席进入软电话页面不再看到自己分机 「注册失败」);主管代理注册的其它坐席分机各占一个实例互不影响。远端音频改由实例自持的游离 audio 元素播放,各组件移除自带<audio>。该保护仅覆盖单标签页,跨标签页 / 跨设备重复注册仍由 FreeSWITCH AoR 策略决定。部署配置参考更新。服务配置样例迁移到
deploy/config/,FreeSWITCH 配置保留在deploy/freeswitch/;录音媒体访问地址等配置同步校准。知识库对话业务人工介入后双方持续转写 + 每轮应答必播。
kb-audio-chat-business介入成功(坐席入会)后,客户腿单呼 ASR 切换为会议级转写(conference.hear),坐席 (speaker=agent)与客户的发言持续写 transcript 实时上报盯屏并随结果落库;介入失败 自动回滚重启单呼 ASR。实时进度链路(callflow-esllive-session/ callout-server/api/call-progress/ 盯屏页)segmentspeaker新增agent取值。知识库每轮返回的 录音改为经串行门排队按序播放,客户连说多句时不再作废后到的应答。实时盯屏页改版。页头/统计条统一到管理台设计语言(
CalloutPageHeader+ 状态 chip);按当前用户监控容量渲染「空闲监控位」预占位卡片,无通话时也可预览监控规模; 通话卡片重排(时长徽标、意向命中行、灰底字幕区,坐席/客户/AI 分色);意向关键词命中 通知附任务名与「介入」快捷动作,按关键词去重防刷屏,命中卡片边框脉冲高亮;提示音 偏好本地持久化。实时盯屏操作与介入控制增强。盯屏分配与操作接口细化(按监控容量分配、只读展示模式), 支持介入取消与挂断控制,完善客户挂机后的转人工收尾;运营监控连接状态展示统一。
外呼任务启动与完成边界完善。任务启动 / 完成判定的边界条件收敛,外呼批次支持并行提交 与计数校准,避免批次统计漂移。
坐席电话与状态管理统一。callout-server 路由重构,坐席电话(呼出 / 回拨 / 转人工)与 坐席状态管理接口归并统一。
通话录音表格播放交互优化。呼叫明细 / 任务详情表格内嵌录音播放组件,播放体验统一。
修复坐席软电话早媒体播放。坐席侧呼出时回铃早媒体不再静音,接通前可听到回铃音。
前端基础依赖升级。两个 Quasar 前端的基础依赖统一升级。
移除
- 移除仓库内的一体化与容器化部署实现(见上文「变更与优化」首条):
deploy/ai-voice部署产物装配、Docker Compose、镜像构建与启停脚本不再提供。 - 下线重复的代拨号演示业务,内置业务列表以
apps/callflow-esl/docs/existing-businesses.md为准(当前 22 个)。 - 移除旧迁移辅助脚本:
scripts/migrations/drop-legacy-import-jobs.sql(等效 SQL 见下方 升级提示)与scripts/prepare-agent-phone-extensions.ts(agents.sipUsername→phoneExtension迁移已完成)。 - 移除 callflow-server 闲置媒体配置。
升级提示(1.2.0 → 1.3.0)
先备好 Redis(必选)。callflow-esl 移除
config.json的redis.enabled,callout-server 的 cell 监听租约、盯屏快照与广播同样依赖 Redis;缺配置或连不上时服务在启动期报错退出, 不再提供进程内降级。升级前先部署可用 Redis 并在两个服务的配置中填好连接信息。数据库 schema 同步。
bun run db:push同步新增列:agents.cell_id、conference_sessions.cell_id、campaigns.cell_id/campaigns.intent_keywords、call_attempts.cell_id等(均带索引)。号码导入 Breaking。必须在维护窗口停止或摘流全部旧 callout-server 实例、备份数据库后, 手工执行以下 SQL 永久删除三张旧导入历史表,确认删除后再部署新后端与前端;回退必须先从 备份恢复三张表:
sqlDROP TABLE IF EXISTS "callout"."import_job_errors"; DROP TABLE IF EXISTS "callout"."import_job_rows"; DROP TABLE IF EXISTS "callout"."import_jobs";cell 配置兼容。不配置
cells时,顶层freeswitch/callflowEsl/media自动包装成 唯一defaultcell,存量单 FS 部署零改动;多 FS 部署需在config.cells逐台声明并规划maxConcurrency与坐席归属。一体化部署包已移除。原
deploy:build:*/deploy:start:*/deploy:stop:*脚本不再 存在,升级方式改为按组件构建 +deploy/config/、deploy/freeswitch/配置样例 + 部署方自管进程托管。流程脚本
transfer节点:旧脚本不含该节点,运行时识别start/send/collect/router/end/transfer,存量脚本不受影响。Ollama NLU 新增 profile 需重启
llm-nlu-server生效,可通过GET /api/v1/nlu/capabilities确认。
1.2.0
功能交付增强版,在 1.1.0(7b1d56c)之上累积。
| 项 | 值 |
|---|---|
| 版本 | 1.2.0 |
| 发布日期 | 2026-07-06 |
| 源码版本(最后一次提交) | d79460df3de3202426b8098caa3789941909c31e(短 d79460d) |
| 上一版本 | 1.1.0(7b1d56c,2026-06-27) |
| 累计提交数 | 195 |
用户可见的关键变更:浏览器软电话、坐席通话台、流程脚本管理与可视化编排、
callout-flow-business、回访表单收集业务、Ollama NLU 统一服务、一体化部署包、 Windows / Linux 构建与启停脚本、外呼媒体配置接口、短文件名媒体返回和情绪分析音频链路增强。
新增
- 新增浏览器软电话会话能力:
browser-softphone-assist-business、browser-softphone-session-hub、 callout-server/api/softphone-sessions/*代理、agent_call_records记录表,以及前端坐席通话台、 坐席通话记录、实时转写、备注、控制与结束会话能力。 - 新增流程脚本管理与可视化编排:callout-server
scripts表、/api/v1/scripts、/api/v1/scripts/:id/runtime,callout-webpage 流程脚本页面,以及 callflow-eslcallout-flow-business通用外呼流程业务。 - 新增外呼回访表单收集业务
callout-review-form-business,结合 NLU 抽取字段、维护表单状态, 并把回访结果回写到外呼尝试记录。 apps/llm-nlu-server已纳入根目录默认bun run dev并发组,默认监听9930, 提供GET /health、GET /api/v1/nlu/capabilities与POST /api/v1/nlu。- 新增
deploy/ai-voice一体化部署包脚本与配置模板:deploy:build:win、deploy:build:linux、deploy:build:all,deploy:start:*、deploy:stop:*。 - 新增
bun run onnx:build:linux,用于在 Linux x64 上依次构建 TTS、ASR 与情绪分析 C++ 服务。 callout-server新增GET /api/media/config,向前端下发录音和情绪复核音频播放 baseUrl。
变更
- 外呼录音字段按短文件名保存与返回;前端通过
media.freeswitchRecordingBaseUrl拼接完整播放 URL。 - 情绪分析复核音频同样按短文件名 / 短路径返回;前端通过
media.emotionAudioBaseUrl拼接播放 URL。 - emotion-analysis-server 新增客户声道选择、声道角色与静音过滤等音频链路配置,默认可分析客户声道, 减少坐席声音对客户情绪判断的干扰。
- 部署文档补充部署包目录结构、配置模板、Windows / Linux 启停流程、健康检查顺序与常见排障。
移除
- 移除当前能力中的外呼结果模板接口:
result_schemas与/api/result-schemas不再作为新部署集成点。 - 移除当前能力中的外呼媒体资产接口:
media_assets与/api/media-assets不再作为媒体管理链路。
升级提示
- 从 1.1.0 升级时需要同步数据库 schema,新增
scripts、agent_call_records等表。 - 旧媒体资产 / 结果模板依赖需要迁移:录音直接随 call attempt 保存短文件名,通话结果继续使用
intentLevel、intentCategory、resultSchemaCode与businessResult保存业务含义。 - 前端播放录音和情绪复核音频时,不再假定业务字段是完整 URL;需先读取
GET /api/media/config, 再用对应 baseUrl 与短文件名拼接浏览器可访问地址。
1.1.0
功能增强版,在 1.0.0(a5cd832)之上累积。
| 项 | 值 |
|---|---|
| 版本 | 1.1.0 |
| 发布日期 | 2026-06-27 |
| 源码版本(最后一次提交) | 7b1d56c09ddb1d469607ddc0e0ccf59ff62a1e91(短 7b1d56c) |
| 上一版本 | 1.0.0(a5cd832,2026-06-21) |
| 累计提交数 | 147 |
用户可见的关键变更:新增 Azure Speech 兼容语音网关、callflow-esl 独立可执行文件构建与优雅关停、
callHear挂机后尾部识别收集、verification-code-business验证码识别上报业务,以及阿里云 / Azure 语音网关 ASR 会话收尾修复。
打断(barge-in):为什么把停播从 uuid_break 改用 uuid_fileman
打断时如何停掉当前播放,是最容易被问到的一点,单独说明。该切换在 1.0 期间的「打断逻辑优化」 (提交
312574a)中完成,本版沿用未改。
打断时停止当前 TTS 播放,原先使用 uuid_break,已改为首选 api uuid_fileman <uuid> stop (uuid_break 降级为兜底回退)。原因:
uuid_break <uuid>会打断整个通道读流:它在停掉 TTS 播放的同时,会把通道上正在采集的 尾音(mod_audio_fork的 ASR 流、uuid_record录音)一并截断。而 barge-in 恰恰是“用户开口、 要立刻停播并继续听用户说”的时刻,此时必须保住 ASR 采集流,否则刚打断就丢掉用户开头那句话。- 改用
uuid_fileman <uuid> stop后,只结束当前 playback 的文件句柄、不动通道读流——停的是 “嘴”(TTS 播放),留的是“耳朵”(ASR 采集 / 录音),正是 barge-in 想要的语义。 uuid_break仍作为兜底回退保留:当uuid_fileman被 FreeSWITCH 以非幂等错误拒绝时, 才回退一次api uuid_break <uuid>,保证即便首选命令失败也能恢复打断 (见BARGE_IN_STOP_COMMAND/BARGE_IN_FALLBACK_STOP_COMMAND)。
新增
- 新增
apps/azure-speech-gateway:Bun + TypeScript Azure Speech ASR/TTS 兼容网关,默认 ASR10098、TTS9082,接口形态兼容callflow-esl、mod_audio_fork和管理台测试代理;支持 Windows / Linux x64 独立可执行文件构建,Azure 凭据可通过AZURE_SPEECH_KEY/AZURE_SPEECH_REGION/AZURE_SPEECH_TTS_ENDPOINT注入,asr.autoDetectLanguages支持多语言自动识别。 apps/callflow-esl支持 Bun--compile构建 Windows / Linux x64 独立可执行文件,运行时可通过同目录config.json或CALLFLOW_ESL_CONFIG_PATH加载配置。apps/callflow-esl完善服务优雅关停:捕获SIGINT/SIGTERM后停止接收新连接,并行关闭 HTTP server、会议协调器与数据库连接池,5 秒超时兜底强制退出(退出码130/143)。apps/callflow-eslcallHear新增「挂机后尾部识别收集」:入参postHangupDrainMs开启 drain 窗口,配套onPostHangupResult/onPostHangupFinal回调与事件phase(live/post-hangup),避免对端挂机瞬间丢失最后一段 final 识别。apps/callflow-esl新增verification-code-business(文件夹模块):接通后整通持续 ASR,识别到「请按 X / press X」提示时自动回拨对应 DTMF(中英文数字、串行去重、失败重试),挂机后 drain 尾部识别,最终打印主被叫与识别结果并按 x-www-form-urlencoded 表单上报到外部接口(上报失败仅记日志、重试,不影响通话收尾)。- 历史上曾新增按模块生成离线源码归档的工程脚本;该机制后续已废弃并移除,现行方式见 源码仓库访问与授权。
变更
apps/aliyun-speech-gateway增强 ASR 启动期音频队列上限、启动超时和 TTS 请求超时控制,补齐 WAV / MP3 并发缓存写入保护。
修复
- 修复
apps/aliyun-speech-gateway与apps/azure-speech-gatewayASR 会话收尾:零长度 flush 时先关闭云端识别会话、把close()期间补发的尾部 final 结果下发给客户端,再关闭 WebSocket,避免丢失最后一段识别;错误回调改为结构化错误(携带 statusCode / taskId / errorCode 等),并新增src/asr-server.test.ts覆盖收尾时序与会话计数。
1.0.0
正式发布版。
| 项 | 值 |
|---|---|
| 版本 | 1.0.0 |
| 发布日期 | 2026-06-21 |
| 源码版本(最后一次提交) | a5cd8323eaadb96b4af73ffa229e1db27be2d082(短 a5cd832) |
| 最后一次提交说明 | 调整 ASR 服务 VAD 模型路径解析 |
| 提交作者 | wlf213 |
| 首次提交 | 1aa0eaa(2026-05-02) |
| 累计提交数 | 129 |
仓库当前未打 git tag,1.0.0 以本发布说明记录的提交
a5cd832为基准。后续编写更新日志时, 请以本提交 ID 为锚点,按下面「显著变更」与 git log 逐条整理。
版本定位
AI Voice Platform 是一套本地化、可商用、组件化的 FreeSWITCH × AI 语音方案:ASR 走 mod_audio_fork 把 16kHz 单声道 PCM16 流式推到 WebSocket ASR 服务;TTS 由本地 HTTP TTS 服务 生成 wav 或 MP3 流,再交给 FreeSWITCH playback 播放。已彻底移除 mod_unimrcp, 识别链路只走 mod_audio_fork + sherpa-asr-online-server。
1.0 已稳定可用
- FreeSWITCH ×
mod_audio_fork× sherpa-onnx 全链路打通 - 流式 ASR(默认中文 int8 zipformer,可切中英双语预设)+ silero-vad
- 离线 TTS(默认 vits-zh-ll,可切 Kokoro 中英双语多音色 / Matcha / VITS),支持普通合成 +
POST /tts-stream边合成边播的流式链路(依赖ffmpeg+mod_shout) - 业务编排(callflow-esl)覆盖呼入 / 呼出 / 桥接 / 会议 / 录音 / DTMF,内置 18 个业务 (17 个 demo + 1 个接本地 Ollama 大模型的真实语音对话业务
ollama-chat-business) - 智能外呼子系统(callout-server / callout-webpage):活动 / 名单 / 批次调度 / 并发与工作时段 / 自动重试 / 可选回铃音 + 嘟声检测 / 外呼策略中心 / DNC 免打扰 / 角色鉴权 / 坐席工作台 / 转人工会议(盲转 · 协商转 · 主管监听/插话)/ 线路号码池 / 实时作战大屏
- 通话后情绪分析(emotion-analysis-server):文本 BERT + 音频 wav2vec2 融合,外呼可按客户情绪筛选线索
- 管理控制台(callflow-server / callflow-webpage):FreeSWITCH 数据看板、号码 → 业务路由配置、 运行时 TTS / 录音配置热重载、TTS 音色试听、ASR 上传 / 录音测试
- 单机部署 → 单节点 application host → 多节点水平扩展
1.0 已知局限
| 局限 | 影响 |
|---|---|
| ASR / TTS(C++ 服务)无 graceful shutdown | Ctrl+C / SIGTERM 直接终止 accept 与 worker,会中断在途请求与连接(callflow-esl 已在 1.1.0 支持优雅关停) |
无鉴权、无限流(除 maxSessions / maxQueuedRequests / maxActiveStreams) | 仅适合内网部署;外网入口必须加反代鉴权 / 限流 |
| TTS 服务无 LRU / TTL | wav 文件持续累积,需外部定时清理(1.3.0 起支持 server.maxCacheEntries LRU 淘汰,磁盘清理仍建议保留兜底) |
| ASR 仅支持 16kHz / mono / PCM16 | 上游必须重采样 / 调声道;不支持 WebSocket 帧分片 |
流式 TTS 依赖外部 ffmpeg | 需 mp3.encoderPath 对应的可执行可用,且 FS 端启用 mod_shout |
| 业务侧无全局 KV | 跨通话状态共享只能靠 DB / channel variable |
ctx.conference.hear 必须绑定当前通道 | 无法实现「AI 不入会、只听」 |
| PostgreSQL 强依赖 | 业务路由表与运行时配置当前依赖 PostgreSQL;暂未抽象多数据库 |
1.0 不在范围内
- 通话级实时翻译
- 声纹识别 / 说话人分割
- 实时(通话中)情绪分析(通话后的离线情绪分析已支持)
- 多模态(视频 / 屏幕共享)
- WebRTC 直接接入、浏览器端 SDK
子系统与默认端口
| 子系统 | 路径 | 默认端口 |
|---|---|---|
| callflow-esl | apps/callflow-esl | ESL 9911,HTTP 9912 |
| callflow-server | apps/callflow-server | 9913 |
| callflow-webpage | apps/callflow-webpage | dev 19913 |
| callout-server | apps/callout-server | 9920 |
| callout-webpage | apps/callout-webpage | dev 19920 |
| aliyun-speech-gateway(可选) | apps/aliyun-speech-gateway | ASR 10097,TTS 9081 |
| ASR 服务 | onnx-platform/sherpa-asr-online-server | 10096 |
| TTS 服务 | onnx-platform/sherpa-tts-server | 9080 |
| 情绪分析服务 | onnx-platform/emotion-analysis-server | 9090 |
显著变更(更新日志依据)
本节按子系统归纳 1.0 形成过程中的关键变更,供后续编写 CHANGELOG 时筛选条目。条目来源为 git log,时间区间 2026-05-02(首次提交)至 2026-06-21(a5cd832)。
ASR 服务(sherpa-asr-online-server)
- ASR 配置重构为按域分组:
server/concurrency/socket/logging/recording/asr/vad;模型选择改为asr.activeModel+asr.modelsprofile 表 - VAD 模型路径解析调整为相对
onnx-platform/models/解析,绝对路径原样使用;VAD 强制启用、无开关 - endpoint 检测字段从配置中移除,统一走 sherpa 默认
- ASR 推送
speech_started事件,支持begin-speaking打断 - 修复 ASR 仅支持单路通话的问题;ASR 插件配置更新;性能调优
TTS 服务(sherpa-tts-server)
- TTS 配置重构为按域分组:
server/concurrency/timeouts/transport/mp3/tts;模型选择改为tts.activeModel+tts.modelsprofile 表 - 新增
POST /tts-stream+GET /tts-stream/<id>.mp3流式播放链路(ffmpeg 实时 PCM→MP3), 降低首字延迟;流式与缓存共用同一套 MP3 编码参数 - 并行预热 worker 池,缩短启动耗时
- wav2mp3 增加响度增益(
mp3.volumeGainDb,正增益启用 limiter 降削波) - 流式稳定性兜底:ffmpeg 退出超时回收、流式总时长 watchdog、
maxActiveStreams并发限流、 socket 读写超时;15 路通话稳定性验证无异常
情绪分析服务(emotion-analysis-server)
- 文本 BERT + 音频 wav2vec2 融合,结果归一为极性 + 0–100 分;直接调用 ONNX Runtime,不依赖 sherpa-onnx
- 供 callout-server 通话后情绪分析 worker 调用,外呼可按客户情绪筛选线索
callflow-esl(业务编排)
- 重构 ESL 运行时模块:控制器拆分到
runtime/controllers/、会议会控拆到runtime/conference/、 originate / 回铃检测拆到runtime/originate/,并新增runtime/kernel//runtime/transport//runtime/tts/分层 CallContextfacade 能力扩展:api、stopCallHear、setVariables/getVariables, 会议会控getState/onStateChange/kickMember/mute/unmute/deaf/undeaf/lock/unlock/end/inviteMembers/setMemberRole,会议录音recording.*- TTS 段重构为
tts.defaults+tts.use+tts.profiles三段结构,流式与否改由use.call/use.conference选wav/shoutprofile 决定 - 打断(barge-in)支持
vad/begin-speaking/final三种触发模式;callHear的 begin-speaking 打断在事件过滤前判定;会议级play/injectSpeak支持配置 barge-in 触发模式 - 新增实时 WebSocket 语音识别客户端、播放控制器以及通话运行时测试套件
- 新增
ollama-chat-business:接本地 Ollama/api/chat流式接口的真实大模型语音对话业务 (ASR → 本地 LLM → TTS 闭环,每通电话独立多轮上下文),与原有「模拟 LLM」演示业务并存 callHear长识别支持;会议相关状态使用 redis 同步;通话录音功能- 移除 callflow / 阿里云 ASR endpoint 标记
callout-server / callout-webpage(智能外呼)
- 外呼任务 / 联系人 / 批次调度 / 两层并发(活动
maxConcurrency+ 共享线路maxConcurrency)- Redis 锁(跨实例)+ PostgreSQL
FOR UPDATE SKIP LOCKED(最终一致性)
- Redis 锁(跨实例)+ PostgreSQL
- 回铃音 + 嘟声检测(嘟声检测依赖 FreeSWITCH
mod_spandsp);外呼策略中心 / DNC 免打扰 - 坐席工作台与转人工会议(盲转 / 协商转 / 主管监听强插);线路号码池;实时作战大屏
- 拆分外呼服务处理器与校验模块;
originateDialStringTemplate/dialStringTemplate可覆盖配置 - callout-webpage 从单体 god store 拆分为「共享 reference store + 页面级 composable」
callflow-server / callflow-webpage(管理控制台)
- FreeSWITCH 数据看板、号码 → 业务路由配置、运行时 TTS / 录音配置热重载
- TTS 音色试听、ASR 上传 / 录音测试
底座与工程
- 彻底移除
mod_unimrcp,识别链路只走mod_audio_fork+sherpa-asr-online-server - 数据库改用 PostgreSQL(callflow / callout 两 schema,Drizzle ORM,
db:push直推无 migration 目录) - 配置项重构;配置热重载修复
- 项目中不再包含 FreeSWITCH 容器部署相关内容
- 底座与工程侧历史上曾支持按模块生成离线源码归档;该机制现已废弃,现行方式见 源码仓库访问与授权。
源码交付机制(历史说明)
1.0 发布时曾采用按模块授权与离线源码归档。该机制后续已废弃并移除,当前不再生成或直接发送 源码 zip/tar,统一通过 GitCode 私有仓库成员或协作者机制受控访问。仓库访问不等于再分发许可; 现行的申请审批、版本基线、Git LFS、权限撤销、许可及资产边界见 源码仓库访问与授权。
后续更新日志编写说明
本发布说明以提交 a5cd832 作为 1.0.0 的源码版本锚点。编写正式 CHANGELOG 时:
- 以
git log 1aa0eaa..a5cd832为素材池,按上面「显著变更」分类逐条筛选 - 保持「新增 / 变更 / 修复 / 移除」分类,遵循 Keep a Changelog 风格
- 用户可见的行为变更(配置结构、API、端口、业务编码)必须单独高亮,提示从旧版迁移的注意点
- 下一个版本(1.1.x)起,CHANGELOG 应在
a5cd832之上增量记录