Files
tts_trans/API.md

450 lines
9.4 KiB
Markdown
Raw Normal View History

# TTS Book Service API 文档
> 基于小米 MiMo TTS 的听书音频转换服务 API 参考
## 概览
| 分类 | 前缀 | 说明 |
|------|------|------|
| 听书 App 接口 | `/api/` | 供听书 App 调用的音频接入接口 |
| 实时 TTS | `/api/tts` | 实时生成并返回音频流 |
| 管理接口 | `/admin/api/` | Web 管理界面使用的 CRUD 接口 |
| 配置文件 | `/httpTts.json` | 听书 App 导入用配置 |
**Base URL**: `http://<your-server>:3333`
---
## 一、实时 TTS 接口
### POST `/api/tts`
实时调用 MiMo TTS 生成音频,直接返回 MP3 二进制流。
> 长文本会自动分段生成并拼接(每段 ≤ 2000 字符,在句末/段落边界智能切分)。
#### 请求格式
支持两种格式:
**1. JSON 格式**(推荐)
```http
POST /api/tts
Content-Type: application/json
{
"text": "要合成的文本内容",
"style": "开心",
"voice": ""
}
```
**2. Form-urlencoded 格式**(兼容百度风格)
```http
POST /api/tts
Content-Type: application/x-www-form-urlencoded
tex=%E8%A6%81%E5%90%88%E6%88%90%E7%9A%84%E6%96%87%E6%9C%AC
```
#### 参数说明
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `text` / `tex` | string | ✅ | 要合成的文本JSON 用 `text`Form 用 `tex` |
| `style` | string | ❌ | 说话风格,如 `开心``语速慢``东北话``像个大将军` 等(见风格参考) |
| `voice` | string | ❌ | 音色名称,留空使用默认音色(`mimo_default` |
#### 响应
- **成功**: `200 OK``Content-Type: audio/mpeg`,响应体为 MP3 二进制数据
- **失败**: `400` / `500``Content-Type: application/json`
```json
{
"status": 40000001,
"message": "text/tex 不能为空"
}
```
#### 示例
```bash
# cURL - JSON 格式
curl -X POST http://localhost:3333/api/tts \
-H "Content-Type: application/json" \
-d '{"text": "你好,今天天气真好!", "style": "开心"}' \
-o output.mp3
# cURL - 带音色指定
curl -X POST http://localhost:3333/api/tts \
-H "Content-Type: application/json" \
-d '{"text": "从前有座山,山里有座庙。", "voice": "mimo_male_01"}' \
-o output.mp3
```
---
## 二、听书 App 音频接入接口
### GET `/api/book/{book_id}`
获取书籍信息及章节列表,供听书 App 调用。
#### 路径参数
| 参数 | 类型 | 说明 |
|------|------|------|
| `book_id` | string | 书籍唯一标识 |
#### 响应
```json
{
"book_id": "book_9",
"title": "三体",
"author": "刘慈欣",
"chapters": [
{
"chapter_id": "chapter_1",
"app_chapter_id": "chapter1",
"title": "第一章 疯狂年代",
"status": "ready",
"audio_url": "/api/book/book_9/chapter/chapter_1/audio"
},
{
"chapter_id": "chapter_2",
"app_chapter_id": "chapter2",
"title": "第二章 寂静的春天",
"status": "pending",
"audio_url": null
}
]
}
```
| 字段 | 说明 |
|------|------|
| `status` | 章节音频状态:`pending`(待生成) / `generating`(生成中) / `ready`(就绪) / `error`(失败) |
| `audio_url` | 音频下载地址,仅 `status=ready` 时有值 |
#### 错误响应
```json
{"detail": "书籍 book_9 不存在"}
```
`404 Not Found`
---
### GET `/api/book/{book_id}/chapter/{chapter_id}/audio`
下载章节 MP3 音频文件。
#### 路径参数
| 参数 | 类型 | 说明 |
|------|------|------|
| `book_id` | string | 书籍 ID |
| `chapter_id` | string | 章节 ID |
#### 响应
- **成功**: `200 OK``Content-Type: audio/mpeg`MP3 文件流
- **未生成**: `404``{"detail": "音频尚未生成,当前状态: pending"}`
- **不存在**: `404``{"detail": "章节不存在"}`
---
## 三、管理接口
### 书籍管理
#### GET `/admin/api/books`
获取所有书籍列表。
```json
[
{"book_id": "book_9", "title": "三体", "author": "刘慈欣"},
{"book_id": "book_12", "title": "活着", "author": "余华"}
]
```
#### POST `/admin/api/books`
创建新书籍。
```http
Content-Type: application/json
{
"book_id": "book_9",
"title": "三体",
"author": "刘慈欣"
}
```
| 字段 | 必填 | 说明 |
|------|------|------|
| `book_id` | ✅ | 唯一标识 |
| `title` | ✅ | 书名 |
| `author` | ❌ | 作者 |
**响应**: `{"ok": true, "book_id": "book_9"}`
**错误**: `409 Conflict`book_id 已存在)、`400`(缺少必填字段)
#### DELETE `/admin/api/books/{book_id}`
删除书籍及其所有章节。
**响应**: `{"ok": true}`
---
### 章节管理
#### GET `/admin/api/books/{book_id}/chapters`
获取书籍下的章节列表。
```json
[
{
"chapter_id": "chapter_1",
"app_chapter_id": "chapter1",
"title": "第一章 疯狂年代",
"text_content": "这是章节文本的前200个字符...",
"text_length": 15000,
"status": "ready",
"error_msg": "",
"has_audio": true
}
]
```
> 注意: `text_content` 只返回前 200 个字符用于预览。完整文本需通过 PUT 接口编辑时获取。
#### POST `/admin/api/books/{book_id}/chapters`
创建新章节。
```json
{
"chapter_id": "chapter_1",
"app_chapter_id": "chapter1",
"title": "第一章",
"text_content": "章节正文内容..."
}
```
| 字段 | 必填 | 说明 |
|------|------|------|
| `chapter_id` | ✅ | 章节唯一标识 |
| `app_chapter_id` | ❌ | 听书 App 中的章节 ID默认同 chapter_id |
| `title` | ❌ | 章节标题 |
| `text_content` | ❌ | TTS 文本内容 |
#### PUT `/admin/api/books/{book_id}/chapters/{chapter_id}`
更新章节信息(部分更新)。
```json
{
"text_content": "更新后的文本内容...",
"title": "新标题"
}
```
所有字段均为可选,只更新传入的字段。
#### DELETE `/admin/api/books/{book_id}/chapters/{chapter_id}`
删除单个章节。
---
### 音频生成
#### POST `/admin/api/books/{book_id}/chapters/{chapter_id}/generate`
为单个章节生成音频。
> 长文本自动分段生成并拼接(每段 ≤ 2000 字符)。
**响应**:
```json
{"ok": true, "status": "ready", "error_msg": ""}
```
或生成失败时:
```json
{"ok": true, "status": "error", "error_msg": "MiMo TTS API 错误: HTTP 502"}
```
#### POST `/admin/api/books/{book_id}/generate-all`
批量生成书籍下所有**未就绪**章节的音频。
> 按顺序逐章生成,可能需要较长时间。
**响应**:
```json
{"ok": true, "total": 5, "chapter_ids": ["ch_1", "ch_2", "ch_3", "ch_4", "ch_5"]}
```
---
### TTS 试听
#### POST `/admin/api/tts/preview`
试听 TTS 效果,返回生成的音频 URL。
```json
{
"text": "你好,世界!",
"style": "开心",
"voice": ""
}
```
| 字段 | 必填 | 说明 |
|------|------|------|
| `text` | ✅ | 试听文本 |
| `style` | ❌ | 说话风格 |
| `voice` | ❌ | 音色名称 |
**响应**:
```json
{"ok": true, "url": "/audio/_preview/a1b2c3d4.mp3"}
```
---
### 配置查看
#### GET `/admin/api/config`
查看当前服务配置。
```json
{
"endpoint": "https://api.xiaomimimo.com/v1/chat/completions",
"model": "mimo-v2-audio-tts",
"voice": "mimo_default",
"api_key_masked": "sk-mi****",
"max_chunk_chars": 2000
}
```
---
## 四、配置文件
### GET `/httpTts.json`
提供听书 App 导入用的音频源配置文件MiMo TTS 单条目)。
用户可直接在听书 App 中通过 URL 导入此配置。
---
## 五、MiMo TTS 风格参考
`style` 参数中填写风格关键词MiMo TTS 支持以下类别:
### 情感类
| 风格 | 示例文本 |
|------|----------|
| 开心 | 今天真是太棒了!|
| 悲伤 | 他默默地离开了... |
| 生气 | 你怎么能这样做!|
| 平静 | 让我们慢慢来。|
| 惊讶 | 什么?这不可能!|
| 温柔 | 没关系,我在这里。|
### 语速类
| 风格 | 效果 |
|------|------|
| 语速慢 | 适合冥想、教学 |
| 语速快 | 适合新闻、解说 |
| 悄悄话 | 轻声细语 |
### 角色类
| 风格 | 效果 |
|------|------|
| 像个大将军 | 威严有力 |
| 像个小孩 | 稚嫩可爱 |
| 孙悟空 | 经典猴王 |
| 像个诗人 | 文艺优雅 |
| 像个老人 | 沧桑稳重 |
### 方言类
| 风格 | 说明 |
|------|------|
| 东北话 | 东北方言 |
| 四川话 | 四川方言 |
| 台湾腔 | 台湾口音 |
| 粤语 | 广东话 |
| 河南话 | 河南方言 |
### 组合使用
风格可以组合,例如:
```json
{
"text": "今天天气真好",
"style": "开心 语速快"
}
```
---
## 六、错误码参考
| HTTP 状态码 | status 字段 | 含义 |
|-------------|-------------|------|
| 400 | 40000001 | 请求参数缺失或无效 |
| 404 | - | 资源不存在(书籍/章节/音频文件) |
| 409 | - | 资源冲突ID 已存在) |
| 500 | 50000002 | 服务端错误(未配置 API Key 等) |
| 502 | - | MiMo TTS API 调用失败 |
---
## 七、文本自动分段机制
当文本超过 **2000 字符**时,服务自动进行智能分段:
### 分段策略
按优先级尝试在以下位置切分:
1. **段落边界**`\n\n`
2. **换行符**`\n`
3. **中文句末标点**`。!?…`
4. **英文句末标点**`.!?`
5. **分号**`;`
6. **逗号**`,`
7. **硬切** — 以上都不匹配时按长度截断
### 处理流程
```
原始文本 (10000字)
→ 智能分段 → [段1(1800字), 段2(1950字), 段3(2000字), 段4(1900字), 段5(2350字)]
→ 逐段调用 MiMo TTS → [wav1, wav2, wav3, wav4, wav5]
→ ffmpeg 拼接 → 最终 MP3
```
此过程对用户完全透明,`/api/tts` 和章节音频生成均自动支持。