更新时间:2026-06-14
TTS 音频生成时,根据文本内容自动匹配最佳 Instruct 指令(场景/角色/身份/情感),使 CosyVoice 合成的语音更贴合内容语境。
全文文本
│
├─ 🥇 LLM 全文分析(一次调用,<4s超时)
│ └─ 成功 → 用 LLM 结果生成每段 Instruct
│
└─ 🥈 关键词匹配降级(LLM超时/失败时)
└─ 逐段关键词检测 → 生成每段 Instruct
| LLM 分析 | 关键词降级 | |
|---|---|---|
| 调用次数 | 1次(全文本) | N次(逐段) |
| 延迟 | ~500ms | ~0ms |
| 成本 | ~¥0.001 | ¥0 |
| 否定词识别 | ✅ | ❌ |
| 语义理解 | ✅ | ❌ |
| 适用场景 | 主力 | 兜底 |
版本:2026-06-14 | 关联提交:
df6b3381
利用 CosyVoice 官方 Instruct 指令的 4 层能力(身份 / 角色 / 场景 / 情感),根据文本内容动态匹配最佳指令,替代之前"音色硬编码单一场景"的粗放模式。
| 层级 | 格式 | 示例 | 适用内容 |
|---|---|---|---|
| 身份 | 你正在以一个{身份}的身份说话,你说话的情感是{情感}。 |
故事机 | 童话、儿童故事 |
| 角色 | 你现在说话的角色是{角色},你说话的情感是{情感}。 |
一个旁白 | 小说、叙事类 |
| 场景 | 你正在进行{场景},你说话的情感是{情感}。 |
新闻播报 | 新闻、广告、解说等 |
| 仅情感 | 你说话的情感是{情感}。 |
happy | 任意无场景匹配的文本 |
| 场景 | 触发关键词示例 |
|---|---|
| 新闻播报 | 据报道、记者从、新华社、数据显示、今日头条 |
| 广告促销 | 限时、特价、优惠、折扣、立即购买、扫码 |
| 比赛解说 | 比赛、进球、得分、冠军、绝杀、裁判 |
| 一些儿童内容解说 | 小朋友、小熊、童话、魔法、幼儿园 |
| 语音导航 | 前方、左转、路况、出口、公里 |
| 脱口秀表演 | 哈哈、段子、吐槽、笑死、你知道吗 |
| 闲聊互动 | 你好、今天、觉得、怎么样(默认兜底) |
生成音频时,每段文本(≤1000字)独立分析,动态生成不同的 Instruct:
生成页面(/pages/create/index)"内容分析"卡片显示:
POST /api/tts/detect-emotion响应新增字段:
{
"data": {
"emotion": "happy",
"scene": "一些儿童内容解说",
"role": null,
"identity": "故事机"
}
}
| 文件 | 改动 |
|---|---|
server/src/modules/tts/tts.service.ts |
detectScene()、detectContentType()、generateSegmentInstruct() |
server/src/modules/tts/tts.controller.ts |
detect-emotion 返回 scene/role/identity |
my-uniapp-vue3/src/pages/create/index.vue |
前端展示场景/身份/角色信息 |
| 测试内容 | 后端 detect-emotion | 逐段 Instruct | 前端显示 |
|---|---|---|---|
| 故事类 | ✅ scene=儿童内容解说 identity=故事机 | ✅ 故事机身份 | ✅ 场景+身份正确 |
| 新闻类 | ✅ scene=新闻播报 | N/A(单段) | ✅ 场景正确 |
| 比赛类 | ✅ scene=比赛解说 | ✅ 比赛解说 | ✅ 场景正确 |
| 广告类 | ✅ scene=广告促销 | N/A | N/A |
| 脱口秀 | ✅ scene=脱口秀表演 | N/A | N/A |
| 导航类 | ✅ scene=语音导航 | N/A | N/A |
| 闲聊类 | ✅ scene=闲聊互动(兜底) | N/A | N/A |