# Hi-Fi TTS × Qwen / FishDAC B — listening report

Snapshot: completed B update 69,950; 59,000 additional single-speaker updates after B10950.
This is a static report. Training continues separately with no step cap.

## Source and license

Original Hi-Fi TTS (2021), not HiFi-TTS-2. NVIDIA / Bakhturina et al.
Source: https://www.openslr.org/109/ ; license: CC BY 4.0
https://creativecommons.org/licenses/by/4.0/
Speaker6097: Phil Benson, clean subset. Data acquired from original-release mirror
MikhailT/hifi-tts at revision f0a934ddf4e8da0fc6c53fb42fda2c9ac8ed93df.

Training:39,373 utterances /29.954269h. Official dev.clean:50 utterances.
Official test.clean:100 utterances, excluded from training and this report.
Original native44.1kHz mono PCM16 FLAC samples are preserved when decoded into
ground-truth float32 WAVs. Reconstructions are generated model outputs and are
clearly distinguished; source filenames remain in downloads, with role/step suffixes.
Original chapter recordings were MP3-sourced: FLAC packaging is not evidence of
uncompressed originals or22kHz useful content.

## Selection and limitations

All50 official development utterances are included. The16 training examples match
the trainer's fixed evaluation panel: `random.Random(20261105).sample(train,16)`.
Selection is independent of reconstruction quality. The library can be sorted by
mel error for inspection; default order is the fixed original panel order.
Validation is held out from this fine-tuning run, not a new speaker or book-disjoint
benchmark. Development audio helped choose the speaker. Upstream pretraining
overlap was not audited. No MOS score or formal perceptual equivalence is claimed.

## Model and optimization

Frozen Qwen encoder+RVQ, native decoder pre-convolution, entire8-block Qwen
pre-transformer, and first×2 upsampler+ConvNeXt yield1024 channels at25Hz.
Fixed rate conversion25→21.533203125Hz and trainable adapter feed both Fish
latent×2 upsamplers+ConvNeXt and its waveform decoder, producing44.1kHz.
Fish post-transformer is bypassed; Qwen prefix remains frozen.

Warm-start: completed B10950, preserving G/D and Adam state.
Globalbatch8, four GPUs. Fixed LR: bridge2e-4; Fish synthesis5e-5; D2e-5.
Objective: mel15, MR-STFT1, GAN1, feature matching2, Qwen-ASR perceptual1.
No audio normalization or augmentation in this single-speaker run.

## Export and charts

An immutable local hardlink pinned one atomically saved checkpoint before export.
All66 pairs were regenerated through live frozen Qwen features and the full B
decoder in FP32/TF32-off, eval/no-grad mode. No optimizer state was changed.
Each output has exactly the original sample count. No output normalization,
fitted time alignment, resampling, denoising or post-processing is applied.
WAV exports use float32; both original and reconstruction samples were read back
and checked exactly. Source FLAC SHA256s were checked against the training manifest.
Fresh mel/MR-STFT means match the trainer's saved checkpoint evaluation within1e-4.

Learning curves: saved per-clip, equal-weight means on the same16train/50dev
utterances, no smoothing. x-axis subtracts10950 from the inherited global step.
These are evaluation reconstruction losses, not stochastic minibatch losses.
Waveforms show240-bin peak envelopes using one shared scale per pair.
Power spectra use Welch2048-sample windows,1024 overlap, native44.1kHz, in dB/Hz.
Spectrum axes are display-limited to−120…−25dB/Hz, not audio-clipped.

`report.json` contains full chart points, transcripts, source identities, exact
sample counts, audio/checkpoint/manifest hashes, metrics and export timestamp.
Scripts and QA receipts are retained locally in `hifitts_b_report_20261106`.
Only the sanitized static `dist/` directory is deployed; no credentials,
checkpoints, private filesystem paths, optimizer state or training logs are published.

## Reproduction

1. Pin the desired complete checkpoint without modifying the training run.
2. Run `export_report.py` in the model environment; it rebuilds the66-pair panel,
   performs fresh inference, validates samples and metric parity, and writes report.json.
3. Serve dist locally and run `verify_report.py` for playback, controls, downloads,
   responsive layout, and browser errors.
4. Deploy only dist to Cloudflare Pages using `deploy.py`; credentials are read
   locally into memory/environment and never copied into public assets.

Visual design was inspired by a generated UI mockup; no mockup charts or invented
measurements appear in the report. Hero line art is decorative, not measured audio.

## Added bandwidth ablation and mel spectrograms

Each of the66 original pairs now includes a third audio file: the SAME44.1kHz
reconstruction, downsampled to24kHz using SciPy `resample_poly`, ratio80/147,
zero-phase anti-alias FIR, Kaiser beta10, zero boundary extension. No gain
normalization, clipping, fitted delay or second model inference is used.
There are now198 float32 WAVs. Duration changes by at most one24kHz sample due
to integer sample-count rounding. Downsampled downloads retain original filename
stems with an explicit `__24khz.wav` suffix.

The sampler regression preserves4kHz within0.05dB and suppresses16kHz by at least
70dB (measured approximately100dB). Reference:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.resample_poly.html

Each clip has a66-clip-set matched three-panel mel figure: ground truth, full-band
reconstruction, and the24kHz control. For comparable analysis only, the control
is resampled back to44.1kHz, then trimmed to the exact original length; this does
not restore lost high frequencies. Playback/download is the true24kHz file.
Analysis:2048-point periodic Hann STFT, hop256,128 triangular HTK mel bands,
0–22.05kHz, unit-sum filter normalization, squared magnitude,10log10 power re1.
STFT uses spectrum scaling (window-sum normalization), zero boundary extension.
All panels/all clips share fixed−100…−20dB colors and identical time/frequency
axes; there is no per-panel peak normalization.12kHz is marked with a dashed line.
The plots are analysis visuals, not the trainer's multi-resolution mel-loss frontend.

Per-clip high-band energy is Welch power above12kHz divided by total Welch power,
computed with2048-sample windows and1024 overlap. The plot-back24kHz control can
show tiny filter transition/leakage energy; it is not meaningful recovered detail.
Finite STFT windows and overlapping mel filters also smear a sharp cutoff across
neighboring bins, so a thin colored fringe above the12kHz line is not evidence
that the24kHz file contains independently representable frequencies above Nyquist.
High-band energy demonstrates bandwidth, not fidelity: noise also has energy.
Compare corresponding ground-truth temporal/spectral structure and listen.

Reproduction: run `add_bandwidth.py` AFTER `export_report.py`, then repeat local
and deployed browser verification. All processing is CPU-only and leaves the
model, training run, original audio and full-band reconstructions unchanged.
