小说文本或字幕文件 → 多角色有声书音频。 默认 Edge TTS(500+ 音色),可选 MiMo TTS。 自动角色识别、情感标注、音色分配、异步并发生成。 Use when user provides novel/story text or subtitle file (.srt/.ass) and ask...
Novel2Voice — 小说/字幕转多角色语音是一项面向实际任务的技能,主要用于将小说文本自动转化为高质量多角色有声书;支持角色识别、情感标注、音色分配、停顿控制;
用户发小说文本要求有声书 / 音频 / 朗读;用户发字幕文件 (.srt/.ass) 要求转语音;单段文本朗读;❌ 用 mimo-tts。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
将小说文本自动转化为高质量多角色有声书。支持角色识别、情感标注、音色分配、停顿控制。 支持 SRT/ASS 字幕文件转语音(多编码自动检测),按时间轴对齐生成。
| 场景 | 使用本 Skill? |
|---|---|
| 用户发小说文本要求有声书 / 音频 / 朗读 | ✅ |
| 用户发字幕文件 (.srt/.ass) 要求转语音 | ✅ |
| 单段文本朗读 | ❌ 用 mimo-tts-wav |
| 唱歌 | ❌ 用 mimo-tts-wav + 唱歌 |
当用户第一次使用本 skill 时(或明确说「第一次用」「怎么用」「教我用」),按以下顺序引导:
向用户说明功能,同时后台检查环境:
🎬 有声书功能就绪!我来帮你把小说变成多角色有声书。 功能概览: • 自动识别角色 → 分配音色(男/女/老/少/方言) • 支持情感标签(温柔、愤怒、东北话、唱歌…) • 支持字幕文件(SRT/ASS)转语音 • 500+ 音色可选,全部免费 正在检查环境…
python3 -c "import requests; print('✅ requests')" 2>&1 || pip install requests
which ffmpeg && echo "✅ ffmpeg" || echo "❌ ffmpeg 未安装,音频转换将受限"
requests 缺失 → 自动 pip install requestsffmpeg 缺失 → 告知用户输出仅限 WAV 格式展示当前后端的音色选项,让用户选择(注意:Edge TTS 和 MiMo TTS 音色完全不同):
🎧 先选个音色吧! 【女声】晓晓(旁白/女主) · 晓依(温柔) · 晓涵(文艺) · 晓墨(情绪) · 晓睿(中年) · 晓双(少女) · 晓梦(甜妹) 【男声】云希(少年) · 云扬(播音/帝王) · 云健(硬汉) · 云夏(正太) · 云泽(老者) · 云枫(温润) 【方言】东北 · 河南 · 山东 · 四川 · 广西 · 陕西 · 吴语 【粤语】晓佳 · 晓蔓 · 云龙 【台湾腔】晓晨 · 晓雨 · 云哲 直接回复音色名就行,比如「用晓晓」。不确定的话我根据角色自动推荐。
完整音色详情(VoiceID、年龄、人设、适配角色)见 音色选择引导 章节。
如果用户选 MiMo TTS 后端,展示 MiMo 音色(冰糖/茉莉/苏打/白桦/mimo_default/Mia/Chloe/Milo/Dean),详见音色选择引导章节。
等用户回复音色偏好,或说「你推荐吧」直接进入 Step 2。
⚙️ TTS 后端选择: ✅ Edge TTS(默认)— 500+ 音色,免费,开箱即用,支持情感/语速/方言 → 推荐大多数场景使用 🔧 MiMo TTS — 9 个精品音色,支持音色设计/复刻/唱歌 → 需要 API Key(小米 MiMo 平台) 你选哪个?直接发小说文本的话,我会用 Edge TTS。
请提供你的 MiMo API Key(在 https://mimo.xiaomi.com 控制台获取)。 我会保存到本地 .env 文件,后续自动读取,不用重复输入。
{baseDir}/.env提供示例文本,让用户 30 秒内听到效果:
📝 试试效果?发一段小说文本给我,或者用这段示例: "张三冷笑一声:你以为跑得掉? 李四浑身发抖,往后退了两步:我……我不是故意的。 旁白:夜色渐深,巷子里只剩下两个人的脚步声。" 我会自动分配角色音色,生成有声书给你听。
首次引导完成后,后续使用直接发小说文本即可,进入 Workflow 流程。
首次使用前验证环境:
python3 -c "import requests; print('✅ requests')" 2>&1 || pip install requests
which ffmpeg && echo "✅ ffmpeg" || echo "❌ ffmpeg 未安装"
python3 --version | head -1
| 缺失项 | 影响 | 降级方案 |
|---|---|---|
requests |
无法调用 API | 自动 pip install requests |
ffmpeg |
无法 WAV→MP3 | 保留 WAV 输出 |
| 网络不通 | 无法连接 TTS | 提示用户检查网络 |
重要:Edge TTS 和 MiMo TTS 是两套完全不同的音色系统,音色名称不互通。 Agent 必须根据当前使用的后端展示对应的音色列表。
当使用 Edge TTS 时(默认),展示以下音色:
👩 女声:
👨 男声:
🌍 方言: 云彪(男)/晓北(女)(东北)、云登(男)(河南)、云翔(男)(山东)、云熙(男)(四川)、云奇(男)(广西)、晓妮(女)(陕西)、云哲(男)/晓彤(女)(吴语) 🇭🇰 粤语: 晓佳(女)、晓蔓(女)、云龙(男) 🇹🇼 台湾腔: 晓晨(女)、晓雨(女)、云哲(男)
直接回复音色名称即可,如「用晓晓」「旁白用云扬,女主用晓依」。
当用户选择 MiMo TTS 后端时,展示以下音色(注意:名称与 Edge TTS 完全不同):
🎤 中文音色:
🌐 英文音色:
MiMo 音色支持「音色设计」和「音色复刻」,详见 mimo-tts-api.md。
本地用户可打开试听页面,支持搜索、分类筛选、一键复制音色名称:
{baseDir}/scripts/voice_samples/index.html
注意:HTML 页面仅包含 Edge TTS 音色样本,不含 MiMo 音色。
用户发送小说 ↓ Agent 分析章节 → 提取角色(名字/性别/年龄/性格) ↓ Skill 提供音色库(Edge TTS + MiMo TTS) ↓ Agent 自动匹配音色 ↓ 用户确认 → Skill 生成音频
当文本 < 500 字且角色 ≤ 3 个时,跳过首次引导和音色库展示,直接:
输入预处理: 如果用户发的是聊天文本(非文件路径),Agent 必须先写入 {output_dir}/input.txt,再调用脚本。
Agent 收到小说文本后:
| 角色名 | 性别 | 年龄段 | 性格 | 说话风格 | 出场频率 |
|---|---|---|---|---|---|
| 许七安 | 男 | 青年 | 机智幽默 | 活泼偶尔深沉 | 高 |
分析要点:从称谓推断性别/年龄,从对话推断性格,从行为推断风格。
Agent 根据当前后端向用户展示可用音色(详见 音色选择引导):
Agent 根据角色特征自动匹配最佳音色:
输出模板(Edge TTS 后端):
🎭 角色音色方案(Edge TTS): | 角色 | 音色 | VoiceID | Style | 理由 | |------|------|---------|-------|------| | 旁白 | 云扬 | zh-CN-YunyangNeural | narration-professional | 浑厚播音,适合叙事 | | 张三 | 云健 | zh-CN-YunjianNeural | serious | 冷笑/威胁→低沉硬汉 | | 李四 | 云希 | zh-CN-YunxiNeural | fearful | 发抖/害怕→少年惊恐 | 确认?可修改,如「旁白换晓晓」「李四用云夏」。
输出模板(MiMo TTS 后端):
🎭 角色音色方案(MiMo TTS): | 角色 | 音色 | 风格描述 | 理由 | |------|------|----------|------| | 旁白 | mimo_default | 中性平稳 | 默认旁白 | | 张三 | Dean | 低沉磁性 | 冷笑/威胁→成熟反派 | | 李四 | Milo | 清亮紧张 | 发抖/害怕→少年感 | 确认?可修改,如「张三换白桦」。
🔴 CHECKPOINT · 🛑 STOP — 必须等待用户回复后才能继续生成。禁止未经确认直接执行脚本。
展示推荐方案 + 完整音色列表,用户可修改。
用户回复方式:
路径变量默认值:
{output_dir} = {baseDir}/output/(或用户指定路径){input_file} = 用户提供的文件路径;若为聊天文本,Agent 先写入 {output_dir}/input.txt# Edge TTS 模式(默认,推荐)
python3 {baseDir}/scripts/generate_audiobook.py --auto {input_file} {output_dir} --async --concurrent 5
# MiMo TTS 模式
python3 {baseDir}/scripts/generate_audiobook.py --auto {input_file} {output_dir} --tts-backend mimo
生成完成后 verify 音频文件是否存在且可播放。
| 失败场景 | 检测方式 | 一线修复 | 仍失败兜底 |
|---|---|---|---|
| 单条 TTS 超时(>30s) | 脚本返回 timeout/error | 重试 1 次 | 跳过该条,标记 [SKIPPED],继续后续 |
| 角色性别无法判断 | 分析结果 gender=unknown | 询问用户 | 使用中性音色(晓晓/mimo_default) |
| 用户文本为空或无对话 | 提取角色数=0 | 告知用户"未检测到对话" | 全文作为旁白朗读 |
| Edge TTS 端点不可达 | HTTP 连接失败 | 自动切换备用端点 | 提示用户检查网络,无法降级 |
| 输出文件为 0 字节 | verify 检查文件大小 | 删除空文件,重新生成该段 | 报告失败段落编号,让用户决定是否重试 |
| ffmpeg 缺失 | Preflight 检查 | 告知用户仅输出 WAV | 跳过 MP3 转换步骤 |
| 用户发的是聊天文本非文件 | 输入无文件路径 | Agent 先写入 {output_dir}/input.txt |
— |
| Windows 编码乱码(角色名) | 日志中角色名显示为乱码 | 用 python(非 python3)执行 |
手动构建 segments.json 绕过自动解析 |
自动识别并处理以下输入格式:
| 输入 | 处理 |
|---|---|
| 纯文本段落 | 直接作为小说原文 |
.txt 文件 |
读取后处理 |
| 复制粘贴片段 | 自动识别为小说片段 |
| 章节标题开头 | 自动识别为章节内容 |
.srt / .ass |
字幕模式,按时间轴对齐 |
有声书、音频、朗读、配音、TTS、转语音、生成语音、语音合成、字幕转语音
在文本中嵌入风格标签:
(温柔)晚安,好梦。 (东北话)哎呀妈呀,这天儿也忒冷了吧! (紧张)[深呼吸]呼……冷静。 (唱歌)原谅我这一生不羁放纵爱自由。
支持:基础情绪、复合情绪、语调、音色、人设、方言、角色扮演、唱歌。 完整标签列表见 references/voice-catalog.md。
| 后端 | 端点 | Key | 音色数 | 优先级 |
|---|---|---|---|---|
| Edge TTS | tts.kalaok.cc.cd/v1/audio/speech |
公开 sk-1234567890 |
500+(支持 style/speed/pitch/role) | 高(默认) |
| MiMo TTS | api.xiaomimimo.com/v1 |
需要 MIMO_API_KEY |
9 种 | 低(需手动切换) |
--tts-backend mimo 切换到 MiMo TTS{baseDir}/.env 是否存在 MIMO_API_KEY{baseDir}/.env| 变量 | 说明 | 默认 |
|---|---|---|
TTS_BACKEND |
强制后端 (mimo/edge/auto) |
edge |
EDGE_TTS_ENDPOINT |
Edge TTS 端点 | tts.kalaok.cc.cd/v1/audio/speech |
EDGE_TTS_KEY |
Edge TTS Key | 公开默认值 |
MIMO_API_KEY |
MiMo TTS Key | 空 |
当用户上传字幕文件并要求生成语音时,按以下流程执行。
| 用户输入 | 触发 |
|---|---|
上传 .srt 文件 |
✅ |
上传 .ass / .ssa 文件 |
✅ |
| 说"字幕转语音"/"按字幕生成音频" | ✅ |
| 说"subtitle to audio" | ✅ |
python3 {baseDir}/scripts/subtitle_parser.py subtitle.srt
自动执行:
{Actor:角色名} 或 Dialogue 行检测完成后,告知用户结果并询问:
📄 字幕文件已解析: - 格式:SRT - 条目数:N 条 - 总时长:X 分钟 - 检测语言:中文(置信度 95%) - 说话人:张三、李四 请问您想: 1. 直接用原语言生成语音 2. 翻译成其他语言再生成(请告诉我目标语言)
python3 {baseDir}/scripts/generate_audiobook.py --subtitle subtitle.srt output_dir
| 重叠情况 | 修复策略 |
|---|---|
| 重叠量 < 较短条目 50% | 缩短前一条 end_ms |
| 缩短后时长 < 200ms | 前一条保留 200ms,后一条后移 |
| 重叠量 ≥ 50% | 按文本长度比例重新分配 |
| 完全包含 | 合并为一条 |
修复后保存:output_dir/subtitle_fixed.srt
逐条生成 TTS,每句自动匹配字幕时间槽:
--max-speed 可调)使用 adelay 滤镜精确控制播放位置,空隙填充静音。
output_dir/ ├── subtitle_audio.mp3 # 完整音频 ├── subtitle_audio.wav # WAV 版本 ├── subtitle_fixed.srt # 修复后的字幕 ├── timeline.srt # 时间轴副本 ├── segments/ # 单条音频 └── generation_log.json # 生成日志
# 基础用法
python3 {baseDir}/scripts/generate_audiobook.py --subtitle subtitle.srt output_dir
# 指定说话人音色
python3 {baseDir}/scripts/generate_audiobook.py --subtitle subtitle.srt output_dir --speaker-voices '{"旁白":"冰糖","张三":"Dean","李四":"Mia"}'
# 指定说话人风格
python3 {baseDir}/scripts/generate_audiobook.py --subtitle subtitle.ass output_dir --speaker-voices '{"旁白":"mimo_default","张三":"Dean"}' --speaker-styles '{"旁白":"温柔女声 语速适中","张三":"低沉磁性"}'
# 使用默认音色
python3 {baseDir}/scripts/generate_audiobook.py --subtitle subtitle.srt output_dir --default-voice "冰糖"
# 禁用重叠修复
python3 {baseDir}/scripts/generate_audiobook.py --subtitle subtitle.srt output_dir --no-fix-overlaps
# 禁用语速适配
python3 {baseDir}/scripts/generate_audiobook.py --subtitle subtitle.srt output_dir --no-speed-adjust
# 自定义加速上限
python3 {baseDir}/scripts/generate_audiobook.py --subtitle subtitle.srt output_dir --max-speed 2.5
# 导出翻译用 JSON
python3 {baseDir}/scripts/generate_audiobook.py --subtitle subtitle.srt output_dir --export-srt
# 导入翻译后的 JSON
python3 {baseDir}/scripts/generate_audiobook.py --subtitle subtitle.srt output_dir --import-translated translated.json --target-lang en
| 文档 | 内容 |
|---|---|
| voice-catalog.md | 完整音色库(Edge TTS + MiMo)+ 风格标签 + 角色映射 |
| mimo-tts-api.md | MiMo TTS API 详细参数 + 调用示例 |
| edge-tts-annotation-guide.md | Edge TTS 标注指南 |
| generated-long-body.md | 长文本处理扩展说明 |
| 问题 | 解决 |
|---|---|
| 生成无声音 | 检查 ffmpeg 是否安装 |
| Edge TTS 连接失败 | 脚本自动切换备用端点 |
| 中文乱码 | 确保文件 UTF-8 编码 |
| 角色识别不准 | 手动在 segments.json 中调整 |
| 生成太慢 | 使用 --async --concurrent 5 并发 |
| 验证输出 | verify 生成的音频文件是否存在且可播放 |
相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.1万人学习
共49课时 | 82.6万人学习
最新文章