Rendering and Export zh CN - on22s/Side-Story GitHub Wiki

English · 简体中文 · 日本語

渲染、编辑与导出音频

使用 Editor(编辑器),将已审校文本和声音分配转换为音频。使用 **Result(结果)**下载完成的 MP3,或创建其他格式的导出文件。

如果尚未准备好书籍,请先阅读脚本与审校和声音。设置方面的问题请参阅安装和故障排查。

完整渲染前先试听

选择几行有代表性的内容:旁白、主要角色、长句、特殊人名,以及情绪强烈的台词。逐行点击 Gen(生成),再使用该行的音频播放器试听。

请将实际朗读结果与文本对照。留意遗漏、重复、发音、多余声音、节奏,以及说话人的声音是否符合预期。绿色的 **done(完成)**状态仅表示已有生成的音频结果,并不证明这些方面都合格。

如果某个声音整体都不合适,请在 **Voices(声音)**中修正其卡片。如果只有一句需要不同的演绎,请编辑该行。请记住,普通克隆声音响应演绎指示的方式,与 Custom 和 LoRA 声音不同。

编辑单个文本块

Editor 中的每一行都包含 Speaker(说话人)、Text(文本)、Delivery(演绎指示)、**Status(状态)**和 Audio / Actions(音频/操作)。

  • 从该行的列表中选择不同的 Speaker(说话人)。
  • 编辑 Text(文本),填写实际要说出的文字。除非有意修改,否则请保留原文。
  • 编辑 Delivery(演绎指示),填写表演要求。
  • 使用展开箭头显示 Pause after (ms)(之后停顿,毫秒)。留空会使用常规停顿规则;0 表示该块后不增加额外停顿。
  • 使用 **Insert line below(在下方插入行)**添加一行同说话人的空白行。生成前先填入文本。
  • 使用 **Delete line(删除行)**移除一行。最近一次删除会短暂提供 **Undo(撤销)**提示,但不要把它当作长期恢复手段。
  • 使用 **Gen(生成)**生成或重新生成该行。

字段变化时会保存修改;生成前也会先保存该行的当前字段。修改文本、说话人或演绎指示,会解除该行与旧音频的关联,并将状态恢复为 pending(待处理)。导出前请重新生成。只修改停顿时,会在拼接音频时应用,无需重新进行 TTS 演绎。

如果编辑后报告保存失败,请保留已输入的文本,并在渲染前解决问题。Editor 修改存放在当前活动的文本块状态中:Script 中的 **Save Current(保存当前脚本)**不会归档这些修改。加载另一本书前,请参阅更新与备份。

渲染其余各行

**Render Pending(渲染待处理项)**会处理状态不是 **done(完成)**的非空文本块,并根据 TTS 模式选择适当路径:

  • 本地 TTS 对受支持的声音使用本地批量生成。Custom、Clone 和 LoRA 支持本地批处理;Voice Design 和角色合声路径则按顺序渲染。
  • 外部 TTS 会向已配置的一台或多台服务器发送并行请求。

主界面只有一个 Render Pending 控件,无需在单独的“Standard”和“Batch (Fast)”之间选择。

**Regenerate All(全部重新生成)**会重新渲染所有非空行,包括已完成的行,并会在替换现有音频前询问确认。仅在确实想重新生成整段演绎时使用。

渲染期间,**Cancel(取消)**会请求停止。请等待任务完成取消,然后检查各行状态。已完成的块仍然可用,**Render Pending(渲染待处理项)**可以继续处理未完成的工作。不要因为浏览器丢失状态连接就启动另一次渲染;请先检查当前音频任务及刷新后的行状态。

批次停止后,请查看成功、失败、已取消和未完成的文本块数量。合并前应处理好每个需要的行。渲染会跳过空行,因此不要在脚本中意外留下空缺。

内存与批处理

在 **Setup(设置)**中,**Parallel Workers(并行工作数)**控制本地外层批大小或外部请求并发数。**Max Items/Batch(每批最大条目数)**可限制本地子批次大小;0 表示使用应用的估算值。**Auto-configure(自动配置)**会在 12–20 GB 显卡上将 Parallel Workers 设为 4(在 RX 9070 XT 上实测比 2 快约 23%,Whisper 召回率相同,并通过试听检查)。请从较保守的数值开始,出现内存或显存不足错误后再降低这些值。

如果 LLM 共用同一块 GPU,请为它预留空间。**Compile Codec(编译编解码器)**目前不起作用:固定版本的 TTS 库(qwen-tts 0.1.1)在编译代码之外解码,渲染速度不变。请保持关闭。**Batch Seed(批次随机种子)**适用于本地批量 Custom/Clone/LoRA 生成;它并不保证每一种声音路径或安装环境都能产生完全相同的输出。请在自己的硬件上实测,不要假定某个吞吐量。

检查整体演绎

文本完整性

打开 Text integrity(文本完整性),检查新增、遗漏和替换。此检查将已保存的 Editor 文本与可用原文进行比较,而不是与音频实际说出的内容比较。仅有已保存脚本的 JSON,可能无法提供比对所需的原始正文。

如果出现 Needs delivery review(需要检查演绎指示),请检查受影响的指示。适当时使用 Retry delivery only(仅重试演绎指示),然后重新生成已修改的行。详见脚本与审校。

声音漂移

**Check Voices(检查声音)**使用 SpeechBrain/ECAPA 说话人分析来标记可能的声音漂移。SpeechBrain 已包含在当前应用依赖中,应用优先使用自身环境。较旧或自定义安装可能需要兼容的解释器;已配置的 Voice Lab 解释器可作为后备。安装可选的原生 Voice Tools 并不是前提。如果应用报告 not measured(未测量),表示检查不可用,而不是检查通过或失败。详见故障排查。

克隆声音与其参考片段比较,LoRA 声音与适配器的参考样本比较。Custom、Voice Design 和角色合声使用该说话人最早完成的音频块作为比较参考。对于这些声音,低漂移结果表示与该生成块保持一致,而不是与预期声音的一份独立录音相符。

使用 **flagged only(仅显示已标记项)**聚焦于报告的行,试听后按需用 **Gen(生成)**重新生成。检查不会自动重新生成任何音频。没有参考比较结果的行和未被标记的行,也仍需要合理的试听检查。

播放与停顿

使用 Play Sequence(按顺序播放),依次试听各行已生成的音频。这有助于检查演绎效果和相邻台词,但不能证明所有行都有音频,也不能替代对合并结果的试听。

合并/导出会使用 Setup 中的 **Speaker Change Pause(切换说话人时的停顿)**和 Same Speaker Pause(同一说话人时的停顿),初始值分别为 500 ms 和 250 ms。某行设置的 **Pause after (ms)(之后停顿,毫秒)**会覆盖该处的过渡停顿。最后一行不会添加末尾过渡停顿。

合并 MP3

  1. 确认每个需要的行都具有可用音频和正确文本。
  2. 点击 Merge All(全部合并)。
  3. 阅读 Continue with this source text?(使用此原文继续?)。对话框会报告与原文匹配、存在词语差异,或无法进行原文比对。遇到意外差异时,请取消并修正;只有检查过差异后,才选择 Continue with text(使用此文本继续)。
  4. 应用会打开 Result(结果)。在 **Generation Logs(生成日志)**中等待合并结果。任务运行期间可使用 Cancel Merge(取消合并)。
  5. 播放最终结果,并使用 Download MP3(下载 MP3)。

原文确认与已检查的文本绑定。如果合并开始前,原文或 Editor 文本块发生变化,应用可能会拒绝继续,并要求你重新检查。

**重要:合并和导出可能生成不完整的结果。**缺失或损坏的音频块会被跳过,任务结果/日志会报告跳过的数量。出现可下载文件或“Done”指示,并不能证明包含了每一行。请在导出前检查完成情况,并调查任何跳过音频块的消息。

导出带章节的 M4B

合并后,在 Result 中展开 M4B Export Options(M4B 导出选项):

  1. 按需填写 Title(标题)、Author(作者)、Narrator(朗读者)、**Year(年份)**和 Description(描述)。
  2. 可选择 Cover Image(封面图片),并等待上传结果。请使用你有权使用的封面。
  3. 保持 **Per-chunk chapters(每块一章)**关闭以自动分组章节,或将其打开,为每个已渲染的块添加导航标记。
  4. 可启用 Require ready(要求就绪),要求相关声音分配已标记为 Ready。
  5. 点击 **Export M4B(导出 M4B)**并等待完成。导出期间可使用 Cancel M4B(取消 M4B)。

M4B 包含 AAC 音频、元数据和章节标记。自动章节检测可识别 Chapter、Part、Prologue 和 Epilogue 等标题,以及一些结构性的旁白标题。未检测到标题时,会回退为每个文本块一章。请在播放器中检查章节结构,不要假定它与书籍目录完全一致。

Require ready 检查的是用户设置的声音就绪状态,不是音频完整性。请使用支持 AAC M4B 文件和内嵌章节标记的有声书播放器;不同播放器的行为可能不同。

导出独立章节文件

打开 Chapter-by-Chapter Export(逐章导出):

  1. 选择 Format(格式):MP3 或 WAV。
  2. 设置 Filename template(文件名模板)。可用字段为 {chapter_number}、{chapter_name}、{book_name}、{series_name} 和 {volume_number}。应用会添加扩展名。
  3. 选择 Number padding(编号补零位数),并填写模板中用到的书名、系列和卷号字段。
  4. 可在 **Chapters (optional)(章节,可选)**中输入章节选择,例如 1, 3, 5-7。留空表示所有章节。
  5. 按需设置 **Per-chunk(按块划分)**和 Require ready(要求就绪)。
  6. 仔细检查 Changed only(仅已变化项)。此项初始为启用状态,只导出其受跟踪音频文件或停顿设置自上次导出后有变化的章节。修改文本或演绎指示后,仍需先重新生成受影响的音频。它可以复用现有的、未变化的章节文件。如果希望重新写入每个所选章节,请关闭此项。
  7. 选择 Preview names(预览名称),检查将写入的文件名和文件数量,然后选择 Export chapters(导出章节)。
  8. 从结果列表中下载单个文件,或使用本区域的 Download all (zip)(全部下载,ZIP)。

章节导出采用与 M4B 相同的章节检测逻辑。启用 Changed only 时,预览显示零个文件,可能只是没有新内容需要写入。请检查已有下载列表;如果想重建完整的所选章节,请关闭 Changed only。

可以使用附近的控件保存、导出和导入文件名预设。它们存储在浏览器中,因此需要迁移到另一个浏览器或电脑时,请先导出。

导出到 Audacity

在 Result 中选择 Export to Audacity(导出到 Audacity)。下载的 ZIP 包含:

  • project.lof,用于一起导入各音轨
  • labels.txt,包含文本块标注
  • 每位说话人一条完整时长的 WAV 音轨,在该说话人未讲话的位置填充静音

解压文件包,然后在 Audacity 中打开 project.lof。通过 **File → Import → Labels(文件 → 导入 → 标签)**导入 labels.txt。请将所有解压文件放在一起,以便 LOF 找到音轨。同时播放这些已对齐的音轨,即可重建有声书时间线;但若导出时提示跳过音频,仍须考虑相应缺失。

下载并保留正确的文件

主 MP3 控件旁的 **Download All (zip)(全部下载,ZIP)**只会打包已经存在的主 MP3 和 M4B 文件。它不会生成缺失的 M4B,不包含 Audacity 文件包,也不会归档整个项目。章节区域有自己独立的 ZIP。

修改文本、声音或停顿后,请重新生成受影响的音频,并重建所需输出。之前可下载的导出文件可能仍然存在,即使新的导出已取消或失败也是如此。将文件视为最新结果之前,请检查最近一次任务的结果。

单行渲染音频位于 voicelines/ 下,采用稳定的文本块标识符和说话人名称命名,而非简单的时间线序号。请通过 Editor 或文本块元数据确认顺序。MP3 转换失败时,应用可能会保留 WAV。

加载另一个已保存脚本前,请先下载完成的导出结果。若要保留可继续编辑的渲染项目,请按照更新与备份操作。返回首页可查看其余指南。

来源

已对照发布的 main 提交 8c7a33cb310ab9264594a09ca27e48271585094f 核验:Editor 和 Result 控件、渲染与导出界面、导出与就绪检查路由、声音漂移参考、说话人分析环境,以及文本块编辑、停顿、章节检测和音频拼接。