同一段文字在 Luna-TTS 里合成两次,听感不一样时,先别急着归因到模型随机。更常见的顺序是:文本被输入法或界面改过、参数没锁住、播放器和音量不同,最后才是服务端在同一输入下仍有波动。要把问题缩小,建议把文本、参数、环境、播放设备四类变量分别固定,再一次只改一项复测。
若两次用的是同一段文字、同一组界面参数、同一播放设备,通常应先怀疑输入文本或参数没有被真正固定,而不是直接认定 Luna-TTS 在同一条件下必然随机。建议先并排保存两次输出文件、输入文本和当时的全部设置,再逐字比对文本、固定播放环境听音,然后用单变量对照复测。边界是:界面未提供的随机种子或确定性开关无法凭空固定,只能记录可控项,并用重复合成本身判断波动程度。
先把两次结果的文件和当时参数并排存下来
对比靠印象很容易把两次不同的合成混在一起。建议第一次生成后就立即另存,不要用播放器或下载工具覆盖同一文件名。命名至少包含日期、轮次、文本标识和关键参数,例如:
luna-YYYYMMDD-HHMM-01-<文本标识>-<音色>-<语速>.wav
同时把当时的设置写进一个纯文本或 CSV 记录文件。字段建议固定为:合成时间、输入文本文件名与字符数、音色或说话人、语速、音高、输出格式与采样率;若界面提供随机种子、temperature、top_p、top_k、文本预处理开关,也一并记录;客户端版本或模型标识、接口返回的 request id(若可见)和输出文件路径同样不要漏。示例表头:
run,time,text_file,chars,voice,speed,pitch,seed,temp,top_p,out_file
A1,YYYY-MM-DD HH:MM,run1.txt,42,default,1.0,0,123,0.8,,A1.wav
确认文本本身有没有被改动
假差异里最常见的是文本被改动:输入法把半角标点转成全角、粘贴时首尾空格被去掉、换行被合并、连续空白被折叠,或者第二次粘贴时多了一个不可见字符。先把两次实际提交的文本各存成 run1.txt 和 run2.txt,再逐字比较。
diff -u run1.txt run2.txt
sed -n l run1.txt | head
python3 - <<'PY'
a = open('run1.txt', encoding='utf-8').read()
b = open('run2.txt', encoding='utf-8').read()
print(len(a), len(b))
for i, (x, y) in enumerate(zip(a, b)):
if x != y:
print(i, repr(x), repr(y))
print('same' if a == b else 'differs')
PY
diff 能看出行级差异,sed -n l 会把换行和制表符之类的不可见字符显示出来;python 片段则按字符位置指出第一个不同点。只要长度不同,就先查首尾空格、全角标点和换行数量,不要先改参数。
固定播放环境再听一次
同一份音频在不同音量或不同耳机下,听感差异可能比实际差异更大。固定动作是:同一副耳机或同一对音箱、同一台播放设备、同一款播放器、同一音量刻度,关闭均衡器、空间音频、响度归一化和蓝牙编解码切换。如果必须换设备,把换了什么写进记录,不要默认为同一环境。
听感记录不要只写更自然、更清楚。建议记录可指认的位置:第几秒、哪个词、起始是否更慢、尾音是否更长、停顿是否变化、音量峰值是否不同。模板:
out_file,device,volume,position,observation
A1.wav,headphone-X,30%,00:02.1,你好两字尾音更长
A2.wav,headphone-X,30%,00:02.1,无明显差异
一次只改一个变量复测
先跑基准:同一文本、同一参数连续合成两次,分别保存。如果基准两次就不同,说明要么还有未固定的变量,要么服务端存在未暴露的波动。候选变量不要凭想象列,按 Luna-TTS 界面实际提供的项来:
- 文本本身:标点全角或半角、空格、换行、段落长度、数字与英文读法
- 分段方式:长文本是否被按句或按行切分,单段长度是否不同
- 音色或说话人、语速、音高
- 输出格式、采样率
- 若界面提供:随机种子、temperature、top_p、top_k、文本预处理开关
界面没有的选项就不要当成存在,也不要在记录表里编一个值。每轮只动一项,其余项与基准轮完全一致:
轮次,改动项,改动值,其他项,输出文件,与基准差异,是否复现
A1,基准,无,全部同基准,A1.wav,-,-
A2,基准重复,无,全部同基准,A2.wav,无或有,是或否
B1,语速,1.1,其余同上,B1.wav,待记,待记
C1,标点,半角改全角,其余同上,C1.wav,待记,待记
如果基准重复两次就有差异,先不要继续改语速和标点;此时优先确认是否有隐藏的默认值、上一次会话残留或服务端状态变化,并把每次合成都留文件。
把结论写成合成前的固定动作
把有效组合写成固定步骤,之后每次合成都照做:
- 把本次文本单独存成文件并记录字符数或哈希,合成时直接从这个文件粘贴,不在输入框里二次编辑。
- 逐项抄下界面实际参数和模型或音色标识;界面没有的项标注“未提供”,不要留空当成默认。
- 按命名规则另存输出文件,不覆盖上一轮结果。
- 用同一播放设备和音量试听,并把听感差异记在同一个记录文件里。
如果做完这些仍然不稳定,按这个顺序排查:文本是否被改动、参数是否与记录一致、音色和模型版本是否一致、播放设备与音量是否一致、两次合成是否发生在同一会话或同一服务状态。若 Luna-TTS 界面不提供随机种子或确定性开关,可复现性本身有限,这时能做的只是把可控变量固定、保留两次基准文件,并用重复合成判断波动范围,不要用一次结果推断模型一定有问题。