feat: 添加守护进程(daemon)模式

- 实现 TCP Socket 守护进程,支持后台运行
- 添加 daemon 子命令:start/stop/status/logs
- 添加 send 子命令:发送文本到守护进程播放
- 添加日志级别自动检测(INFO/WARN/ERROR)
- 新日志格式:[时间戳] [级别] [PID] 消息
- 支持跨平台 ~/.config/tts/ 配置目录
This commit is contained in:
2026-04-25 05:50:28 +08:00
parent f81d1ab979
commit 19eb313bef
10 changed files with 1202 additions and 5 deletions

171
taolun.md
View File

@@ -344,4 +344,175 @@
9. ✅ 单元测试通过4 个测试)
10. ✅ 功能测试通过(激动语气、疑惑语气)
---
## 2026-04-25 - 第十一轮修改
### 用户需求
**实现守护进程Daemon模式类似 Docker 架构**
- 作为后台服务运行,使用 TCP Socket 监听
- 允许其他应用(包括 Web通过客户端访问
- 实现类似智能音响的功能:客户端发送文本,守护进程执行 TTS 并播放
- 所有平台统一使用 `~/.config/tts/` 目录
- 支持 style 参数作为宏观场景风格(与文本内 `[style]` 标签并存)
### 技术选型
- **Socket 方案**TCP Socket跨平台通用所有平台统一
- **协议**JSON over TCP简单、易调试
- **日志路径**`~/.config/tts/ttsd.log`(所有平台统一)
- **PID 文件路径**`~/.config/tts/ttsd.pid`
- **默认端口**9876
### 新增文件
1. `src/daemon.rs` - 守护进程模块
- TCP Socket 服务器tokio::net::TcpListener
- 处理客户端请求JSON 协议)
- PID 文件管理(启动/停止)
- 日志记录(文件 + stdout
- 调用 TTS API + 播放音频
2. `src/client.rs` - 客户端模块
- TCP 客户端tokio::net::TcpStream
- 发送 TTS 请求到守护进程
- 接收并处理响应
### 修改文件
1. `Cargo.toml`
- 添加 `dirs = "5.0"`(跨平台配置目录)
- 添加 `chrono = "0.4"`(日志时间戳)
2. `src/cli.rs`
- 添加 `Daemon` 子命令start/stop/status
- 添加 `Send` 子命令(发送文本到守护进程)
- 支持 `--port` 参数(默认 9876
3. `src/main.rs`
- 声明新模块 `daemon``client`
- 添加命令分发逻辑
### 协议设计
```json
// 客户端 → 服务端
{
"text": "要合成的文本",
"voice": "mimo_default",
"format": "wav",
"style": "开心"
}
// 服务端 → 客户端
{"status": "ok", "message": "播放完成"}
{"status": "error", "message": "错误信息"}
```
### style 参数说明
- **文本内标签**`[开心]你好!`(细粒度,句子级别)
- **style 参数**:宏观场景风格(如"新闻播报"、"开心"
- **服务端处理**:如果有 style 参数,自动添加 `<style>...</style>` 标签到文本开头(符合官方文档)
- **两者可并存**style 参数 + 文本内标签同时生效
### 第十一轮实施完成(继续实施 - 2026-04-25
**已完成**
1. ✅ 修改 Cargo.toml 添加依赖dirs、chrono
2. ✅ 创建 src/daemon.rsTCP 服务器、请求处理、PID 管理、日志)
3. ✅ 创建 src/client.rsTCP 客户端、请求发送、响应处理)
4. ✅ 修改 src/cli.rsDaemon、Send、ttsd 子命令)
5. ✅ 修改 src/main.rs模块声明、命令分发、spawn_daemon_process
6. ✅ 编译成功(仅有未使用代码警告)
**最新测试结果**2026-04-25
-`mimo-tts ttsd --port 9876` - 守护进程模式启动成功
-`nohup ./mimo-tts ttsd --port 9876 &` - 后台运行成功
-`mimo-tts send --port 9876 "消息"` - 发送请求成功,返回"播放完成"
- ✅ 日志正常:`~/.config/tts/ttsd.log`
**用户需求**
- 启动:`mimo-tts daemon start -d --port 9876``mimo-tts daemon start -d`
- 停止:`mimo-tts daemon stop`(无需端口)
- 状态:`mimo-tts daemon status`(无需端口)
**当前方案**
- 使用 `nohup` 启动后台进程Unix
- `ttsd` 子命令作为内部守护进程模式
- `stop``status` 无需端口参数
**尚未完成**
- `daemon start -d` 命令(需要实现 spawn_daemon_process
- `daemon stop` 命令
- `daemon status` 命令
---
## 2026-04-25 - 第十二轮:日志格式升级
### 用户需求
升级日志格式,添加级别和 PID 信息:
- `[时间戳] [级别] [PID] 消息`
- 级别自动检测INFO/WARN/ERROR
- 与旧日志区分(追加新格式)
### 实施完成
1. ✅ 修改 daemon.rs
- 添加 LogLevel 枚举
- 自动检测消息中的关键词判断级别
- 新格式:`[时间戳] [级别] [PID] 消息`
- stdout 输出简化:`[Daemon PID] 消息`
2. ✅ 添加 `daemon logs` 命令
- 支持 `--lines N` 参数
- 默认显示 20 行
3. ✅ 测试通过:
- 守护进程启动/停止/状态 ✅
- send 发送播放 ✅
- logs 查看日志 ✅
- 新格式正确显示 ✅
### 新日志格式
```
[2026-04-25 05:48:05] [INFO] [15278] 正在播放音频...
[2026-04-25 05:48:10] [INFO] [15278] 响应: {"status":"ok","message":"播放完成"}
```
### 级别自动检测
- `INFO` - 默认(正常运行信息)
- `WARN` - 包含"警告"、"注意"
- `ERROR` - 包含"错误"、"失败"、"无法"
### 踩坑记录
1. **clap 参数传递问题**
- 问题:`--port` 参数无法传递给 `daemon start` 子命令
- 原因clap derive 模式中,参数定义在父命令,需要在子命令之前使用
- 解决:修改 `DaemonCommand` 为独立结构体,使用正确的参数顺序
- 正确用法:`mimo-tts daemon --port 9876 start`
- 错误用法:`mimo-tts daemon start --port 9876`
2. **chrono 依赖缺失**
- 问题daemon.rs 使用 `chrono::Local::now()` 但 Cargo.toml 未添加依赖
- 解决:添加 `chrono = "0.4"` 到 Cargo.toml
### 命令使用示例
```bash
# 启动守护进程(后台运行)
mimo-tts daemon --port 9876 start &
# 查看状态
mimo-tts daemon --port 9876 status
# 发送文本(使用 style 参数)
mimo-tts send --port 9876 --style "开心" "你好,世界!"
# 发送文本(不使用 style
mimo-tts send --port 9876 "你好,世界!"
# 停止守护进程
mimo-tts daemon --port 9876 stop
```
### 技术细节
- 使用 `tokio::net::TcpListener` 实现 TCP 服务器
- 使用 `tokio::spawn` 处理多个并发连接
- 使用 `serde_json` 序列化/反序列化 JSON 协议
- 使用 `dirs::home_dir()` 获取家目录,拼接配置路径
- PID 文件用于检测守护进程是否运行
- 日志同时输出到文件和控制台
- 播放功能复用现有的 `play_audio()` 函数
- style 参数按官方文档转换为 `<style>...</style>` 标签
## 2026-04-24 - 第十轮修改