From ceeb6a3c3193c5f6e29efbb2f85e09b8934017e2 Mon Sep 17 00:00:00 2001 From: "Z.To" Date: Sat, 25 Apr 2026 07:38:26 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AE=88=E6=8A=A4?= =?UTF-8?q?=E8=BF=9B=E7=A8=8B=E6=97=A5=E5=BF=97=E4=B8=AD=E6=96=87=E6=88=AA?= =?UTF-8?q?=E5=8F=96=20panic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - daemon.rs: 使用字符索引替代字节索引截取日志文本 - agents.md: 添加踩坑记录 --- agents.md | 18 ++++++++++++++++++ src/daemon.rs | 3 ++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/agents.md b/agents.md index 9b4553c..f53c125 100644 --- a/agents.md +++ b/agents.md @@ -91,3 +91,21 @@ - 文本内标签:保留原有逻辑(`[激动]` 等格式) - 两者可以并存,互不影响 **经验**:设计 API 时要考虑不同层次的需求,宏观参数和微观标签可以互相补充 + +#### 问题:daemon.rs 中日志截取文本导致 panic +**现象**:守护进程处理包含中文字符的长文本时 panic: "byte index 50 is not a char boundary; it is inside '嘴' (bytes 48..51)" +**原因**:使用 `text.len()` 获取字节长度,用 `text[..text.len().min(50)]` 按字节索引截取,中文字符占 3 字节,在字符中间截断 +**解决方案**:`text.chars().take(50).collect::()` 按字符截取 +**经验**:处理多字节字符(中文)时,必须使用字符索引而非字节索引 + +#### 问题:Windows PowerShell 测试效率 +**现象**:测试守护进程时创建了多个 .ps1 临时文件,繁琐且不便管理 +**原因**:不熟悉 PowerShell 命令��直接执行的方式 +**解决方案**: + - 使用 `mimo-tts daemon start -d --port XXXX` 后台启动守护进程 + - 使用 PowerShell 一条命令直接发送 TCP 请求测试: + ```powershell + powershell -Command "$c=New-Object System.Net.Sockets.TcpClient;$c.Connect('127.0.0.1',9888);$s=$c.GetStream();$w=New-Object System.IO.StreamWriter($s);$w.Write('{\"text\":\"中文文本\"}');$w.Flush();$w.Close();$c.Close()" + ``` + - 无需创建 .ps1 临时文件 +**经验**:Windows PowerShell 可以在命令行中直接执行,无需临时文件 diff --git a/src/daemon.rs b/src/daemon.rs index 4aea0d7..15001c9 100644 --- a/src/daemon.rs +++ b/src/daemon.rs @@ -330,8 +330,9 @@ async fn process_tts_request(request: DaemonRequest) -> Result { let format = request.format.unwrap_or_else(|| "wav".to_string()); let style = request.style; + let text_preview: String = text.chars().take(50).collect(); write_log(&format!("处理 TTS: text={}, voice={}, format={}, style={:?}", - &text[..text.len().min(50)], voice, format, style))?; + text_preview, voice, format, style))?; // 处理风格标签 let mut final_text = text.clone();