一句话定位
callflow-server + callflow-webpage 是平台的管理控制台:一个 Web 后台,用来
查看 FreeSWITCH 运行数据、管理业务路由与号码映射、在线调整 callflow-esl 的运行时
配置(TTS / 录音),以及试听 TTS 音色、测试 ASR 识别——不用改配置文件、不用重启服务。
它把”看通话数据、配号码路由、调 TTS 参数、试音色、试 ASR”这些日常运维动作,从改 JSON +
重启,变成网页上点几下。
架构与数据流
1 | ┌────────────────────┐ HTTP ┌────────────────────────┐ |
关键点:callflow-server 写的运行时配置,落在 callflow-esl 同一套 callflow schema
表里(callflow_runtime_configs)。前端”保存”后再点”重载”,callflow-server 会POST 到 callflow-esl 的 /runtime-configs/reload,让其重新读取配置——新通话立即生效。
五块功能
1. 看板(/)
调用 GET /api/freeswitch/overview,展示实时活动通道数、当前通话数、SIP 注册数,
以及最近通道 / 注册明细。数据全部来自 FreeSWITCH 数据库,只读。
2. FreeSWITCH 数据浏览(/tables/:name)
通用表浏览器:下拉切换任意 FreeSWITCH 表(channels、calls、registrations、
sip_dialogs、basic_calls / detailed_calls 视图等),全文搜索 + 分页,点击单元格
查看完整内容。对应 GET /api/freeswitch/tables 与 GET /api/freeswitch/tables/{name}。
3. 配置管理(/callflow)
- 运行时配置:在线编辑
tts与recording两组配置(tts.defaults的speakerId/speed/requestTimeoutMs、tts.use的call/conference
profile 选择、tts.profiles.wav/tts.profiles.shout的 endpoint / playbackTarget /
playbackPrefix,以及录音directory/publicBaseUrl等),保存后一键”重载”通知 callflow-esl 生效; - 业务与号码映射:查看已注册业务(
call_businesses),增删改”被叫号码 → 业务”
的映射(call_business_number_mappings),即号码路由由谁接管。
4. TTS 音色试听(/tts-audition,音色试听)
这是控制台最实用的小工具:
- 进入时读取
GET /api/callflow/runtime-configs拿到当前 TTS 端点与默认参数; - 调
POST /api/tts/health读取 TTS 服务的model.numSpeakers,按说话人数量动态
渲染音色卡片——多说话人模型(如默认的 Kokoro,103 个音色)自动列出全部 speaker,
单说话人模型(如 Matcha)只显示 1 个; - 输入文本、调节语速(0.5–1.8)、选择 speaker,点试听即
POST /api/tts/audition
合成并就地播放,返回里带cached标识命中缓存与否,还能一键复制该音色的请求 JSON。
音色试听让”换 TTS 模型 / 挑哪个 speakerId / 调语速”从盲调变成所见即所得,挑好的
speakerId+speed直接填进 callflow-esl 的tts配置或业务的ctx.speak入参。
5. ASR 测试(/asr-test,ASR 测试)
ASR 测试页用于在不拨电话的情况下验证识别服务:
- 进入页面时调用
POST /api/asr/health,默认读取 callflow-eslaudioFork.wsUrl,也可手动
输入 ASR 主机、端口和路径; - 支持上传音频文件,浏览器侧会解码、混成单声道并重采样为 16kHz PCM16 WAV;
- 支持浏览器麦克风录音,录音完成后同样规范化为 16kHz mono PCM16;
callflow-server通过 WebSocket 把 PCM 分片转发给 ASR 服务,收集 partial / final
事件并返回最终文本、耗时、音频时长和最近事件列表。
这个页面既可以测本地 ASR 服务,也可以把端点切到
阿里云语音网关 的 ws://host:10097/audio。
HTTP API 一览
所有响应统一用 { ok, data } / { ok, error } 信封。
| 方法 | 路径 | 用途 |
|---|---|---|
| GET | /health |
服务 + 两个数据库连通性 |
| GET | /api/freeswitch/overview |
看板计数与最近通道 / 注册 |
| GET | /api/freeswitch/tables |
可浏览的 FreeSWITCH 表清单 |
| GET | /api/freeswitch/tables/{name} |
某表的分页 / 搜索数据 |
| GET | /api/callflow/businesses |
业务列表(分页) |
| GET / POST | /api/callflow/number-mappings |
号码映射查询 / 新建 |
| PUT / DELETE | /api/callflow/number-mappings/{id} |
号码映射更新 / 软删除 |
| GET | /api/callflow/runtime-configs |
当前 tts + recording 运行时配置 |
| PUT | /api/callflow/runtime-configs/tts |
更新 TTS 运行时配置 |
| PUT | /api/callflow/runtime-configs/recording |
更新录音运行时配置 |
| POST | /api/callflow/runtime-configs/reload |
转发到 callflow-esl 触发重载 |
| POST | /api/tts/audition |
合成一段试听音频 → { wavUrl, fileName, sampleRate, cached } |
| POST | /api/tts/health |
探测 TTS 服务 /health → 模型信息(numSpeakers 等) |
| POST | /api/asr/health |
探测 ASR 服务 /health,可由 wsUrl 推导 HTTP 基址 |
| POST | /api/asr/recognize |
接收上传音频,要求 16kHz mono PCM16 WAV,转发到 ASR WebSocket |
配置
callflow-server 没有 config.json,全部走环境变量(见 src/config.ts):
| 环境变量 | 默认 | 说明 |
|---|---|---|
CALLFLOW_SERVER_HOST |
0.0.0.0 |
HTTP 监听地址 |
CALLFLOW_SERVER_PORT |
9913 |
HTTP 监听端口 |
FREESWITCH_DB_URL |
…@192.168.2.246:5432/freeswitch |
FreeSWITCH 数据库(只读视图) |
CALLFLOW_DB_URL |
…@localhost:5432/freeswitch?options=-c search_path=callflow |
callflow 数据库(读写) |
CALLFLOW_ESL_BASE_URL |
http://127.0.0.1:9912 |
callflow-esl HTTP,用于配置重载 |
前端 callflow-webpage 开发端口 19913,通过 VITE_CALLFLOW_API_BASE(默认http://127.0.0.1:9913)连接后端,路由为 hash 模式。
控制台同样没有内置鉴权。生产环境请置于内网或加反代鉴权层,参见
部署拓扑。
下一步
- 想看运行时配置在 callflow-esl 侧怎么被消费 → callflow-esl、配置参考
- 想看 TTS 端点、流式与缓存 → TTS 服务
- 想切换云端 ASR/TTS 验证 → 阿里云语音网关
- 想批量打电话而不是看数据 → 智能外呼