fix: 修复流式播放无声音问题(SSE 行缓冲 + 解析层级)
This commit is contained in:
37
agents.md
37
agents.md
@@ -98,9 +98,29 @@
|
||||
**解决方案**:`text.chars().take(50).collect::<String>()` 按字符截取
|
||||
**经验**:处理多字节字符(中文)时,必须使用字符索引而非字节索引
|
||||
|
||||
### 2026-05-09 - 代码质量提升
|
||||
|
||||
#### 问题:HTTP 接口/实现不完整
|
||||
**现象**:HTTP POST /synthesize 只返回"请求已接收",未实际调用 TTS 合成
|
||||
**原因**:HTTP 服务器运行在 `std::thread` 中,`process_tts_request` 是 async 函数,无法直接调用
|
||||
**解决方案**:传递 `tokio::runtime::Handle` 到 HTTP 线程,使用 `handle.block_on()` 执行 async 调用
|
||||
**经验**:跨线程调用 async 函数时,需要用 `Handle::current()` + `block_on()` 桥接
|
||||
|
||||
#### 问题:语气替换长短匹配冲突
|
||||
**现象**:`...` 被 `.` 的替换误伤,变成 `。(停顿)。(停顿)。(停顿)`
|
||||
**原因**:`.replace()` 按顺序执行,短匹配(`.`)先于长匹配(`...`)处理
|
||||
**解决方案**:长模式(`...`/`……`)必须优先于短模式(`.`/`。`)
|
||||
**经验**:字符串替换时始终让长匹配优先于短匹配
|
||||
|
||||
#### 问题:日志文件多线程并发写入
|
||||
**现象**:HTTP 线程与 async 线程可能同时写入同一日志文件,导致内容交错
|
||||
**原因**:`write_log` 在多个线程中独立打开文件句柄追加写入
|
||||
**解决方案**:添加 `std::sync::Mutex<()>` 静态锁保护文件写入操作
|
||||
**经验**:文件追加写入在多线程环境下仍需要同步
|
||||
|
||||
#### 问题:Windows PowerShell 测试效率
|
||||
**现象**:测试守护进程时创建了多个 .ps1 临时文件,繁琐且不便管理
|
||||
**原因**:不熟悉 PowerShell 命令<EFBFBD><EFBFBD>直接执行的方式
|
||||
**原因**:不熟悉 PowerShell 命令的直接执行的方式
|
||||
**解决方案**:
|
||||
- 使用 `mimo-tts daemon start -d --port XXXX` 后台启动守护进程
|
||||
- 使用 PowerShell 一条命令直接发送 TCP 请求测试:
|
||||
@@ -109,3 +129,18 @@
|
||||
```
|
||||
- 无需创建 .ps1 临时文件
|
||||
**经验**:Windows PowerShell 可以在命令行中直接执行,无需临时文件
|
||||
|
||||
### 2026-05-09 - 流式播放修复
|
||||
|
||||
#### 问题:流式播放没有声音(SSE 解析错误)
|
||||
**现象**:守护进程 `send --stream` 和 CLI `--stream --play` 均无声音输出,但非流式正常
|
||||
**原因**(双重):
|
||||
1. SSE 结构体层级错误:`audio` 在 `choices[0].delta.audio.data`,原代码只在顶层找
|
||||
2. SSE 行分割问题:HTTP chunk 边界不对齐 `\n`,长 `data:` 行被切碎导致 serde_json 解析失败
|
||||
**解决方案**:
|
||||
1. 创建 `SseChunk`/`SseChoice`/`SseDelta`/`SseAudio` 四层嵌套结构,匹配 OpenAI chat.completion.chunk 格式
|
||||
2. 添加 `line_buf` 行缓冲器:累积跨 chunk 的不完整行,遇到 `\n` 才取出处理
|
||||
**经验**:
|
||||
- 对流式 HTTP 响应,永远不要假设 chunk 边界对齐消息边界,必须自己处理行缓冲
|
||||
- 调试无声音问题时,先分段验证:数据是否到达 → 数据是否正确解码 → sink 是否收到数据
|
||||
- 用 `--stream`(不带 `--play`)测试 JSON 响应路径 vs 用 curl 看 SSE 原始格式,能快速定位数据流断裂点
|
||||
|
||||
Reference in New Issue
Block a user