外观
配置参考
配置
config.json 按职责分组,顶层为 server / concurrency / timeouts / transport / mp3 / tts 六个对象。缺省的分组或字段都会回退到默认值, 但 tts.activeModel 与 tts.models 为必填。
server(网络监听与运行时)
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
listenHost | string | "127.0.0.1" | 实际监听地址 |
listenPort | uint16 | 9080 | 实际监听端口 |
publicBaseUrl | string | "http://127.0.0.1:9080" | 返回给客户端的 wav URL 前缀,可与 listenHost 不同(如部署在反代后) |
logDir | string | "logs" | 日志目录;相对路径按运行目录解析,按天滚动 |
startupScanCache | bool | true | 启动时是否扫描已有 wav 缓存 |
maxCacheEntries | int32 | 10000 | wav 缓存条数上限;超限按 O(1) LRU 批量收敛到 90% 水位。正在 /wav 下载或缓存流播放的条目持有读取租约,不参与删除;失败删除会记录并重试。0 表示不限制,负数为配置错误;启动扫描按文件时间恢复顺序并收敛历史缓存 |
concurrency(并发与线程)
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
workerThreads | int32 | CPU 核心数 | HTTP 请求处理线程数(accept 之后入队列,由工作线程消费) |
ttsPoolSize | int32 | max(CPU/2, 1) | 预热的 OfflineTts 实例数;越大并发合成能力越强,但占用更多内存 |
ttsModelNumThreads | int32 | 2 | 单个 OfflineTts 实例内部的 ONNX Runtime 推理线程数;调低偏吞吐,调高偏单请求低 RTF |
maxQueuedRequests | int32 | 0 (不限制) | 等待队列上限;超出时新连接立即返回 503 |
maxActiveStreams | int32 | 24 | 同时处理的 GET /tts-stream/<id>.mp3 上限;超出时在发送音频头前返回 503 |
timeouts(超时,单位 ms)
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
socketReadMs | int32 | 5000 | HTTP socket 读超时;设为 0 表示使用系统默认 |
socketSendMs | int32 | 15000 | HTTP socket 写超时;慢读或断连客户端超过该时间会使本次请求失败 |
ffmpegExitMs | int32 | 5000 | 启动探测和请求处理时等待 ffmpeg 退出的超时时间;超时后会 kill 并回收子进程、记录失败 |
streamMaxDurationMs | int32 | 60000 | 单条流式 GET /tts-stream/<id>.mp3 允许占用连接的最长时间;到点后服务端主动断开并释放 worker |
transport(传输限制)
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
wavSendChunkBytes | size_t | 65536 | GET /wav/... 流式发送的块大小 |
maxRequestBodyBytes | size_t | 1048576 | 单请求体最大字节数;超过直接 400 |
mp3(流式 MP3 编码)
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
encoderPath | string | "ffmpeg" | 流式 TTS 使用的 MP3 编码器路径;启动时会执行一次最小 MP3 编码探测;mod_shout 需要 MPEG 音频,服务通过 ffmpeg 把 PCM 实时编码为 MP3 |
bitrateKbps | int32 | 192 | 流式 TTS 转 MP3 的 CBR 码率,范围 64..320 |
volumeGainDb | float | 3.0 | 流式 TTS 转 MP3 时追加的响度增益,单位 dB,范围 -20..20;正增益会同时启用 limiter 降低削波风险 |
tts(模型选择)
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
activeModel | string | 必填 | 当前加载的具体模型 profile id,必须存在于 tts.models |
models | object | 必填 | 模型 profile 表;每个 profile 的 backend 才是 sherpa-onnx 后端类型 |
tts.activeModel 用于选择具体模型,例如 matcha-icefall-zh-en 或 vits-zh-ll。 profile 内的 backend 只表达 sherpa-onnx 初始化分支,取值为 matcha、vits 或 kokoro。旧的扁平顶层字段(listenHost/workerThreads/activeTtsModel/ ttsModels 等)已迁移到上述分组,不再做兼容转换。
profile 通用字段:
| 字段 | 后端 | 说明 |
|---|---|---|
backend | 全部 | 必填,matcha / vits / kokoro |
modelDir | 全部 | 必填,模型目录;相对 models/,也可填绝对路径 |
speakerNames | 全部 | 可选,/health.model.speakers 的名称表;未配置时 Kokoro 使用内置名称,其它模型返回空数组 |
lengthScale | 全部 | 可选,默认 1.0,必须 > 0 |
noiseScale / noiseScaleW | VITS | 可选,默认 0.667 / 0.8 |
ruleFsts / dictDir | VITS | 可选,逗号分隔 FST 文件或字典目录,相对 modelDir |
dictDir / lang | Kokoro | 可选,lang 默认 zh |
默认配置同时声明四个 profile,切换模型只需修改 tts.activeModel:
json
{
"tts": {
"activeModel": "matcha-icefall-zh-en",
"models": {
"matcha-icefall-zh-en": {
"backend": "matcha",
"modelDir": "matcha-icefall-zh-en",
"acousticModel": "model-steps-3.onnx",
"vocoder": "vocos-16khz-univ.onnx",
"tokens": "tokens.txt",
"lexicon": "lexicon.txt",
"dataDir": "espeak-ng-data",
"noiseScale": 0.667,
"lengthScale": 1.0
},
"vits-aishell3": {
"backend": "vits",
"modelDir": "vits-zh-aishell3",
"model": "vits-aishell3.onnx",
"tokens": "tokens.txt",
"lexicon": "lexicon.txt",
"noiseScale": 0.667,
"noiseScaleW": 0.8,
"lengthScale": 1.0
},
"vits-zh-ll": {
"backend": "vits",
"modelDir": "sherpa-onnx-vits-zh-ll",
"model": "model.onnx",
"tokens": "tokens.txt",
"lexicon": "lexicon.txt",
"ruleFsts": "phone.fst,number.fst",
"lengthScale": 1.0,
"speakerNames": ["ll_0", "ll_1", "ll_2", "ll_3", "ll_4"]
},
"kokoro-multi-lang-v1_1": {
"backend": "kokoro",
"modelDir": "kokoro-multi-lang-v1_1",
"model": "model.onnx",
"voices": "voices.bin",
"tokens": "tokens.txt",
"lexicon": "lexicon-us-en.txt,lexicon-zh.txt",
"dataDir": "espeak-ng-data",
"dictDir": "dict",
"lang": "zh",
"lengthScale": 1.0
}
}
}
}Kokoro kokoro-multi-lang-v1_1 是中英双语多音色模型。Aishell3 vits-zh-aishell3 和 sherpa-onnx-vits-zh-ll 都是多说话人中文模型, 都可通过 speakerId 选择音色。
默认监听:
text
http://127.0.0.1:9080