跳转至

Electron 音频质量调查交接

更新于 2026-09-28。最初的感知回归尚未得到证实。 项目负责人已将工作转向在受支持的 TTS 引擎上实现常规到最高精度的生成与克隆。 PR #2406 现在包含了质量控制、确定性导出精度,以及用于 OmniVoice/VoxCPM2 sidecar 的无损浮点传输。 有关控制项、引擎覆盖范围和验证,请参阅 音频质量。 私有录音仍保留在 Git 之外。

报告与样本映射

WittingMouse 报告称,从 Tauri 迁移到 Electron 后,同一个已保存的声音听起来更饱满/混响更重。仅凭已保存声音 ID 的相似性,并不能确定生成了相同的请求或处理流程。

提供的文件 报告版本 WAV 格式 时长 字节数 响度
4619c980.wav 约 OmniVoice 0.2.7,报告者不确定 mono 24 kHz, 32-bit float 7.64 s 733,520 -18.5 LUFS
3ff95c1d.wav VoiceStudio 0.5.3 mono 24 kHz, 16-bit PCM 7.57 s 363,404 -19.2 LUFS
voicestudio-43577f3a.wav VoiceStudio 0.5.6 mono 24 kHz, 16-bit PCM 7.73 s 371,084 -18.5 LUFS

所有文件均为未压缩的 WAV。在 24 kHz 单声道下,16 位样本每秒承载 384 kbps,32 位样本每秒承载 768 kbps(不含文件头)。这解释了文件大小的大致比例,而非所报告的感知差异。尤其是,0.5.3 和 0.5.6 提供的文件均为 16 位。仍然可能存在转换缺陷或更早的处理环节;不要忽视该报告,也不要认为提高位深度就是修复方法。目前尚未记录任何受控听音结论。

已完成的调查与局限

  • 在 v0.5.3(135ccd09)和 v0.5.6(3915a62c)处隔离源码树,使用相同的解释器、已安装的 checkpoint、MPS/float16、参考音频/转录文本、seed 42、16 步、guidance 2、启用 denoise 和模型后处理,在每种语言条件下生成了字节级相同的原始波形。这测试的是源码行为,而不是两个打包安装程序或报告者的原始环境。参考样本是仓库中的英国旁白样本。
  • 英文原始 SHA-256:43dbb2f0513c63514257b3614ed70cfdf2c9c108176316f7897ab6e67e6e299f。 Auto/None 原始 SHA-256:70c5edf9ff88907aa3cbfe38a8f3c66a9629898cd62196237918dfa2f6743f37。 每个文件包含 98,880 个样本。各语言条件之间彼此不同。
  • 旧版 Auto 省略了 language,从而允许继承已保存的 profile 语言。Electron 发送显式的 Auto。这是一个请求层面的候选因素,而非已确认的原因。不要悄悄逆转文档中记载的 Auto 语义。
  • 这两个标签之间的 DSP 源码未变。固定的 pedalboard 版本不同(0.9.24 vs 0.9.20);在这台 Mac 上,用两个版本分别对三个提供的 WAV 应用 mastering/broadcast 链,每个输入文件得到的哈希值相同。这并不排除其他环境差异。
  • 另一次独立的 sidecar PCM 往返测试测得信号与误差之比为 75.92 dB,最大样本误差为 0.00004977;这不是端到端的复现。

全程使用的 checkpoint: k2-fsa/OmniVoice,revision c5fdb5ccb189668d56333f77ba2629f4cd7535f4。

提供的隔离位深度对比

在 MPS 上生成了一条新波形,seed 42、16 步、显式英文、guidance 2、启用 denoise 和模型后处理,且没有使用参考声音。 Mastering、broadcast 效果、峰值归一化至 -2 dBFS 以及 mark_synthetic 在拆分导出之前只应用了一次。 相同的浮点样本分别使用 SoundFile 的 PCM_16 和 FLOAT 写入。 没有进行重采样、独立归一化或添加抖动。

文本:

清晨的阳光洒满了安静的房间。一阵柔和的微风穿过树林,远处的声音在花园中回荡。请仔细聆听声音中的温暖,以及每个词语之间的静谧间隙。

测量项 结果
声道数 / 采样率 mono / 24,000 Hz
样本数 / 时长 315,840 / 13.16 s
16 位 WAV 字节数 631,724
32 位浮点 WAV 字节数 1,263,440
浮点峰值 -1.9838 dBFS
转换误差 RMS -95.078 dBFS
信号与量化误差之比 75.882 dB
最大绝对样本差值 0.0000305171

导出前共享的浮点波形 SHA-256 为 5b63f4057f1fa0d21bf4db338fa618ef412ed22646b73515f002bed93c3c311e。 两个导出文件均未削波。这些测量描述的是数值差异,而非听感结果,也不能证明位深度在所有流程中都无关紧要。

使用现有的已标记来源的浮点母带(尚未量化到 16 位)复现导出隔离。在新的输出目录中运行:

import numpy as np
import soundfile as sf

samples, sr = sf.read('marked-float-master.wav', dtype='float32')
assert sf.info('marked-float-master.wav').subtype == 'FLOAT'
assert sr == 24000 and samples.ndim == 1
assert np.isfinite(samples).all() and np.max(np.abs(samples)) < 1
sf.write('sample-16bit.wav', samples, sr, subtype='PCM_16')
sf.write('sample-32bit-float.wav', samples, sr, subtype='FLOAT')
a, _ = sf.read('sample-16bit.wav', dtype='float64')
b, _ = sf.read('sample-32bit-float.wav', dtype='float64')
error_rms = np.sqrt(np.mean((b - a) ** 2))
print('error RMS dBFS:', 20 * np.log10(error_rms))
print('signal/error dB:', 20 * np.log10(np.sqrt(np.mean(b ** 2)) / error_rms))

将旧的 16 位样本转换为浮点格式无法恢复已丢失的信息。对比时请使用相同的播放器设置和播放音量;关闭自动响度调节、EQ、增强效果和空间音频。

提供的更高质量候选,非受控 A/B 对比

第二次生成使用了相同的文本、seed 42、显式英文、guidance 2、32 步、启用 denoise 和模型后处理。前面的浮点样本及其文本被作为克隆参考输入,以保留相似的声音。未添加 mastering 压缩器或 broadcast 效果;处理仅包括峰值归一化和 mark_synthetic。导出:mono 24 kHz、32 位浮点、12.93 秒、峰值 -2.0343 dBFS、无削波。

这同时更改了步数、参考条件化和效果。它无法识别哪项更改有帮助,且尚未确认任何感知上的改善。参考中已包含早期处理;它不是未经处理的录音棚干声源。不要仅凭此样本就将这些设置作为已验证的修复方案发布。

下一台机器可用的文件与代码

所提供的压缩包已在本地核查:其中的 6 个 WAV 和 2 个 JSON 文件与上述导出测量结果一致。该压缩包不包含三个历史输出的原始人声参考或转录文本。其目录标签包含 20260929;这些标签并不能确定实验日期。WAV 文件仅限本地,未附于本 PR。如有需要请私下传输;发布任何报告人录音前须先获得许可。

  • 源 Mac 的 Downloads 文件夹:VoiceStudio-bit-depth-comparison-20260929/ 包含 sample-16bit.wav、sample-32bit-float.wav 和 comparison.json。
  • 源 Mac 的 Downloads 文件夹:VoiceStudio-clean-quality-20260929/ 包含 clean-32step-float.wav 和 settings.json。
  • 最初提供的三个 WAV 文件位于该 Mac 的 Downloads 文件夹中。
  • 该 Mac 上的临时一次性生成测试脚本:/tmp/voicestudio-bit-depth-ab.py 和 /tmp/voicestudio-clean-quality.py。它们包含机器专属路径,并非仓库依赖。
  • 单独推送的分支 fix/desktop-packs-audio-quality-polish 的提交 30c814a0 包含 scripts/compare_generation_quality.py、scripts/compare_release_clone.py 以及更早的 docs/audio-feedback-tasklist.md。发布对比脚本仍保留在该分支上;生成质量脚本现由本 PR 维护。拉取该分支后,可使用 git show 30c814a0:scripts/compare_release_clone.py 检查它们。请使用已安装的 checkpoint 并采用离线模式;不要假设 /tmp 产物或原始开发者的缓存存在于其他位置。
  • 来自该分支(#2375)的咨询性音频质量警告现已纳入。它们描述的是信号问题,而非语音相似度或感知质量。

下一台机器的任务清单与验收标准

  1. 获取原始参考 WAV/转录文本、生成文本、模型修订版本、seed、精确请求载荷、效果/导出设置,以及每个安装环境的操作系统、设备和依赖版本。将私人录音排除在 Git 之外。
  2. 记录电平匹配条件下仅导出对比组的盲听判断。如果存在可重复的差异,则将相同的 float 母带分别通过实际旧版与当前导出路径进行测试,检查削波、缩放、舍入、采样率/声道元数据、播放器解码以及中间格式。
  3. 在两个应用程序环境中使用匹配的输入进行复现。捕获原始模型输出、每个 DSP 阶段后的输出、存储的 WAV 以及下载/导出的 WAV。先比较显式指定英语的情况,再调查 Auto/配置文件继承。
  4. 在进行质量调优时,固定参考音频和 seed,一次只更改一个变量:16 步与 32 步、效果开/关、降噪开/关、导出子类型。使用多个 seed 和多种音色。衡量可懂度,并询问听者关于相似度、自然度和混响的感受;DSP 警告数量不是质量评分。
  5. 在已证实的失败处理/导出接缝处添加失败在前/通过在后的回归测试,然后实施最小可行的修复。保留 mark_synthetic、现有音色、本地优先行为和显式下载。
  6. 在 macOS、Windows 和 Linux 上验证用户可见行为。使用 HF_HUB_OFFLINE=1 和空的 HF_HUB_CACHE 运行无模型测试;单独针对显式安装的 checkpoint 运行生成实验。

不要将已移除的 Tauri 构建/运行时路径恢复回受维护的仓库。仅使用隔离的历史安装/源码树进行比较。不要仅凭文件更大、警告更少或单个新生成样本听起来不同就关闭该回归问题。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 om/VoiceStudio