外观
发布说明(Release Notes)
本文件记录 AI Voice Platform 的版本发布信息,并为后续编写更新日志(CHANGELOG)提供依据。 如发现文档与代码不一致,以代码为准。
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 构建文档。源码交付脚本整理。
scripts/package-release.ps1自动把 Apps 项目与 ONNX 服务拆成独立 发布包(Apps 包顶层目录用包名、ONNX 包顶层固定onnx-platform/,装配说明见docs/release-package-assembly.md);Apps 包按项目加入完整文档、部署配置、FreeSWITCH/coturn 参考与软电话演示资产,ONNX 包补齐三份 Linux Dockerfile 与.gitignore。新增 Catalog 完整性检查、必需路径严格失败、包内逐文件 SHA-256、包外归档 SHA-256 和压缩后解包验证; 不要求 Git 工作区 clean,非 Git 目录也可生成源码包。FreeSWITCH 两份 PEM 原样保留但在清单中明确为禁止生产复用的样例证书。脚本仍只交付源码,不增加预构建模式, 并移除内置的「项目数 × ¥500」计费说明,实际商务报价与交付范围以合同为准。
变更与优化
移除仓库内的一体化与容器化部署实现。删除
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 表单上报到外部接口(上报失败仅记日志、重试,不影响通话收尾)。scripts/package-release.ps1改为只按项目打包:-Projects支持单项目 / 组合打包(覆盖全部应用与asr/tts/emotion等 ONNX 服务代号),按「项目数 × ¥500」计价、前后端算一个项目;移除旧-Edition累进档位。
变更
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 容器部署相关内容
- 源码按项目出售:
scripts/package-release.ps1支持-Projects按项目独立 / 组合打包, 按「项目数 × ¥500」计价(前后端算一个项目)
源码交付
1.0 源码交付按模块授权,可根据项目需要组合购买;scripts/package-release.ps1 当前提供常用组合包打包能力(默认 zip,可选 tar.gz),实际商务报价与交付范围以合同为准。
| 模块 | 交付内容 | 说明 |
|---|---|---|
| ESL 业务编排服务 | apps/callflow-esl | FreeSWITCH outbound ESL 接入、业务编排、示例业务、呼入 / 呼出 / 桥接 / 会议 / 录音 / DTMF 等能力 |
| 本地 AI 语音能力 | onnx-platform | 本地 ASR / TTS / 情绪分析 C++ 服务、模型配置、sherpa-onnx / ONNX Runtime 集成 |
| 运营后台 | apps/callflow-server / apps/callflow-webpage | FreeSWITCH 数据查看、号码路由配置、运行时 TTS / 录音配置、TTS 音色试听、ASR 上传 / 录音测试 |
| 外呼系统 | apps/callout-server / apps/callout-webpage | 外呼活动、名单、批次调度、策略、DNC、坐席、转人工会议、线路号码池、实时作战大屏等 |
| FreeSWITCH 安装配置 | 部署文档 / 现场配置 / 联调服务 | FreeSWITCH、mod_audio_fork、mod_shout、网关、拨号计划等安装配置与联调,通常作为交付服务计费 |
| 私有化全量交付 | 全量源码 + 内部开发文档 | 面向私有化部署、二次开发、培训、验收和定制交付 |
当前打包脚本内置 basic / ai / backend / callout / full 常用组合。 这些组合用于快速生成交付包,不限制实际按模块组合授权或报价。
低价引流源码授权建议档位如下;系统二按完整外呼经营系统计价,不按“系统一上增加 callout 前后端页面”计价:
| 套餐 | 交付口径 | 低价引流源码授权价 |
|---|---|---|
| 系统一云语音接入版 | AI 语音通话底座 + 云端 ASR/TTS 兼容网关接入 | ¥1200 |
| 系统一本地私有化版 | AI 语音通话底座 + 本地 ASR/TTS 模型服务 | ¥1800 |
| 系统二云语音外呼版 | 外呼调度 + 流程脚本 + 云语音 + Ollama NLU + 坐席协同 / 转人工 | ¥2800 |
| 系统二全能私有化版 | 系统一本地能力 + 系统二完整外呼协同 + 情绪分析 + 质检闭环 | ¥3800 |
以上为低价引流源码授权价,不含云服务费、SIP 线路、服务器、实施、定制流程、 模型调优和运维;FreeSWITCH / mod_audio_fork 安装配置与联调仍作为交付服务单独确认。
后续更新日志编写说明
本发布说明以提交 a5cd832 作为 1.0.0 的源码版本锚点。编写正式 CHANGELOG 时:
- 以
git log 1aa0eaa..a5cd832为素材池,按上面「显著变更」分类逐条筛选 - 保持「新增 / 变更 / 修复 / 移除」分类,遵循 Keep a Changelog 风格
- 用户可见的行为变更(配置结构、API、端口、业务编码)必须单独高亮,提示从旧版迁移的注意点
- 下一个版本(1.1.x)起,CHANGELOG 应在
a5cd832之上增量记录