十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

VoiceStudio:从素材清洗到批量合成的语音工作台

VoiceStudio:从素材清洗到批量合成的语音工作台 我最早动手做 VoiceStudio起因特别朴素手上有一批教学视频和有声稿要配音需要长期保持同一个音色外包配音的报价按分钟走改一句就要重录一遍成本高、周期还长。商用云端语音服务倒是方便可音色不是我的按字符计费内容一多账单就失控授权边界也说不清楚。折腾了一圈之后我决定把整条链路收回到自己手里做成一个可控、可复用、能持续迭代的工作台这就是 VoiceStudio。需要先说清楚一点VoiceStudio 不是一个模型也不是一个软件包它是一套围绕人声搭起来的工程流水线。它的职责包括素材入库、清洗切分、标注对齐、音色训练、批量合成、后期修整、质量抽检这七个环节模型只是其中一段前后两端的手工活才是决定成品能不能听的关键。我见过太多人把注意力全放在用哪个模型上结果素材是手机在客厅随手录的混响和空调噪声全在里面再好的模型也救不回来。这篇内容写给三类人看一是想养一个自己专属音色的内容创作者比如做有声书、播客、课程讲解二是手里有一堆历史音频、想批量复用声音资产的团队三是想把语音合成能力接进自己产品里的开发者需要知道工程上会卡在哪里。下面我按实际搭建顺序讲从需求拆解一路讲到踩坑速查表参数给到位理由也讲清楚看完基本能照着复刻一套。1. 搭 VoiceStudio 之前需求拆解与方案选型1.1 三个被现实逼出来的硬需求在动手写第一行代码之前我花了差不多两周时间只做一件事把需求写清楚。这一步看着虚实际上省了我后面至少一个月的返工。最后收敛出三个硬需求。第一是音色一致性。同一批内容里第 1 集和第 30 集的音色不能有可感知的漂移。这个要求听起来理所当然但真正做过长内容的人都知道模型在长文本上跑着跑着就会飘句子末尾音调失衡、气口变紧甚至偶尔换个腔调。解决它靠的不是单一参数而是断句策略、参数锁定、推理种子固定这三件事一起上。第二是批量吞吐。我不是一句一句点着生成的而是整篇稿子丢进去十几分钟后拿到一批成品文件。这要求系统具备任务队列、失败重试、断点续跑的能力。手动操作为什么不行因为一条 30 分钟的音频按 60 字一句切大概是 200 到 300 次推理调用中间任何一次失败都要从头来人的耐心撑不过三轮。第三是可回滚。每个音色版本、每批输出、每次参数调整都要留痕。我把音色版本号写成voice-{名称}-v{主版本}.{次版本}比如voice-narrator-v1.3。为什么要这么细因为我踩过一个坑调完参数觉得这次明显更好把旧版本覆盖了第二天客户说还是上一版自然结果无从恢复只能重训。从那以后任何一次覆盖式操作都被我禁掉了。注意需求阶段最容易被忽略的是删除和回滚。新建、生成、导出这些正向流程大家都会想回滚路径往往要等到出事才补那时候已经晚了。1.2 三条技术路线的取舍路线选择这件事我前后试过三种各有各的代价最后选了混合方案。把对比摊开来看会更清楚。路线上手成本单位成本音色可控度适合场景商用云端语音接口极低接入半天按字符计费量大后陡增低音色由服务方定义短期项目、量小、要求快速上线全开源本地模型中等偏高环境调试要几天一次性硬件投入边际成本接近零高可微调、可换引擎长期运营、音色要专属、数据敏感混合架构中等弹性热路径本地、冷路径云端中高峰值波动大、想留退路我最终落地的是混合架构但重心压在本地。日常批量合成走本地推理遇到突发的超大任务量或者临时缺机器再把一部分非核心内容切到云端接口兜底。这么设计的核心逻辑是边际成本。本地推理跑 1 万字和跑 100 万字的成本差异只有电费和机器折旧而云端是线性叠加的。内容量一旦过了某个门槛本地方案的经济性会迅速反超。另一层考虑是数据边界。有些素材是访谈原声、内部培训录音这类内容我不希望离开自己的机器。混合架构让我可以按素材敏感度分流而不是一刀切。1.3 最终架构五层流水线把系统拆开看VoiceStudio 分成五层层与层之间用文件系统和消息队列解耦任何一层坏了都不影响其它层的存量数据。素材层原始录音、清洗后的切片、对应的文本标注全部落盘目录按raw / clean / meta三分。训练层特征提取、微调训练、音色版本打包产出物是一个带版本号的音色包目录。推理层常驻的合成服务暴露 HTTP 接口接受文本和音色 ID返回音频。调度层任务队列、并发控制、失败重试、进度上报。工作台层前端界面负责试听、对比、批量提交、导出。分层的价值在调试时最明显。有一次合成结果里出现规律的咔哒声我先怀疑模型换音色包之后依旧接着怀疑推理参数调完还是响最后定位到调度层写入文件时没做原子写两个并发任务抢同一个临时文件名导致音频块被覆盖。这个 bug 如果系统是一坨脚本糊在一起排查时间至少翻三倍。2. 素材准备与数据清洗决定音色上限的地基2.1 录音规范与最低硬件配置素材质量决定天花板这句话不是吓唬人。我做过对比实验同一段文本、同一个模型一组用安静房间加电容麦录的干声一组用手机在客厅录的带混响音频前者的自然度和稳定性明显更好而后者无论怎么调参数都带着一层糊感像隔着一层毛玻璃说话。我的录音规范大概是这样的采样率 48 kHz、位深 24 bit单声道嘴到麦克风距离控制在 20 到 25 厘米稍微偏轴 15 度左右能明显减少齿音和气流冲击房间混响时间尽量压到 0.3 秒以内。普通住宅怎么达到我的土办法是在房间里挂厚窗帘、铺地毯或者干脆躲进衣柜里录衣服就是天然的吸音棉。实测下来衣柜方案的干声质量相当能打。设备上不必一上来就砸钱。一支千元级的电容麦加一个带幻象电源的声卡就能开工关键是保持整套素材用同一套设备、同一个距离、同一个房间。为什么强调一致性因为模型学的是这个音色在这套录音条件下的表现如果一半素材是近场录的、一半是远场录的模型会把录音条件的差异也当成音色的一部分学进去合成结果就会出现忽远忽近的怪现象。2.2 切分、降噪、去混响的具体参数拿到一整段长录音之后第一步是切分。目标是每段 3 到 10 秒太短了缺少上下文模型学不到完整韵律太长了训练效率低而且一句话里如果包含语气变化容易把多种情绪混在一起。切分我用静音检测的思路ffmpeg直接能干ffmpeg -i raw.wav -af silencedetectnoise-35dB:d0.35 -f null - 2 silences.log这里的两个参数值得说明noise-35dB是静音判定的门限d0.35是判定为静音的最短时长。门限怎么定如果环境底噪高门限要往上调比如-30dB如果录音很干净可以压到-40dB。时长设成 0.35 秒是因为自然语句之间的停顿通常在 200 到 400 毫秒设太短会把词内的小停顿也切掉设太长又会把两句话粘在一起。降噪这件事我特别想提醒能不用就不用非用不可就轻着用。谱减法类的降噪处理过度会在音频里留下一种俗称水声的金属化伪影人耳对这种伪影极其敏感而模型会把伪影当成音色特征学进去合成出来的声音就带着一层塑料味。我的做法是分级处理底噪轻微的直接跳过降噪底噪明显的用轻量级降噪强度控制在 30% 以内混响严重的才考虑人声分离类的处理。去混响的替代方案比降噪更省事重新录。凡是能重录的素材我都优先重录因为处理带来的损伤是不可逆的而重录只是一次时间成本。2.3 文本标注与音素对齐标注是整个流程里最枯燥、也最容易被低估的环节。做法是先让语音识别模型跑一遍粗转写再人工逐条校对。import whisper model whisper.load_model(large-v3) result model.transcribe(clean.wav, languagezh, word_timestampsTrue) for seg in result[segments]: print(f{seg[start]:.2f}\t{seg[end]:.2f}\t{seg[text].strip()})粗转写能省掉 80% 的敲字工作但剩下 20% 必须人工过一遍。我总结了几类必须处理的问题数字与符号2024年、3.5%、AI这类写法要统一转成模型能正确读的形式比如二零二四年、百分之三点五、A I。不统一的话同一段文本在不同批次里可能被读成完全不同的东西。标点统一全角半角混用、省略号形式不一致都会影响断句逻辑。我在入库阶段就做一次正则清洗把符号收敛到一套标准。错别字与口误转写模型在专业术语上错得很有规律比如人名、型号、行业黑话。这部分必须靠人工而且最好由熟悉内容的人来校。时长匹配文本长度和音频时长要大致对得上。如果一条 8 秒的音频转写出 60 个字多半是转写重复了或者音频被截断这条直接剔除。标注完成后做一次音素对齐把每个字的时间边界标出来。对齐好的数据在训练时能显著提升韵律的稳定性尤其是句尾的收束感。这一步的文件格式我统一用带起止时间的表格方便后续脚本读取和校验。2.4 数据集体检清单训练前我一定会跑一遍体检把问题数据挡在门外。这一步花十分钟能省掉后面几小时的无效训练。检查项合格标准不达标怎么处理总时长微调建议 30 分钟以上1 小时更稳补录或用同类素材扩充单条时长3 到 10 秒重新切分或合并底噪水平安静段低于 -45 dB重录优先轻降噪次之削波比例峰值不超过 -1 dBFS无削波重新录制削波不可修复文本准确率人工校对后错误率低于 0.5%逐条复核音色分布单一说话人无串音剔除串音片段情绪分布以平稳叙述为主情绪起伏不超过三成剔除情绪过强的片段最后一行值得多说一句。早期我贪心把所有素材都塞进去包括一些情绪激动、语速很快的片段结果合成出来的音色不稳时好时坏。后来我把情绪起伏大的片段单独拎出来做成一个表现力增强子集只在需要的时候按比例混入主音色的稳定性立刻就上来了。3. 核心引擎搭建从环境配置到稳定出声3.1 环境与显存预算环境这块我的建议是先算显存再选模型顺序不要反。显存不够会导致训练中途崩或者在推理时被迫降批量速度掉得很难看。粗略的估算方式是这样的微调训练时显存占用大致与批量大小、序列长度、模型参数量成正比。以参数量在几亿级别的模型为例8 GB 显存能支撑批量 2、序列长度 256 的微调12 GB 能上批量 4 到 616 GB 以上就可以比较舒服地做全参数微调。如果显存吃紧优先考虑低秩微调方案它只训练一小部分附加参数显存占用能压到全量微调的三分之一左右而音色相似度的损失在多数场景下可以接受。推理阶段的显存需求低得多几 GB 就能跑所以我会把训练和推理分成两台机器或者分时复用同一台。训练占满显存的时候推理服务会因为抢不到资源而超时这个坑我踩过一次队列里积压了上百个任务排查了半天才发现是训练任务把显存吃满了。3.2 训练参数怎么定参数不是玄学一条条对下来其实有迹可循。学习率微调场景我一般从1e-4起步跑 200 步观察损失曲线。如果损失下降很慢试2e-4如果损失来回震荡甚至发散降到5e-5。全量微调的话再降一个数量级。批量大小在显存允许的前提下尽量大梯度更稳。显存不够时不要硬压批量宁可改用梯度累积把多次小批量的梯度攒起来再更新。训练轮数微调不是越多越好。我的经验是音色相似度在前 20 到 30 轮快速上升之后趋于平缓再往后过拟合的风险明显增加——表现是合成音频开始带出训练集里的杂音、气口甚至偶尔复现原素材里的咳嗽声。验证集一定留出 5% 到 10% 的数据不参与训练每若干轮合成一段固定文本做对比。只听训练集上的效果等于自己给自己打分。判断收敛有个很实用的土办法固定一段 30 字左右的文本每 5 轮生成一次按时间顺序排在一起连着听。如果你发现第 40 轮和第 20 轮听起来更像真人但也更不像本人那就是过拟合的信号该停了。3.3 推理参数与音色稳定性推理参数决定了同样的模型能输出什么质感。我常用的区间如下都是实听调出来的不是抄来的。参数常用区间作用与调整方向温度0.6 到 0.8越高越有变化也越容易飘长文本建议压到 0.6top_k20 到 40限制采样候选数偏低更稳top_p0.75 到 0.85与温度配合控制整体随机性重复惩罚1.2 到 1.4抑制重复咬字过高会让语调发僵语速0.92 到 1.08偏离太多会出现拖音或赶字随机种子固定保证同参数下结果可复现参数确认之后一定要锁死并存进音色版本包里。我试过一次在批量任务中途顺手调了下温度结果同一批输出的前后段风格不一致只能整批重做。从那以后所有影响输出的参数都写进配置文件改动必须通过新版本号走。3.4 批量合成与队列调度批量合成是 VoiceStudio 真正的价值所在。核心思路是把长文本切成句子逐句推理再按原顺序拼接。下面是我实际在用的调度骨架。import json import hashlib from pathlib import Path def split_sentences(text, max_len60): 按中文标点断句控制在 max_len 字以内 seps 。… buf, out , [] for ch in text: buf ch if ch in seps and len(buf) 8: out.append(buf.strip()); buf elif len(buf) max_len: out.append(buf.strip()); buf if buf.strip(): out.append(buf.strip()) return out def task_key(text, voice_id, params): raw json.dumps([text, voice_id, params], sort_keysTrue) return hashlib.md5(raw.encode()).hexdigest() def enqueue(items, out_dir): Path(out_dir).mkdir(parentsTrue, exist_okTrue) for i, item in enumerate(items): sentences split_sentences(item[text]) for j, s in enumerate(sentences): key task_key(s, item[voice_id], item[params]) print(json.dumps({ key: key, text: s, voice_id: item[voice_id], params: item[params], target: f{out_dir}/{i:04d}_{j:03d}.wav }, ensure_asciiFalse))这段代码里有三个设计决定值得解释。断句阈值设 60 字是因为再长模型容易出现后半句气息不足、语调下坠最小长度设 8 字避免把好。这种超短句单独送去推理短句缺乏上下文合成出来特别生硬任务键用内容哈希同一个句子在不同批次里会命中缓存重复内容直接复用结果长文档里重复的句式不少这一步实测能省掉一至两成的算力。队列侧我用的是生产者—消费者模型多个工作进程并发消费每个任务完成后更新状态。失败任务进入重试队列超过三次的进死信目录人工介入。这套机制上线之后我基本可以提交任务去睡觉早上回来看结果。4. 工程化封装把模型变成能用的工作台4.1 服务层设计推理服务我按无状态来设计服务本身不保存任何音色数据只接收音色 ID 和参数从音色包目录加载生成完就释放。好处是可以随意横向扩容加机器就是加副本不需要同步状态。接口只保留几个必要的健康检查、单句合成、音色列表、任务提交、任务查询。返回体是个异步任务 ID 而不是音频本身因为长文本合成的耗时可能到分钟级同步阻塞接口会把连接池拖爆。音频生成完后落到对象存储接口返回访问路径。提示推理服务一定要加超时和并发上限。我遇到过某个句子让模型陷入异常状态单次推理卡了几分钟没有超时保护的话那个工作进程就一直挂着队列越积越长。4.2 前端工作台的关键交互工作台的界面不需要花哨但有三处交互必须做好否则日常使用会很难受。第一处是盲测对比。同一句话用两个音色版本或两组参数生成界面上只显示 A 和 B不显示具体是什么选完之后再揭晓。为什么强调盲测因为人对参数有心理预期知道这是调过的版本就容易觉得更好听盲测能把这个偏差压下去。我用这套方法筛参数结论比主观判断靠谱很多。第二处是逐句替换。一篇长稿里通常只有几个句子不满意如果整批重做时间和算力都浪费。工作台要支持定位到单句、单独重生、自动拼接回原轨。这要求切分信息全程保留拼接时按原始时间轴对齐。第三处是参数快照。每次提交任务时把当次使用的全部参数、音色版本、模型版本记下来写在输出的元数据文件里。半年后回头看某条成品能精确知道它是怎么来的。4.3 存储与版本管理存储结构我按三层组织原始素材、中间产物、成品。原始素材只读永不修改这是底线中间产物可重建随时能删成品按项目归档带完整的元数据。音色包的结构大概是这样voice-narrator-v1.3/ ├── model/ ├── config.json ├── params.lock ├── dataset_manifest.json └── changelog.mdparams.lock是关键里面锁死了推理参数、随机种子、断句阈值。dataset_manifest.json记录了训练用的每一条素材及其校验值方便回溯这一版到底用了哪些数据。changelog.md是我用最笨的办法维护的每次改动都写一句话比如v1.3剔除 12 条带明显呼吸声的片段温度从 0.75 降到 0.65。这份看起来简陋的记录在我需要对比版本差异的时候屡次救命。4.4 长文本处理的断句与拼接拼接是长文本合成里最容易出问题的地方。逐句生成的音频直接首尾相接会听起来像机器人在念单词因为句间的停顿完全均匀缺少自然语言里的节奏变化。我的处理方式是三件事叠加。第一按标点分配静音时长句号后 500 毫秒逗号后 220 毫秒顿号后 150 毫秒问号和感叹号后 550 毫秒。这些数字不是随便定的是照着几个人工录制的样本测出来的平均值。第二段间留长间隙自然段之间给 800 到 1000 毫秒让听众有喘息的空间。第三加交叉淡化拼接处做 20 毫秒的淡入淡出叠加避免波形突变产生咔哒声。# 生成指定时长的静音 ffmpeg -f lavfi -i anullsrcr48000:clmono -t 0.5 -q:a 9 silence_500ms.wav # 拼接并做响度归一 ffmpeg -i concat:part1.wav|silence_500ms.wav|part2.wav \ -af loudnormI-16:TP-1.5:LRA11 \ -ar 48000 -ac 1 final.wav此外还有一处细节拼接时整篇的语速应该统一。如果某一句因为文本特殊被合成得特别快整段听起来会很跳。我的做法是合成后检测每句的实际时长与预期时长偏差超过 25% 的句子标出来人工听一遍再决定是否重生。5. 后期处理与质量抽检决定成品能不能用的最后一段5.1 响度标准与均衡处理模型输出的音频响度往往是波动的同一批文件直接交付会出问题听众在播放列表里切歌音量忽大忽小体验很差。所以后期必须做响度归一。行业里常用的几个目标是这样的播客和有声书大概在 -16 LUFS视频平台常见 -14 LUFS短视频场景普遍压得更狠。峰值统一控制在 -1 dBTP 以内留一点余量避免转码后削波。我的做法是先测一遍整批文件的响度分布取中位数作为目标值而不是硬套一个数字这样处理量最小音质损伤也最小。均衡方面我保持克制。合成音频常见的问题是中高频偏硬、低频偏虚我的处理通常只有两处一是 200 到 400 Hz 之间做轻微衰减去掉闷感二是 3 kHz 以上做极轻的搁架式调整让咬字更清楚。所有的增益调整不超过 2 dB因为超过这个幅度人耳就开始能听出处理痕迹了。5.2 呼吸、停顿与韵律的补丁合成音频最大的违和感来源不是音色是呼吸。真人在说话时每 8 到 15 秒会自然换气句间有长短不一的停顿情绪激动时呼吸会变重。合成音频如果整段没有呼吸声听久了会让人觉得这口气怎么这么长产生不适。我的处理方式是把呼吸声当作独立素材管理。做法是在素材清洗阶段把原始录音里自然的呼吸片段单独切出来存成一个小素材库合成时在长句结束后按位置插入音量压到主音量的 -18 dB 左右。为什么不用模型直接生成呼吸因为生成出来的呼吸往往不均匀而且会干扰音色特征。用真实素材反而更自然而且成本极低。停顿的微调也是个细活。批量合成出来的停顿是规则化的我会跑一遍脚本检测所有超过 600 毫秒的停顿位置随机把其中三成缩短 100 到 200 毫秒。这个动作听起来微不足道但实测下来整段音频的机械感会明显下降因为真实语言里的停顿本来就不均匀。5.3 A/B 质检与抽检比例成品交付前一定要过质检。我用的流程分三层。第一层是自动检测脚本跑一遍检查项目包括文件能否正常解码、时长是否与文本长度匹配、响度是否在目标区间、峰值是否超标、静音段是否异常、有无长时间无声。这一层能过滤掉大约九成的低级错误。第二层是文本回溯把合成音频再跑一次语音识别和原始文本做比对算字错误率。字错误率超过 3% 的条目单独拎出来人工听。这个方法有个局限识别模型本身也有误差所以不能当成绝对标准只能用来定位可疑条目。第三层是人工抽检比例按内容重要性定一般内容抽 10%重点内容抽 30%关键内容全检。抽检时我固定听三个维度——音色像不像、节奏顺不顺、有没有杂音。每个维度打 1 到 5 分低于 3 分的整批回炉。注意抽检一定要随机。我早期图省事总是从前几条开始听结果前几条是刚调完参数生成的质量最好后面批量跑的段落问题一堆等发现的时候已经交付了一半。6. 踩坑记录与常见问题速查6.1 音色问题跑偏、电流声、爆音音色跑偏是最常见的问题表现是同一条音色在长文本后半段听起来不像本人了。可能的原因按概率排序一是断句太长超过 60 字的句子后半段气息失真二是温度参数偏高长文本累积随机性三是素材里有混响模型在长句上把混响放大成音色的一部分。排查顺序就按这个来先缩短断句再降温度最后检查素材干湿度。电流声或者说金属感的嗡鸣八成来自降噪处理过度。我的处理方式是回退到降噪前的版本用更轻的强度重跑。如果原始素材本身就有这种噪声那就只能重录任何处理都只是掩盖。爆音或者说削波的产生通常有两个环节合成输出的峰值超出范围或者后期增益推得太狠。前者在推理后加一个峰值限制器就能解决后者检查处理链里各环节的增益累积我见过增益被叠了两三次没人注意的情况。6.2 训练问题不收敛、过拟合、速度异常训练不收敛的表现是损失曲线横盘或者剧烈震荡。我遇到过的原因有三类学习率过高、标注文本与音频严重不匹配、批量太小导致梯度噪声过大。逐项排查的顺序是先降学习率到5e-5跑 100 步看趋势再随机抽 20 条数据人工核对文本与音频是否对应。过拟合的识别方法前面提过就是固定文本的定期对比。一旦发现更像真人但更不像本人立刻停止训练回退到较早的检查点。我一般会保留每 10 轮一个检查点就是为了这个。训练速度突然变慢先看显卡是不是被其他任务占了再看数据加载是不是成了瓶颈——如果用的是机械硬盘或者数据预处理脚本每次都在实时做重采样那 GPU 大部分时间都在等数据。解决办法是把清洗后的音频预处理成固定采样率的缓存文件让训练直接读。6.3 性能与成本控制性能优化的收益顺序我的经验是缓存 并发 模型压缩 硬件升级。缓存排第一是因为长文档里重复的短句和短语非常多实测能省一到两成算力。并发排第二但要配好上限不然显存爆了反而更慢。模型压缩比如量化速度快了但音质可能有细微损失要不要用取决于场景对音质的容忍度。硬件升级放最后因为它是花钱最直接、收益最不确定的一项。成本上还有一处容易被忽略失败的推理同样消耗算力。我在队列里加了前置校验文本为空、含非法字符、长度超限的任务直接拒掉不进入推理环节。上线这个校验之后无效任务的比例从百分之几降到了接近零。6.4 速查表把上面这些整理成一张表出问题的时候照着查会快很多。现象可能原因优先尝试的排查动作音色前后不一致断句过长、温度偏高、素材混响缩短断句至 60 字内温度降到 0.6出现金属嗡鸣降噪过度回退降噪版本强度降到 30% 以内拼接处咔哒声缺少交叉淡化拼接点加 20 毫秒淡入淡出整段听着机械停顿规则化、无呼吸声随机化停顿插入真实呼吸片段训练损失震荡学习率过高、数据错配学习率降到 5e-5抽检 20 条数据合成开始带杂音过拟合回退到较早检查点训练速度骤降数据加载瓶颈、显存被占检查缓存文件与 GPU 占用队列积压不消化单任务卡死无超时给推理加超时与并发上限重复内容重复计算无缓存机制用内容哈希做任务键交付后响度不一未做响度归一按 -16 LUFS 统一处理最后分享一个我在实际项目里最有用的习惯每次改动只动一个变量并且记录改动前后的对比样本。这件事听起来笨但语音相关的调整特别依赖主观听感多个变量一起改最后你根本不知道是哪个起了作用。我现在的做法是每次调整都留一组 A/B 样本在同一个目录里文件名带上日期和改动摘要比如20240612_temp075_to_065_A.wav。半年下来这个目录成了我最值钱的资产遇到类似问题直接翻样本比对比重新做实验快得多。另外补一句关于素材的提醒如果你手上的录音里有多个说话人哪怕只是背景里有人应了一声也一定要切掉。模型对串音极其敏感一句半句的串音就足以让音色在后续合成里偶尔变调。我在早期为了保住素材总量睁一只眼闭一只眼放过去了几条结果花了更多时间去定位那些偶发的怪异输出。素材量和素材纯度之间做选择永远选纯度。
返回列表