# AI语音应用 - 生成内容优化建议

> 生成时间：2026-04-06

---

## 1. 内容创作辅助

| 功能 | 说明 | 价值 | 优先级 |
|------|------|------|--------|
| **AI文案助手** | 输入关键词，AI自动生成配音脚本 | 降低创作门槛 | 🔴 高 |
| **模板库** | 提供各类场景模板（广告旁白/有声书/课件/短视频） | 快速上手 | 🔴 高 |
| **敏感词检测** | 生成前检测文本敏感词，避免违规 | 安全保障 | 🔴 高 |
| **多语言翻译+配音** | 输入中文 → 自动翻译 → 英文配音 | 出海场景 | 🟡 中 |

---

## 2. 内容质量提升

| 功能 | 说明 | 价值 | 优先级 |
|------|------|------|--------|
| **背景音乐** | 生成的音频自动添加轻柔背景音乐 | 提升听感 | 🔴 高 |
| **音效库** | 提供转场、音效素材（新闻开场/搞笑音效） | 内容丰富 | 🟡 中 |
| **多角色对话** | 输入对话文本，自动分配不同音色 | 有声剧/播客 | 🟡 中 |
| **情感调节** | 在语速/音调基础上，增加"开心/悲伤/激动"情感参数 | 更自然 | 🟡 中 |

---

## 3. 内容组织管理

| 功能 | 说明 | 价值 | 优先级 |
|------|------|------|--------|
| **音频剪辑** | 生成后可裁剪、合并、调整音量 | 一站式服务 | 🔴 高 |
| **专辑分类** | 按项目/用途/客户分类管理 | 方便查找 | 🟡 中 |
| **标签系统** | 给音频打标签（广告/课件/有声书） | 快速筛选 | 🟢 低 |
| **收藏夹** | 收藏喜欢的音频或模板 | 复用便捷 | 🟢 低 |

---

## 4. 内容分发

| 功能 | 说明 | 付费点 | 优先级 |
|------|------|--------|--------|
| **一键发布** | 生成后直接发布到喜马拉雅/抖音/视频号 | 平台分发 | 🟡 中 |
| **视频配音** | 上传视频，自动匹配音频 | 视频创作者 | 🟡 中 |
| **字幕生成** | 音频转字幕SRT文件 | 视频用户 | 🟡 中 |
| **定时发布** | 设置发布时间，自动发布 | 运营效率 | 🟢 低 |

---

## 5. 商业内容支持

| 功能 | 说明 | 目标客户 | 优先级 |
|------|------|----------|--------|
| **品牌音色定制** | 用品牌VI声音配音，保持一致性 | 企业客户 | 🟢 低 |
| **批量混音** | 上传文案+背景音乐，自动混音输出 | 内容工厂 | 🟡 中 |
| **API批量处理** | 提供接口，集成到现有系统 | 企业客户 | 🟢 低 |
| **白标服务** | 支持品牌定制贴牌 | 代理商 | 🟢 低 |

---

## 6. 内容质量检测

| 功能 | 说明 | 价值 | 优先级 |
|------|------|------|--------|
| **试听预览** | 生成前试听1-2句demo | 避免浪费额度 | 🔴 高 |
| **质量评分** | 生成后显示"流畅度/自然度"评分 | 用户参考 | 🟡 中 |
| **错别字检测** | 检测生成文本中的错别字 | 准确性 | 🟡 中 |
| **多版本对比** | 同一文本用不同音色/参数生成，对比选择 | 择优使用 | 🟡 中 |

---

## 7. 模板库场景分类

| 分类 | 模板示例 |
|------|----------|
| **广告营销** | 产品介绍、活动促销、品牌宣传 |
| **知识付费** | 有声书、课件讲解、知识科普 |
| **短视频** | 抖音旁白、视频解说、种草文案 |
| **企业宣传** | 公司介绍、培训课件、年会致辞 |
| **日常生活** | 生日祝福、节日问候、婚礼致辞 |
| **新闻资讯** | 新闻播报、天气预报、体育解说 |

---

## 8. 开发优先级规划

### 第一阶段（快速上线）

- [ ] 模板库（基础场景）
- [ ] 背景音乐（内置几首）
- [ ] 试听预览
- [ ] 敏感词检测

### 第二阶段（体验提升）

- [ ] AI文案助手
- [ ] 音频剪辑
- [ ] 情感调节
- [ ] 字幕生成

### 第三阶段（差异化竞争）

- [ ] 多角色对话
- [ ] 视频配音
- [ ] 品牌音色定制
- [ ] 一键发布

---

## 9. 核心优化方向总结

```
┌─────────────────────────────────────────────────┐
│                   生成内容优化                    │
├─────────────┬─────────────┬─────────────────────┤
│   创作辅助    │   质量提升    │      分发能力        │
├─────────────┼─────────────┼─────────────────────┤
│ AI文案助手   │ 背景音乐     │ 视频配音            │
│ 模板库       │ 情感调节     │ 字幕生成            │
│ 敏感词检测   │ 质量评分     │ 一键发布            │
│ 多语言支持   │ 多版本对比   │ 定时发布            │
└─────────────┴─────────────┴─────────────────────┘
```

**核心理念**：从"单一配音工具"升级为"内容创作平台"，覆盖创作→生成→加工→分发全链路。

---

## 10. 代码层面：文本内容生成 & TTS音频生成优化建议

> 分析时间：2026-05-16
> 分析范围：`server/src/modules/book-generator/` 文本内容生成逻辑 + TTS 音频生成逻辑

### 10.1 高优先级（建议立即处理）

| # | 问题 | 严重程度 | 说明 | 状态 |
|---|------|----------|------|------|
| 1 | **TTS 无供应商熔断/降级** | 🔴 严重 | LLM 有 Provider Registry + 熔断器，但 `generateAudio()` 内部是否也有多供应商降级？需确认 `tts.service.ts` 实现 | ⬜ 待处理 |
| 2 | **扣费与音频生成原子性** | 🔴 严重 | `consumeAudioMinutes` 若失败，音频已生成但未扣费，导致配额泄露 | ⬜ 待处理 |
| 3 | **全局 LLM 并发控制缺失** | 🟡 中等 | 多本书同时生成，各自的 `AsyncPool(8)` 互不感知，总计可能超过供应商 Rate Limit | ⬜ 待处理 |

**建议方案**：

① TTS 供应商降级（参考 LLM 的 Provider Registry 模式）
```typescript
// 新建 src/services/tts/provider.registry.ts
// 为多 TTS 供应商（MiniMax、阿里云、Azure TTS）实现：
// - 多供应商注册
// - 熔断器保护
// - 自动降级切换
```

② 扣费原子性保障
```typescript
// 建议修改 processTtsTask：
// 方案：先扣费，再标记任务完成（扣费失败则任务不标记完成）
try {
  await consumeAudioMinutes(userId, audioMinutes, description);
  await prisma.ttsTask.update({ where: { id: taskId }, data: { status: 'completed' } });
} catch (quotaErr) {
  // 扣费失败：保留音频文件，任务标记需人工处理
  await prisma.ttsTask.update({
    where: { id: taskId },
    data: { status: 'completed', errorMsg: `扣费失败: ${quotaErr.message}` }
  });
}
```

③ 全局 LLM 并发控制
```typescript
// 新建 src/services/llm/concurrency-limiter.ts
import { Semaphore } from 'async-mutex';
const globalLLMSemaphore = new Semaphore(10); // 全局最多10路并发
export async function withLLMConcurrency<T>(fn: () => Promise<T>): Promise<T> {
  return globalLLMSemaphore.runExclusive(fn);
}
```

### 10.2 中优先级

| # | 问题 | 严重程度 | 说明 | 状态 |
|---|------|----------|------|------|
| 4 | **无流式输出反馈** | 🟡 中等 | `callLLMWithTools` 等待完整响应，长章节生成时用户无感知，可能触发前端超时 | ⬜ 待处理 |
| 5 | **无内容语义缓存** | 🟡 中等 | 相同/相似提示词重复生成，浪费 LLM 额度；可引入语义缓存（相似度≥0.95 复用） | ⬜ 待处理 |
| 6 | **TTS 参数未纳入去重哈希** | 🟡 中等 | 仅对 `content` 计算哈希，若用户更换 `speed/pitch/voice`，相同内容不会重新生成音频 | ⬜ 待处理 |
| 7 | **无音频文件有效性校验** | 🟡 中等 | 生成后未校验音频文件是否可播放、时长是否合理 | ⬜ 待处理 |
| 8 | **字数控制不精确** | 🟡 中等 | LLM 不严格遵循 `estimatedWords`，当前仅靠 `truncateAtBoundary` 截断，可能破坏语义完整性 | ⬜ 待处理 |

**建议方案**：

④ 内容生成流式反馈
```typescript
// generateSingleChapterContent 中应使用 callLLMStream 替代 callLLMWithMessages
// 通过 WebSocket 实时推送 token 到前端
for await (const chunk of callLLMStream(messages)) {
  pushProgressChunk(chunk); // 实时推送
}
```

⑤ TTS 参数纳入去重哈希
```typescript
function computeTtsTaskHash(
  content: string,
  options: { voice: string; speed: number; pitch: number }
): string {
  const data = `${content}||${options.voice}||${options.speed}||${options.pitch}`;
  return crypto.createHash('sha256').update(data).digest('hex');
}
```

⑥ 音频文件校验
```typescript
import { execFile } from 'child_process';
// 生成后校验音频时长和格式
async function validateAudioFile(filePath: string): Promise<{ valid: boolean; duration: number }> {
  return new Promise((resolve, reject) => {
    execFile(ffprobe, ['-v', 'error', '-show_entries', 'format=duration', '-of', 'json', filePath],
      (err, stdout) => {
        if (err) return resolve({ valid: false, duration: 0 });
        const duration = parseFloat(JSON.parse(stdout).format.duration);
        resolve({ valid: duration > 0, duration });
      });
  });
}
```

### 10.3 低优先级

| # | 问题 | 严重程度 | 说明 | 状态 |
|---|------|----------|------|------|
| 9 | **TTS 任务无优先级** | 🟢 轻微 | 所有任务 FIFO，用户手动触发的紧急任务无法插队 | ⬜ 待处理 |
| 10 | **并发数硬编码** | 🟢 轻微 | `tts-queue.ts` 中 `maxConcurrency=3` 是硬编码，不同 TTS 供应商支持的最佳并发数不同 | ⬜ 待处理 |
| 11 | **工具调用失败降级逻辑冗余** | 🟢 轻微 | `generateSingleChapterContent` 中 try-catch 调用 `callLLMWithTools` 失败后降级，但 `callLLMWithTools` 内部已有模型切换逻辑 | ⬜ 待处理 |
| 12 | **AudioScanner 超限无用户通知** | 🟢 轻微 | `MAX_RETRY_PER_DAY=5` 达到上限直接标记 `failed`，未通知用户 | ⬜ 待处理 |

**建议方案**：

⑦ 任务优先级队列（高优先级）
```typescript
// 在 ttsTask 表增加 priority 字段
// 认领时 orderBy: { priority: 'desc', createdAt: 'asc' }
enum TaskPriority {
  USER_MANUAL = 10,   // 用户手动触发
  SYSTEM_AUTO = 5,     // 系统自动生成
  BATCH_IMPORT = 1,    // 批量导入
}
```

⑧ 可配置并发数
```typescript
// 将 maxConcurrency 移入配置文件 config.toml
[tts]
maxConcurrency = 3  # MiniMax 建议 3，阿里云建议 5
```

### 10.4 各模块评分总结

| 维度 | 评分 | 说明 |
|------|------|------|
| 架构设计 | ⭐⭐⭐⭐ | LangGraph + 策略模式 + DB队列设计合理 |
| 错误处理 | ⭐⭐⭐ | 有重试/回退/兜底，但TTS侧降级不如LLM侧完善 |
| 并发控制 | ⭐⭐⭐ | 有局部并发控制，缺全局限制 |
| 数据一致性 | ⭐⭐ | 扣费原子性、状态机竞态仍有风险 |
| 可观测性 | ⭐⭐⭐ | 日志较完善，缺结构化指标 |

### 10.5 行动清单（按优先级排序）

- [ ] **P0** 确认 `tts.service.ts` 是否有多供应商降级，若无则实现
- [ ] **P0** 修复 `processTtsTask` 中扣费原子性问题
- [ ] **P1** 实现全局 LLM 并发控制器（Semaphore）
- [ ] **P1** `generateSingleChapterContent` 改用流式调用 + WebSocket 推送
- [ ] **P1** TTS 去重哈希增加 `voice/speed/pitch` 参数
- [ ] **P2** 生成后增加音频文件有效性校验（ffprobe）
- [ ] **P2** `ttsTask` 表增加 `priority` 字段支持任务插队
- [ ] **P3** `maxConcurrency` 移入 `config.toml` 可配置
