跳到正文

发布说明(Release Notes)

本文件记录 AI Voice Platform 的版本发布信息,并为后续编写更新日志(CHANGELOG)提供依据。 如发现文档与代码不一致,以代码为准。

1.3.0

多实例扩展与实时协同版,在 1.2.0(d79460d)之上累积。

版本1.3.0
发布日期2026-07-16
源码版本(最后一次提交)7c17d589f650de03ac9f3a79ba0449bc95453fa2(短 7c17d58
上一版本1.2.0d79460d,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.tscallout:esl-listener:{cellId} SET NX PX + 心跳续期),多实例部署时每台 FS 只有一个消费者,持有实例崩溃后租约到期自动接管, Redis 为必选依赖,不再提供本地全量持有降级。
    • 坐席 cell 归属 + 同 cell 转人工约束agents 加列 cell_id(注册对账 worker 按各 cell show 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.tscallout: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.jsonredis.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% 水位;活动读取受租约保护,磁盘删除失败进入重试。
  • 知识库录音对话业务 + 坐席实时盯屏与人工介入。新增 callflow-esl 业务 kb-audio-chat-businesssrc/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 自动包装成唯一 default cell, 存量单 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-businessstart / send / collect / router / end 之外 新增 transfer 节点:通过 business/shared/human-transfer.ts 调用 callout-server POST /api/transfers/route 预占空闲坐席并把客户腿 ctx.conference.jointransfer-<uuid> 会议室,节点读通道变量 callout_attempt_id 一并回写。配置 prompt / unavailable_prompt / ring_timeout_seconds / save_asrouted=true 在此节点结束流程;routed=false 播报 unavailable_prompt 并走默认出边兜底,无默认出边时自然结束。 节点类型在 apps/callout-server/src/types/api.ts FlowNodeTypevalidation/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 新增内置 profiledecision 新增 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-businesscallout-review-form-businessbrowser-softphone-assist-business 三个业务与 redis / http-server.authToken 配置说明,docs/ 新增导航页;callout-server 新增 docs/softphone-sip.md(浏览器软电话/SIP 专题),README API 全表收敛为指向 docs/api-reference.md 的分组导航,api-reference 补流程脚本与软电话两组接口, integration.mdscript_id 接线契约;onnx 三份 README 的 Docker / 发布打包重复段 下沉到 onnx-platform/README.mdstability-test.md 基线数字与当前配置对齐;根 README 文档索引与 release-and-upgrade.md 开发期清单去重(各保留单一事实源);移除空文件 dev-prompt.md;两个云语音网关 config.json 的明文凭据置空(历史提交中已出现过的 密钥应轮换,运行时改用环境变量注入)。

  • callflow-server 模块结构重组。源码拆分为 clients/ / handlers/ / services/ / db/, 新增 runtime-config.tsrequest-body.tsproxy-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-esl live-session / callout-server /api/call-progress / 盯屏页)segment speaker 新增 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.tsagents.sipUsernamephoneExtension 迁移已完成)。
  • 移除 callflow-server 闲置媒体配置

升级提示(1.2.0 → 1.3.0)

  1. 先备好 Redis(必选)。callflow-esl 移除 config.jsonredis.enabled,callout-server 的 cell 监听租约、盯屏快照与广播同样依赖 Redis;缺配置或连不上时服务在启动期报错退出, 不再提供进程内降级。升级前先部署可用 Redis 并在两个服务的配置中填好连接信息。

  2. 数据库 schema 同步bun run db:push 同步新增列:agents.cell_idconference_sessions.cell_idcampaigns.cell_id / campaigns.intent_keywordscall_attempts.cell_id 等(均带索引)。

  3. 号码导入 Breaking。必须在维护窗口停止或摘流全部旧 callout-server 实例、备份数据库后, 手工执行以下 SQL 永久删除三张旧导入历史表,确认删除后再部署新后端与前端;回退必须先从 备份恢复三张表:

    sql
    DROP TABLE IF EXISTS "callout"."import_job_errors";
    DROP TABLE IF EXISTS "callout"."import_job_rows";
    DROP TABLE IF EXISTS "callout"."import_jobs";
  4. cell 配置兼容。不配置 cells 时,顶层 freeswitch / callflowEsl / media 自动包装成 唯一 default cell,存量单 FS 部署零改动;多 FS 部署需在 config.cells 逐台声明并规划 maxConcurrency 与坐席归属。

  5. 一体化部署包已移除。原 deploy:build:* / deploy:start:* / deploy:stop:* 脚本不再 存在,升级方式改为按组件构建 + deploy/config/deploy/freeswitch/ 配置样例 + 部署方自管进程托管。

  6. 流程脚本 transfer 节点:旧脚本不含该节点,运行时识别 start/send/collect/router/end/transfer,存量脚本不受影响。

  7. 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.07b1d56c,2026-06-27)
累计提交数195

用户可见的关键变更:浏览器软电话、坐席通话台、流程脚本管理与可视化编排、 callout-flow-business、回访表单收集业务、Ollama NLU 统一服务、一体化部署包、 Windows / Linux 构建与启停脚本、外呼媒体配置接口、短文件名媒体返回和情绪分析音频链路增强。

新增

  • 新增浏览器软电话会话能力:browser-softphone-assist-businessbrowser-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-esl callout-flow-business 通用外呼流程业务。
  • 新增外呼回访表单收集业务 callout-review-form-business,结合 NLU 抽取字段、维护表单状态, 并把回访结果回写到外呼尝试记录。
  • apps/llm-nlu-server 已纳入根目录默认 bun run dev 并发组,默认监听 9930, 提供 GET /healthGET /api/v1/nlu/capabilitiesPOST /api/v1/nlu
  • 新增 deploy/ai-voice 一体化部署包脚本与配置模板: deploy:build:windeploy:build:linuxdeploy:build:alldeploy: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,新增 scriptsagent_call_records 等表。
  • 旧媒体资产 / 结果模板依赖需要迁移:录音直接随 call attempt 保存短文件名,通话结果继续使用 intentLevelintentCategoryresultSchemaCodebusinessResult 保存业务含义。
  • 前端播放录音和情绪复核音频时,不再假定业务字段是完整 URL;需先读取 GET /api/media/config, 再用对应 baseUrl 与短文件名拼接浏览器可访问地址。

1.1.0

功能增强版,在 1.0.0(a5cd832)之上累积。

版本1.1.0
发布日期2026-06-27
源码版本(最后一次提交)7b1d56c09ddb1d469607ddc0e0ccf59ff62a1e91(短 7b1d56c
上一版本1.0.0a5cd832,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> stopuuid_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 兼容网关,默认 ASR 10098、TTS 9082,接口形态兼容 callflow-eslmod_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.jsonCALLFLOW_ESL_CONFIG_PATH 加载配置。
  • apps/callflow-esl 完善服务优雅关停:捕获 SIGINT / SIGTERM 后停止接收新连接,并行关闭 HTTP server、会议协调器与数据库连接池,5 秒超时兜底强制退出(退出码 130 / 143)。
  • apps/callflow-esl callHear 新增「挂机后尾部识别收集」:入参 postHangupDrainMs 开启 drain 窗口,配套 onPostHangupResult / onPostHangupFinal 回调与事件 phaselive / 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-gatewayapps/azure-speech-gateway ASR 会话收尾:零长度 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 shutdownCtrl+C / SIGTERM 直接终止 accept 与 worker,会中断在途请求与连接(callflow-esl 已在 1.1.0 支持优雅关停)
无鉴权、无限流(除 maxSessions / maxQueuedRequests / maxActiveStreams仅适合内网部署;外网入口必须加反代鉴权 / 限流
TTS 服务无 LRU / TTLwav 文件持续累积,需外部定时清理(1.3.0 起支持 server.maxCacheEntries LRU 淘汰,磁盘清理仍建议保留兜底)
ASR 仅支持 16kHz / mono / PCM16上游必须重采样 / 调声道;不支持 WebSocket 帧分片
流式 TTS 依赖外部 ffmpegmp3.encoderPath 对应的可执行可用,且 FS 端启用 mod_shout
业务侧无全局 KV跨通话状态共享只能靠 DB / channel variable
ctx.conference.hear 必须绑定当前通道无法实现「AI 不入会、只听」
PostgreSQL 强依赖业务路由表与运行时配置当前依赖 PostgreSQL;暂未抽象多数据库

1.0 不在范围内

  • 通话级实时翻译
  • 声纹识别 / 说话人分割
  • 实时(通话中)情绪分析(通话的离线情绪分析已支持)
  • 多模态(视频 / 屏幕共享)
  • WebRTC 直接接入、浏览器端 SDK

子系统与默认端口

子系统路径默认端口
callflow-eslapps/callflow-eslESL 9911,HTTP 9912
callflow-serverapps/callflow-server9913
callflow-webpageapps/callflow-webpagedev 19913
callout-serverapps/callout-server9920
callout-webpageapps/callout-webpagedev 19920
aliyun-speech-gateway(可选)apps/aliyun-speech-gatewayASR 10097,TTS 9081
ASR 服务onnx-platform/sherpa-asr-online-server10096
TTS 服务onnx-platform/sherpa-tts-server9080
情绪分析服务onnx-platform/emotion-analysis-server9090

显著变更(更新日志依据)

本节按子系统归纳 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.models profile 表
  • 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.models profile 表
  • 新增 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/ 分层
  • CallContext facade 能力扩展:apistopCallHearsetVariables / getVariables, 会议会控 getState / onStateChange / kickMember / mute / unmute / deaf / undeaf / lock / unlock / end / inviteMembers / setMemberRole,会议录音 recording.*
  • TTS 段重构为 tts.defaults + tts.use + tts.profiles 三段结构,流式与否改由 use.call / use.conferencewav / shout profile 决定
  • 打断(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(最终一致性)
  • 回铃音 + 嘟声检测(嘟声检测依赖 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-eslFreeSWITCH outbound ESL 接入、业务编排、示例业务、呼入 / 呼出 / 桥接 / 会议 / 录音 / DTMF 等能力
本地 AI 语音能力onnx-platform本地 ASR / TTS / 情绪分析 C++ 服务、模型配置、sherpa-onnx / ONNX Runtime 集成
运营后台apps/callflow-server / apps/callflow-webpageFreeSWITCH 数据查看、号码路由配置、运行时 TTS / 录音配置、TTS 音色试听、ASR 上传 / 录音测试
外呼系统apps/callout-server / apps/callout-webpage外呼活动、名单、批次调度、策略、DNC、坐席、转人工会议、线路号码池、实时作战大屏等
FreeSWITCH 安装配置部署文档 / 现场配置 / 联调服务FreeSWITCH、mod_audio_forkmod_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 时:

  1. git log 1aa0eaa..a5cd832 为素材池,按上面「显著变更」分类逐条筛选
  2. 保持「新增 / 变更 / 修复 / 移除」分类,遵循 Keep a Changelog 风格
  3. 用户可见的行为变更(配置结构、API、端口、业务编码)必须单独高亮,提示从旧版迁移的注意点
  4. 下一个版本(1.1.x)起,CHANGELOG 应在 a5cd832 之上增量记录

文档与代码在同一仓库维护,现有 Markdown 是唯一内容源。