外观
ASR/TTS 稳定性测试
本文档用于测试 sherpa-asr-online-server 与 sherpa-tts-server 的上线容量和长稳表现。测试工具位于 onnx-platform/stability-test.mjs,只作为客户端发压和采集数据,不会启动、停止或修改服务。
测试前准备
- 先分别启动 ASR 与 TTS 服务,并确认:
GET http://127.0.0.1:10096/health返回 200。GET http://127.0.0.1:9080/health返回 200。- TTS 流式链路可用时,本机
PATH中能找到ffmpeg,或服务配置已指定mp3EncoderPath。
- 记录测试时的实际配置作为本轮基线(以各服务
config.json当前值为准;仓库当前值):- ASR:
maxSessions=256、sessionPoolSize=48、ioWorkers=8。 - TTS:
workerThreads=48、ttsPoolSize=8、maxQueuedRequests=256。
- ASR:
- ASR 相关模式默认会先调用 TTS
POST /tts生成一段 16kHz mono PCM16 wav,下载到本轮结果目录的asr-source.wav,再用这段音频推送给 ASR。若要改回手工 wav,使用--prepare-asr-wav-from-tts false --asr-wav <path>。 - 测试结束时,必须停止本次测试中手动启动的 ASR/TTS 服务。
推荐执行流程
先跑冒烟,确认协议链路和数据落盘:
powershell
bun .\onnx-platform\stability-test.mjs --mode smoke --prepare-asr-wav-from-tts true --duration 10s再跑阶梯容量,每档 15 分钟。1x1 表示 1 条 ASR 长连接 + 1 个 TTS 请求 worker,默认阶梯是 1x1,2x2,4x4,5x4,6x6,8x8。阶梯是否触及 ASR 容量边界取决于当前 maxSessions(仓库当前为 256,默认阶梯不会越界;如需验证 503 保护边界,可临时把 maxSessions 调小到阶梯范围内):
powershell
bun .\onnx-platform\stability-test.mjs --mode capacity --step-duration 15m如果只想快速定位当前 ASR 保护边界,可先缩短每档时间:
powershell
bun .\onnx-platform\stability-test.mjs --mode capacity --step-duration 2m --capacity-steps 1x1,2x2,4x4,5x4找到稳定上限后,用稳定上限的 70%-80% 做 8 小时长稳。例如容量测试显示 4 路 ASR 会话稳定、5 路开始出现预期 503 保护,可用 3 路通话做长稳:
powershell
bun .\onnx-platform\stability-test.mjs --mode soak --calls 3 --duration 8h也可以拆开单服务测试:
powershell
bun .\onnx-platform\stability-test.mjs --mode asr --asr-concurrency 4 --duration 30m
bun .\onnx-platform\stability-test.mjs --mode tts --tts-concurrency 8 --duration 30mASR 自动音频准备可按需调整文本、说话人和语速:
powershell
bun .\onnx-platform\stability-test.mjs --mode asr `
--asr-concurrency 4 `
--duration 1m `
--asr-tts-text "您好,这是本轮 ASR 压测使用的语音内容。" `
--asr-tts-speaker-id 0 `
--asr-tts-speed 1.0规避 TTS 缓存
如果要测试 TTS 真实合成能力,避免少量固定文本快速命中 wav 缓存,开启中文唯一编号:
powershell
bun .\onnx-platform\stability-test.mjs --mode tts --tts-concurrency 4 --duration 30m --unique-tts-text true混合电话业务压测时也可以规避缓存:
powershell
bun .\onnx-platform\stability-test.mjs --mode mixed --calls 6 --duration 30m --unique-tts-text true开启后,脚本会把每条 TTS 文本变成类似:
text
您好,这里是智能语音服务测试。 批次二零二六零六零九一六三零零一 编号零零一批次号来自本轮运行时间,编号按请求递增。这样同一轮内不会因为文本重复命中缓存,下一轮也不容易命中上一轮留下的 wav。
负载模型
- ASR:每个并发会话建立 1 条 WebSocket,发送 metadata,然后按真实时间速率推送 16kHz mono PCM16 wav。默认音频来自本轮开始时 TTS
/tts生成的asr-source.wav。每轮音频结束后发送 zero-length binary flush,并短暂停顿。 - TTS:按间隔提交短句,按
--stream-ratio在/tts和/tts-stream间分配。普通/tts会继续HEAD /wav,默认也会GET /wav,模拟 FreeSWITCH 播放拉取。 - 缓存口径:默认保留文本重复,用于测试真实业务里的缓存和播放链路;需要压实际合成能力时使用
--unique-tts-text true。 - 混合模式:每个“电话会话”保持 ASR 长连接,同时有 TTS worker 按通话节奏发起播报。
常用参数:
powershell
bun .\onnx-platform\stability-test.mjs --mode mixed `
--calls 6 `
--duration 30m `
--tts-interval-ms 15000 `
--stream-ratio 0.5 `
--sample-interval-ms 10000输出数据
默认输出到 onnx-platform/stability-results/<timestamp>/:
options.json:本轮测试参数。asr-source.wav:ASR 相关模式默认由 TTS/tts生成并下载的推流源音频。events.jsonl:逐事件原始明细,适合后续脚本分析。metrics.csv:请求/会话级指标,适合 Excel 查看。resource-samples.csv:每 10 秒资源快照和/health结果。summary.json:计数器和延迟分位数摘要。
重点字段:
- ASR:
handshake、session_end、final、session_fail、capacity_boundary、read_error。 - TTS:
tts_wav、tts_wav_head、tts_wav_get、tts_stream_create、tts_stream_head、tts_stream_get。 - 资源:
asrActiveSessions、asrMaxSessions、workerThreads、ttsPoolSize、cpuSeconds、workingSetBytes、threads、handles、wavFiles、wavBytes。
通过标准
- 冒烟:ASR 至少收到 final,TTS
/tts可返回 wav,/tts-stream的 GET 返回 MP3 数据。 - 阶梯容量:非极限档位不应出现 ASR 异常关闭、TTS 5xx、TTS 503;超过 ASR
maxSessions时出现 ASR 503 属于预期保护边界,脚本会记录为asr.capacity_boundary,不计为脚本异常。除 503 外的握手失败仍按asr.session_fail处理。 - 上限判断:某档位如果 ASR
session_end正常、TTS 请求成功率稳定、p95/p99 与资源曲线可接受,则可视为可承载;首次集中出现capacity_boundary、TTS 503、持续 5xx、进程资源耗尽或延迟明显失控的档位,应视为超过当前配置上限。 - 8 小时长稳:
- 两个服务进程不退出,
/health持续可用。 - ASR
activeSessions能在测试结束后回落。 - TTS 延迟 p95/p99 不随时间持续恶化。
- 进程内存、线程、句柄没有单调泄漏趋势。
wavBytes的增长需要结合server.maxCacheEntries的 LRU 上限判断;配置为0时才不限制条数。
- 两个服务进程不退出,
记录建议
保存以下材料用于结论分析:
- 测试命令、服务配置、机器规格、模型名称。
- ASR/TTS 服务 stdout 日志。
stability-results目录完整内容。- 每个阶梯档位的容量判断:成功率、p95/p99、CPU、内存、句柄、wav 增长量。