版本: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 |