总览
5 个组件各有自己的配置文件,统一汇总在这里。
| 组件 | 配置文件 | 说明 |
|---|---|---|
| callflow-esl | callflow-esl/config.json |
ESL + HTTP + audioFork + tts + db |
| sherpa-asr-online-server | sherpa-asr-online-server/config.json |
WS + ASR + VAD |
| sherpa-tts-server | sherpa-tts-server/config.json |
HTTP + TTS pool |
| mod_audio_fork | 环境变量 + channel variable | 运行时 |
| FreeSWITCH | conf/dialplan/*.xml 等 |
信令 + 路由 |
callflow-esl config.json
完整结构:
1 | { |
server
| 字段 | 说明 |
|---|---|
host / port |
ESL outbound 监听地址与端口 |
commandTimeoutMs |
ESL 命令等待 reply 的超时 |
asrTimeoutMs |
单轮 hear() 默认超时(业务可在入参覆盖) |
settleDelayMs |
手动 answer 后建议的等待,给信令稳定 |
http
| 字段 | 说明 |
|---|---|
host / port |
HTTP 监听地址,承载 /outbound-calls |
freeswitch
| 字段 | 说明 |
|---|---|
host / port / password |
inbound ESL(用于 originate) |
callbackHost / callbackPort |
FreeSWITCH 在外呼接通后回拨当前 ESL 服务使用的地址,必须 FS 进程可达 |
originateDialStringTemplate |
所有外呼场景的默认拨号串模板,必须含 {{destinationNumber}} |
audioFork
| 字段 | 说明 |
|---|---|
wsUrl |
mod_audio_fork 要连接的 ASR WebSocket 地址 |
bugName |
media bug 名称,用于 uuid_audio_fork stop 精确定位 |
mixType / sampleRate |
上行音频通道与采样率;mono/16k 适合大多数 ASR |
bidirectionalAudioEnabled / bidirectionalAudioStreamEnabled |
下行音频通道;hear-only 模式保持关闭 |
bidirectionalAudioStreamSampleRate |
下行音频流采样率 |
connectTimeoutMs |
等待 WebSocket 连接成功事件的超时 |
eventSubscriptionMode |
ESL 事件订阅策略:"all"(推荐)/ "custom-subclass" / "channel-plus-custom" |
tts
| 字段 | 说明 |
|---|---|
sherpaHttpEndpoint |
sherpa-tts-server 的 POST /tts 地址 |
speakerId / speed |
ctx.speak({kind:"tts"}) 未指定时的默认值 |
requestTimeoutMs |
HTTP 请求超时 |
playbackTarget |
"wav-url"(默认)或 "file-path" |
fsPlaybackBaseDir |
playbackTarget=file-path 时使用的目录前缀 |
recording
| 字段 | 说明 |
|---|---|
directory |
FreeSWITCH 进程可写的录音目录 |
publicBaseUrl |
可选公开访问前缀;为空时 ctx.startRecording() 返回 fileUrl=null |
db
MySQL 连接信息。业务路由表 call_businesses + call_business_number_mappings,schema 见 src/db/schema.ts。
sherpa-asr-online-server config.json
服务与 IO
| 字段 | 默认 | 说明 |
|---|---|---|
listenHost |
127.0.0.1 |
监听地址 |
listenPort |
10096 |
监听端口 |
healthPath |
/health |
HTTP 健康检查路径 |
wsPath |
/audio |
WebSocket 升级路径 |
wsSubprotocol |
audio.drachtio.org |
子协议;空则不强制 |
maxSessions |
16 |
并发会话上限 |
ioWorkers |
CPU 核心数 | I/O worker 线程数 |
sessionPoolSize |
16 |
预热的 ASR session 数 |
maxFrameBytes |
4194304 |
单帧最大字节数 |
readBufferBytes |
65536 |
每连接 recv 缓冲 |
writeBufferBytes |
65536 |
每连接 send 缓冲(预留) |
socketRecvBufferBytes |
262144 |
SO_RCVBUF,0=不调整 |
socketSendBufferBytes |
262144 |
SO_SNDBUF,0=不调整 |
acceptBacklog |
SOMAXCONN |
listen(backlog) |
workerPollTimeoutMs |
10 |
worker 单轮 select 超时,夹紧 [1, 1000] |
tcpNoDelay |
true |
启用 TCP_NODELAY |
debugLogTextFrames |
false |
打印每条 metadata 文本帧 |
debugLogAudioFrames |
false |
每个二进制帧落识别状态日志 |
debugLogRecognitionState |
false |
识别状态变化都落日志 |
recordAudioEnabled |
false |
启用上行音频录制 |
recordAudioDir |
recordings |
录制目录 |
Sherpa ASR / VAD
| 字段 | 默认 | 说明 |
|---|---|---|
asrEncoder / asrDecoder / asrJoiner / asrTokens |
bilingual-zh-en | ONNX 模型路径 |
asrBpeVocab |
"" |
可选 BPE 词表(英语场景) |
vadModel |
silero_vad.onnx |
silero-vad onnx |
provider |
cpu |
ONNX 推理后端 |
sampleRate |
16000 |
上行采样率(仅支持 16kHz) |
numThreads |
1 |
ONNX 线程数 |
debug |
false |
sherpa-onnx 内部 debug |
enableVad |
true |
启用 VAD 分段 |
enableEndpoint |
true |
启用 endpoint 检测 |
sendPartialResults |
true |
是否下发 partial 文本帧 |
endpointRule1MinTrailingSilence |
2.4 |
sherpa endpoint 规则 1 |
endpointRule2MinTrailingSilence |
1.2 |
sherpa endpoint 规则 2 |
endpointRule3MinUtteranceLength |
20.0 |
sherpa endpoint 规则 3 |
asrModelType |
zipformer |
sherpa-onnx 模型类型 |
asrModelingUnit |
cjkchar |
建模单元 |
partialMinIntervalMs |
300 |
同句 partial 最小下发间隔 |
decodeBatchMs |
80 |
批量 decode 节奏 |
vadBufferSizeSeconds |
30.0 |
silero-vad ring buffer |
vadThreshold |
0.5 |
VAD 置信度阈值 |
vadMinSilenceDuration |
0.5 |
触发段尾的最小静音时长 |
vadMinSpeechDuration |
0.25 |
视为有效语音的最小时长 |
vadWindowSize |
512 |
VAD 窗大小(采样点) |
vadMaxSpeechDuration |
20.0 |
单段最大语音时长 |
sherpa-tts-server config.json
| 字段 | 默认 | 说明 |
|---|---|---|
listenHost |
127.0.0.1 |
实际监听地址 |
listenPort |
9080 |
实际监听端口 |
publicBaseUrl |
http://127.0.0.1:9080 |
返给客户端的 wav URL 前缀;反代后必须改 |
workerThreads |
CPU 核心数 | HTTP 处理线程数 |
ttsPoolSize |
max(CPU/2, 1) |
预热的 OfflineTts 实例数 |
wavSendChunkBytes |
65536 |
流式发送块大小 |
maxRequestBodyBytes |
1048576 |
单请求体最大字节数 |
maxQueuedRequests |
0(不限) |
等待队列上限,超出立刻 503 |
startupScanCache |
true |
启动时扫描 public/wav/ 建文件索引 |
mod_audio_fork 环境变量
| 变量 | 默认 | 说明 |
|---|---|---|
MOD_AUDIO_FORK_SUBPROTOCOL_NAME |
audio.drachtio.org |
WebSocket 子协议名 |
MOD_AUDIO_FORK_SERVICE_THREADS |
1 |
服务线程数(1-5) |
MOD_AUDIO_FORK_BUFFER_SECS |
2 |
缓冲秒数(1-5) |
mod_audio_fork channel variable
可在 dialplan 或 uuid_setvar 中设置:
| 变量 | 用途 |
|---|---|
MOD_AUDIO_BASIC_AUTH_USERNAME |
WSS 端的 Basic Auth 用户名 |
MOD_AUDIO_BASIC_AUTH_PASSWORD |
WSS 端的 Basic Auth 密码 |
MOD_AUDIO_FORK_ALLOW_SELFSIGNED |
TLS 允许自签证书 |
MOD_AUDIO_FORK_SKIP_SERVER_CERT_HOSTNAME_CHECK |
跳过 TLS hostname 校验 |
MOD_AUDIO_FORK_ALLOW_EXPIRED |
允许过期证书 |
FreeSWITCH dialplan 关键片段
把通话路由到 callflow-esl:
1 | <extension name="route-to-callflow"> |
可选:在 dialplan 提前设 channel variable,业务侧可读:
1 | <action application="set" data="campaign_id=may-test"/> |
启用 mod_audio_fork:
1 | <!-- conf/autoload_configs/modules.conf.xml --> |
ESL inbound(callflow-esl 调用 FS 用):
1 | <!-- conf/autoload_configs/event_socket.conf.xml --> |
配置变更速查
| 想做 | 改哪个 |
|---|---|
| 改 ASR 监听端口 | sherpa-asr-online-server/config.json listenPort + audioFork.wsUrl |
| 改 TTS 监听端口 | sherpa-tts-server/config.json listenPort + tts.sherpaHttpEndpoint + publicBaseUrl |
| 改 callflow-esl ESL/HTTP 端口 | server.port / http.port + FS dialplan socket 地址 |
| 改 FS 反向回拨地址 | freeswitch.callbackHost |
| 改 ASR 模型 | sherpa-asr-online-server/config.json asrEncoder/Decoder/Joiner/Tokens |
| 改 TTS 音色 | 换 vits-zh-aishell3/ 目录里的模型;或 tts.speakerId |
| 改 hear 默认超时 | server.asrTimeoutMs(业务可在 hear() 入参覆盖) |
| 改 ASR 并发 | maxSessions + sessionPoolSize |
| 改 TTS 并发 | workerThreads + ttsPoolSize |
| 开启 ASR 上行录音 | recordAudioEnabled: true |
| 切换业务路由 | MySQL 表 call_businesses + call_business_number_mappings |