生成时间:2026-04-06
| 功能 | 说明 | 价值 | 优先级 |
|---|---|---|---|
| AI文案助手 | 输入关键词,AI自动生成配音脚本 | 降低创作门槛 | 🔴 高 |
| 模板库 | 提供各类场景模板(广告旁白/有声书/课件/短视频) | 快速上手 | 🔴 高 |
| 敏感词检测 | 生成前检测文本敏感词,避免违规 | 安全保障 | 🔴 高 |
| 多语言翻译+配音 | 输入中文 → 自动翻译 → 英文配音 | 出海场景 | 🟡 中 |
| 功能 | 说明 | 价值 | 优先级 |
|---|---|---|---|
| 背景音乐 | 生成的音频自动添加轻柔背景音乐 | 提升听感 | 🔴 高 |
| 音效库 | 提供转场、音效素材(新闻开场/搞笑音效) | 内容丰富 | 🟡 中 |
| 多角色对话 | 输入对话文本,自动分配不同音色 | 有声剧/播客 | 🟡 中 |
| 情感调节 | 在语速/音调基础上,增加"开心/悲伤/激动"情感参数 | 更自然 | 🟡 中 |
| 功能 | 说明 | 价值 | 优先级 |
|---|---|---|---|
| 音频剪辑 | 生成后可裁剪、合并、调整音量 | 一站式服务 | 🔴 高 |
| 专辑分类 | 按项目/用途/客户分类管理 | 方便查找 | 🟡 中 |
| 标签系统 | 给音频打标签(广告/课件/有声书) | 快速筛选 | 🟢 低 |
| 收藏夹 | 收藏喜欢的音频或模板 | 复用便捷 | 🟢 低 |
| 功能 | 说明 | 付费点 | 优先级 |
|---|---|---|---|
| 一键发布 | 生成后直接发布到喜马拉雅/抖音/视频号 | 平台分发 | 🟡 中 |
| 视频配音 | 上传视频,自动匹配音频 | 视频创作者 | 🟡 中 |
| 字幕生成 | 音频转字幕SRT文件 | 视频用户 | 🟡 中 |
| 定时发布 | 设置发布时间,自动发布 | 运营效率 | 🟢 低 |
| 功能 | 说明 | 目标客户 | 优先级 |
|---|---|---|---|
| 品牌音色定制 | 用品牌VI声音配音,保持一致性 | 企业客户 | 🟢 低 |
| 批量混音 | 上传文案+背景音乐,自动混音输出 | 内容工厂 | 🟡 中 |
| API批量处理 | 提供接口,集成到现有系统 | 企业客户 | 🟢 低 |
| 白标服务 | 支持品牌定制贴牌 | 代理商 | 🟢 低 |
| 功能 | 说明 | 价值 | 优先级 |
|---|---|---|---|
| 试听预览 | 生成前试听1-2句demo | 避免浪费额度 | 🔴 高 |
| 质量评分 | 生成后显示"流畅度/自然度"评分 | 用户参考 | 🟡 中 |
| 错别字检测 | 检测生成文本中的错别字 | 准确性 | 🟡 中 |
| 多版本对比 | 同一文本用不同音色/参数生成,对比选择 | 择优使用 | 🟡 中 |
| 分类 | 模板示例 |
|---|---|
| 广告营销 | 产品介绍、活动促销、品牌宣传 |
| 知识付费 | 有声书、课件讲解、知识科普 |
| 短视频 | 抖音旁白、视频解说、种草文案 |
| 企业宣传 | 公司介绍、培训课件、年会致辞 |
| 日常生活 | 生日祝福、节日问候、婚礼致辞 |
| 新闻资讯 | 新闻播报、天气预报、体育解说 |
┌─────────────────────────────────────────────────┐
│ 生成内容优化 │
├─────────────┬─────────────┬─────────────────────┤
│ 创作辅助 │ 质量提升 │ 分发能力 │
├─────────────┼─────────────┼─────────────────────┤
│ AI文案助手 │ 背景音乐 │ 视频配音 │
│ 模板库 │ 情感调节 │ 字幕生成 │
│ 敏感词检测 │ 质量评分 │ 一键发布 │
│ 多语言支持 │ 多版本对比 │ 定时发布 │
└─────────────┴─────────────┴─────────────────────┘
核心理念:从"单一配音工具"升级为"内容创作平台",覆盖创作→生成→加工→分发全链路。
分析时间:2026-05-16 分析范围:
server/src/modules/book-generator/文本内容生成逻辑 + TTS 音频生成逻辑
| # | 问题 | 严重程度 | 说明 | 状态 |
|---|---|---|---|---|
| 1 | TTS 无供应商熔断/降级 | 🔴 严重 | LLM 有 Provider Registry + 熔断器,但 generateAudio() 内部是否也有多供应商降级?需确认 tts.service.ts 实现 |
⬜ 待处理 |
| 2 | 扣费与音频生成原子性 | 🔴 严重 | consumeAudioMinutes 若失败,音频已生成但未扣费,导致配额泄露 |
⬜ 待处理 |
| 3 | 全局 LLM 并发控制缺失 | 🟡 中等 | 多本书同时生成,各自的 AsyncPool(8) 互不感知,总计可能超过供应商 Rate Limit |
⬜ 待处理 |
建议方案:
① TTS 供应商降级(参考 LLM 的 Provider Registry 模式)
// 新建 src/services/tts/provider.registry.ts
// 为多 TTS 供应商(MiniMax、阿里云、Azure TTS)实现:
// - 多供应商注册
// - 熔断器保护
// - 自动降级切换
② 扣费原子性保障
// 建议修改 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 并发控制
// 新建 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);
}
| # | 问题 | 严重程度 | 说明 | 状态 |
|---|---|---|---|---|
| 4 | 无流式输出反馈 | 🟡 中等 | callLLMWithTools 等待完整响应,长章节生成时用户无感知,可能触发前端超时 |
⬜ 待处理 |
| 5 | 无内容语义缓存 | 🟡 中等 | 相同/相似提示词重复生成,浪费 LLM 额度;可引入语义缓存(相似度≥0.95 复用) | ⬜ 待处理 |
| 6 | TTS 参数未纳入去重哈希 | 🟡 中等 | 仅对 content 计算哈希,若用户更换 speed/pitch/voice,相同内容不会重新生成音频 |
⬜ 待处理 |
| 7 | 无音频文件有效性校验 | 🟡 中等 | 生成后未校验音频文件是否可播放、时长是否合理 | ⬜ 待处理 |
| 8 | 字数控制不精确 | 🟡 中等 | LLM 不严格遵循 estimatedWords,当前仅靠 truncateAtBoundary 截断,可能破坏语义完整性 |
⬜ 待处理 |
建议方案:
④ 内容生成流式反馈
// generateSingleChapterContent 中应使用 callLLMStream 替代 callLLMWithMessages
// 通过 WebSocket 实时推送 token 到前端
for await (const chunk of callLLMStream(messages)) {
pushProgressChunk(chunk); // 实时推送
}
⑤ TTS 参数纳入去重哈希
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');
}
⑥ 音频文件校验
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 });
});
});
}
| # | 问题 | 严重程度 | 说明 | 状态 |
|---|---|---|---|---|
| 9 | TTS 任务无优先级 | 🟢 轻微 | 所有任务 FIFO,用户手动触发的紧急任务无法插队 | ⬜ 待处理 |
| 10 | 并发数硬编码 | 🟢 轻微 | tts-queue.ts 中 maxConcurrency=3 是硬编码,不同 TTS 供应商支持的最佳并发数不同 |
⬜ 待处理 |
| 11 | 工具调用失败降级逻辑冗余 | 🟢 轻微 | generateSingleChapterContent 中 try-catch 调用 callLLMWithTools 失败后降级,但 callLLMWithTools 内部已有模型切换逻辑 |
⬜ 待处理 |
| 12 | AudioScanner 超限无用户通知 | 🟢 轻微 | MAX_RETRY_PER_DAY=5 达到上限直接标记 failed,未通知用户 |
⬜ 待处理 |
建议方案:
⑦ 任务优先级队列(高优先级)
// 在 ttsTask 表增加 priority 字段
// 认领时 orderBy: { priority: 'desc', createdAt: 'asc' }
enum TaskPriority {
USER_MANUAL = 10, // 用户手动触发
SYSTEM_AUTO = 5, // 系统自动生成
BATCH_IMPORT = 1, // 批量导入
}
⑧ 可配置并发数
// 将 maxConcurrency 移入配置文件 config.toml
[tts]
maxConcurrency = 3 # MiniMax 建议 3,阿里云建议 5
| 维度 | 评分 | 说明 |
|---|---|---|
| 架构设计 | ⭐⭐⭐⭐ | LangGraph + 策略模式 + DB队列设计合理 |
| 错误处理 | ⭐⭐⭐ | 有重试/回退/兜底,但TTS侧降级不如LLM侧完善 |
| 并发控制 | ⭐⭐⭐ | 有局部并发控制,缺全局限制 |
| 数据一致性 | ⭐⭐ | 扣费原子性、状态机竞态仍有风险 |
| 可观测性 | ⭐⭐⭐ | 日志较完善,缺结构化指标 |
tts.service.ts 是否有多供应商降级,若无则实现processTtsTask 中扣费原子性问题generateSingleChapterContent 改用流式调用 + WebSocket 推送voice/speed/pitch 参数ttsTask 表增加 priority 字段支持任务插队maxConcurrency 移入 config.toml 可配置