Revert the VOX preset to the NetTTS approximation

This commit is contained in:
Fisto
2026-09-22 20:00:13 +02:00
parent 723337b452
commit 61983d4b8d
6 changed files with 36 additions and 74 deletions
+11 -48
View File
@@ -402,20 +402,16 @@ Kerry Watson at factory values. The wrapper implements it as a preset:
VESKSLOP_TTS_PRESET=vox # implies VOX prosody unless VESKSLOP_TTS_VOX is set
VESKSLOP_TTS_PRESET=hev # HEV suit starting point (see note below)
| Profile value | Factory (Keith) | VOX preset (tuned) | HEV preset (approx.) |
| Profile value | Factory (Keith) | VOX preset | HEV preset (approx.) |
| --- | --- | --- | --- |
| Pitch | 27 | 0 | 15 |
| Speaking Rate | 33 | 15 | 24 |
| Pitch | 27 | 3 | 15 |
| Speaking Rate | 33 | 17 | 24 |
| Prominences | 17 | 22 | 22 |
| Head Size | 46 | 34 | 52 |
| Lowering | 40 | 50 | 40 |
| Head Size | 46 | 52 | 52 |
| Lowering | 40 | 40 | 40 |
| Volume | 100 | 70 | 70 |
| Expression | 59 | 59 | 59 |
The VOX column starts from NetTTS's approximation (pitch 3, rate 17, head 52, lowering
40) and is refined against the actual game word assets; see
"Tuning against the actual game assets" below.
- Presets apply only to `keith-bell`; every other voice keeps its defaults.
- Precedence: preset < `VESKSLOP_TTS_PROFILE` < `VESKSLOP_TTS_EXPRESSION`.
- Equivalent explicit override:
@@ -473,49 +469,16 @@ Verified matrix (same line, Keith Bell):
| Run | Duration | F0 median |
| --- | --- | --- |
| factory, no adjustments | 3.35 s | 123 Hz |
| VOX preset, no adjustments | 6.06 s | 82 Hz |
| VOX preset + `speed=1.0 pitch=0` | 6.06 s, byte-identical | 82 Hz |
| VOX preset + `speed=1.3` | 4.02 s | - |
| VOX preset + `pitch=+3` | 6.06 s | 96 Hz |
| VOX preset, no adjustments | 5.83 s | 87 Hz |
| VOX preset + `speed=1.0 pitch=0` | 5.83 s, byte-identical | 87 Hz |
| VOX preset + `speed=1.3` | 4.02 s | 84 Hz |
| VOX preset + `pitch=+3` | 5.83 s | 88 Hz |
| HEV preset, no adjustments | 3.79 s | - |
Registry inspection after a preset run: 26 values in the Keith speaker key in both
hives, `Pitch=0x0`, `Speaking Rate=0xf`, `Head Size=0x22`, `Lowering=0x32`,
`Gender=0x2`, `Line Mode=0x1`,
hives, `Pitch=0x3`, `Speaking Rate=0x11`, `Gender=0x2`, `Line Mode=0x1`,
`Default Speaker={11260610-C84A-11CE-AEC4-0000C0E9CB87}`.
#### Tuning against the actual game assets (2026-09-22)
Reference: the word WAVs from `suchipi/half-life-vox-console`
(`public/vox/*.wav`, Valve assets - used locally for analysis only, never committed).
38 words at 11025 Hz 16-bit, the engine's native rate. `tools/vox_compare.py`
reproduces the comparison; it reports the cepstrum F0 median, total audible duration,
energy-weighted spectral centroid and the >2 kHz energy share per word set.
| Metric (38 words) | Game assets | NetTTS approximation | Shipped VOX preset |
| --- | --- | --- | --- |
| F0 median | 82.3 Hz | 87.5 Hz | 82.3 Hz |
| Duration | 23.36 s | 22.28 s | 22.99 s |
| Spectral centroid | 515 Hz | 479 Hz | 453 Hz |
| >2 kHz energy share | 0.0186 | 0.0137 | 0.0172 |
Findings:
- Registry `Pitch 0` is the engine minimum and matches the game's F0; the NetTTS
approximation (3) was about 5 Hz high.
- `Speaking Rate 15` matches the word durations within about 1.6%; NetTTS's 17 was
about 4.6% fast on this corpus.
- The game voice is brighter than the approximation. Smaller `Head Size` raises
brightness (34 is the engine's effective minimum here; 30 gives identical output) and
`Lowering 50` adds a little more, together closing most of the >2 kHz gap
(0.0137 -> 0.0172 against 0.0186).
- The residual centroid difference is mostly the reference's mid/high-band noise floor
(game assets), not voice timbre.
- HEV stays a starting point: no published settings and no word-level reference exists.
Re-run recipe: write the profile to both hives, synthesize the reference word list with
`build/sapi4host-winlib.exe -v "Keith Bell" -t <word> -o <dir>/<word>.wav`, then
`tools/vox_compare.py <game-assets-dir> <synth-dir>`.
### Inline rate/pitch controls (engine-side)
The wrapper consumes NetTTS-style, line-leading controls, so Veskslop and the WebUI do