Half-Life VOX/HEV presets (NetTTS VOX profile); docs

This commit is contained in:
Fisto
2026-09-21 11:17:30 +02:00
parent 4d1c31f1c9
commit 1cc18c812b
6 changed files with 200 additions and 0 deletions
+4
View File
@@ -93,6 +93,10 @@ A short low-level leading hum (80 ms, 75 Hz, -48 dBFS) primes Discord's audio pi
so the first word is not gated; tune with `VESKSLOP_TTS_HUM_MS` (0 = off), so the first word is not gated; tune with `VESKSLOP_TTS_HUM_MS` (0 = off),
`VESKSLOP_TTS_HUM_HZ`, and `VESKSLOP_TTS_HUM_DB`. `VESKSLOP_TTS_HUM_HZ`, and `VESKSLOP_TTS_HUM_DB`.
**Half-Life presets** (Keith Bell): `VESKSLOP_TTS_PRESET=vox` applies the approximated
Valve VOX profile and enables VOX prosody; `VESKSLOP_TTS_PRESET=hev` is a starting point
for the HEV suit voice. Values are in `docs/TTS-DESIGN.md`.
## Layout ## Layout
- `host/sapi4host.c` — host: voice select, pitch/speed, text -> WAV - `host/sapi4host.c` — host: voice select, pitch/speed, text -> WAV
+5
View File
@@ -129,6 +129,11 @@ without them.
- VOX mode is Flextalk-only. The wrapper enables it with `VESKSLOP_TTS_VOX=1` - VOX mode is Flextalk-only. The wrapper enables it with `VESKSLOP_TTS_VOX=1`
(`VESKSLOP_TTS_VOX_CLEAN=1` drops the stutter wrapper) and it takes precedence (`VESKSLOP_TTS_VOX_CLEAN=1` drops the stutter wrapper) and it takes precedence
over `VESKSLOP_TTS_WORDS`. over `VESKSLOP_TTS_WORDS`.
- Half-Life presets (`VESKSLOP_TTS_PRESET=vox|hev`) target Keith Bell only. VOX values
come from NetTTS `nettts_flextalk_vox_profile.reg`: pitch 3, rate 17, prominences 22,
head size 52, volume 70 (factory: 27/33/17/46/100); `vox` also implies VOX prosody.
`hev` (pitch 15, rate 24) is an unverified starting point - HL1 credits the suit
sounds to Kelly Bailey with no published settings.
- Line-leading `/rate N` and `/pitch N` controls are consumed by the wrapper - Line-leading `/rate N` and `/pitch N` controls are consumed by the wrapper
(percent, 100 = normal; `<= 2.0` means multiplier). They override the env (percent, 100 = normal; `<= 2.0` means multiplier). They override the env
speed/pitch and are not spoken; a controls-only line yields 100 ms of silence. speed/pitch and are not spoken; a controls-only line yields 100 ms of silence.
+34
View File
@@ -387,6 +387,40 @@ Other NetTTS features and their relevance:
our prefix runs the engines with builtin Wine libraries. our prefix runs the engines with builtin Wine libraries.
- Win32 GUI and preset sliders: Veskslop provides the UI. - Win32 GUI and preset sliders: Veskslop provides the UI.
### Half-Life VOX / HEV presets
The Half-Life announcement voice (VOX / Black Mesa Announcement System) is the Flextalk
engine's **Keith Bell** voice with an adjusted speaker profile. NetTTS publishes an
approximation of Valve's settings (`scripts/winetricks/nettts_flextalk_vox_profile.reg`,
see its issues #53/#54/#67): the profile targets Keith Bell's speaker key and leaves
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 | HEV preset (approx.) |
| --- | --- | --- | --- |
| Pitch | 27 | 3 | 15 |
| Speaking Rate | 33 | 17 | 24 |
| Prominences | 17 | 22 | 22 |
| Head Size | 46 | 52 | 52 |
| Lowering | 40 | 40 | 40 |
| Volume | 100 | 70 | 70 |
| Expression | 59 | 59 | 59 |
- Presets apply only to `keith-bell`; every other voice keeps its defaults.
- Precedence: preset < `VESKSLOP_TTS_PROFILE` < `VESKSLOP_TTS_EXPRESSION`.
- Equivalent explicit override:
`VESKSLOP_TTS_PROFILE='pitch:3,rate:17,volume:70,prominences:22,head_size:52,lowering:40'`.
- The NetTTS profile also sets `Gender`, `Line Mode`, and a set of text-class DWORDs
(address/date/money classes, abbreviation expansion, and so on). Those affect text
normalization rather than the audible voice, so the wrapper does not write them.
- HEV suit: Half-Life 1 credits the suit sounds to Kelly Bailey; no settings were ever
published. The `hev` preset is a starting point (less extreme than VOX); tune pitch and
rate to taste. VOX prosody is optional there (`VESKSLOP_TTS_VOX=1`).
- Measured with the wrapper on the same line: VOX preset 5.83 s, HEV 3.79 s, factory
3.35 s (the VOX preset is slower and gains the VOX cadence).
### Inline rate/pitch controls (engine-side) ### Inline rate/pitch controls (engine-side)
The wrapper consumes NetTTS-style, line-leading controls, so Veskslop and the WebUI do The wrapper consumes NetTTS-style, line-leading controls, so Veskslop and the WebUI do
+27
View File
@@ -23,6 +23,8 @@
# VESKSLOP_TTS_HUM_MS leading low hum in ms, 0 = off (default 80) # VESKSLOP_TTS_HUM_MS leading low hum in ms, 0 = off (default 80)
# VESKSLOP_TTS_HUM_HZ hum frequency, 30-200 (default 75) # VESKSLOP_TTS_HUM_HZ hum frequency, 30-200 (default 75)
# VESKSLOP_TTS_HUM_DB hum peak level, -80..-6 (default -48) # VESKSLOP_TTS_HUM_DB hum peak level, -80..-6 (default -48)
# VESKSLOP_TTS_PRESET vox | hev (Half-Life profiles, Keith Bell;
# vox also enables VOX prosody)
# #
# Output: 48 kHz mono s16le WAV, trimmed, faded, loudness-normalized. # Output: 48 kHz mono s16le WAV, trimmed, faded, loudness-normalized.
set -eu set -eu
@@ -55,6 +57,12 @@ WORDS=${VESKSLOP_TTS_WORDS:-0}
WORD_GAP=${VESKSLOP_TTS_WORD_GAP_MS:-120} WORD_GAP=${VESKSLOP_TTS_WORD_GAP_MS:-120}
VOX=${VESKSLOP_TTS_VOX:-0} VOX=${VESKSLOP_TTS_VOX:-0}
VOX_CLEAN=${VESKSLOP_TTS_VOX_CLEAN:-0} VOX_CLEAN=${VESKSLOP_TTS_VOX_CLEAN:-0}
PRESET=${VESKSLOP_TTS_PRESET:-}
# The VOX preset is the Half-Life announcement voice: it implies VOX prosody
# unless the caller explicitly disables it.
if [ "$PRESET" = "vox" ] && [ -z "${VESKSLOP_TTS_VOX:-}" ]; then
VOX=1
fi
HUM_MS=${VESKSLOP_TTS_HUM_MS:-80} HUM_MS=${VESKSLOP_TTS_HUM_MS:-80}
HUM_HZ=${VESKSLOP_TTS_HUM_HZ:-75} HUM_HZ=${VESKSLOP_TTS_HUM_HZ:-75}
HUM_DB=${VESKSLOP_TTS_HUM_DB:--48} HUM_DB=${VESKSLOP_TTS_HUM_DB:--48}
@@ -179,6 +187,25 @@ if [ -n "$SPEAKER_GUID" ]; then
P_LOWER=40 P_LOWER=40
P_EXPR="" P_EXPR=""
# Half-Life presets for Keith Bell (the game's announcement voice).
# "vox" is the approximated Valve VOX profile published by NetTTS
# (scripts/winetricks/nettts_flextalk_vox_profile.reg); "hev" is a starting
# point for the HEV suit voice, which has no published profile.
case "$PRESET" in
vox)
if [ "$ENGVOICE" = "Keith Bell" ]; then
P_PITCH=3; P_RATE=17; P_VOLUME=70
P_PROM=22; P_HEAD=52; P_LOWER=40
fi
;;
hev)
if [ "$ENGVOICE" = "Keith Bell" ]; then
P_PITCH=15; P_RATE=24; P_VOLUME=70
P_PROM=22; P_HEAD=52; P_LOWER=40
fi
;;
esac
if [ -n "$PROFILE" ]; then if [ -n "$PROFILE" ]; then
OLDIFS=$IFS OLDIFS=$IFS
IFS=',' IFS=','
+3
View File
@@ -34,3 +34,6 @@ Microsoft installers. Private archival copies; do not redistribute.
[h4rm0n1c/NetTTS](https://github.com/h4rm0n1c/NetTTS), kept as the reference for [h4rm0n1c/NetTTS](https://github.com/h4rm0n1c/NetTTS), kept as the reference for
validating `setup/vox_parser.py`. Upstream declares no license; these files are validating `setup/vox_parser.py`. Upstream declares no license; these files are
reference-only and are not linked into anything we ship. reference-only and are not linked into anything we ship.
- `nettts_flextalk_vox_profile.reg` — NetTTS's approximated Valve VOX speaker profile
for Keith Bell (the source of the `vox`/`hev` presets in `setup/veskslop-tts.sh`).
@@ -0,0 +1,127 @@
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\AT&T\Watson\2.0\FlexTalk\2.0]
"Default Speaker"="{11260610-C84A-11CE-AEC4-0000C0E9CB87}"
[HKEY_CURRENT_USER\Software\AT&T\Watson\2.0\FlexTalk\2.0\Speakers\{000031CB-3699-551F-AED0-6B4893382D57}]
"Abbreviation Expansion"=dword:00000001
"Address Class"=dword:00000001
"Age"=dword:0000001e
"Alphabetic Hyphen"=dword:00000000
"Case Significance"=dword:00000001
"Date Class"=dword:00000001
"Expression"=dword:00000064
"Fraction Class"=dword:00000001
"Gender"=dword:00000001
"Head Size"=dword:0000002d
"Line Mode"=dword:00000000
"Lowering"=dword:00000028
"Math Mode"=dword:00000000
"Measurements Class"=dword:00000001
"Mode Name"="Kerry Watson"
"Money Class"=dword:00000001
"Numerical Hyphen"=dword:00000001
"Ordinal Numbers Class"=dword:00000001
"Pitch"=dword:00000041
"Prominences"=dword:00000011
"ProofRead Mode"=dword:00000000
"Proper Names Class"=dword:00000001
"Speaker Name"="Kerry Watson"
"Speaking Rate"=dword:00000020
"Spell Mode"=dword:00000000
"Telephone Numbers Class"=dword:00000001
"Time Class"=dword:00000001
"Volume"=dword:00000064
[HKEY_CURRENT_USER\Software\AT&T\Watson\2.0\FlexTalk\2.0\Speakers\{11260610-C84A-11CE-AEC4-0000C0E9CB87}]
"Abbreviation Expansion"=dword:00000001
"Address Class"=dword:00000001
"Age"=dword:0000001e
"Alphabetic Hyphen"=dword:00000000
"Case Significance"=dword:00000001
"Date Class"=dword:00000001
"Expression"=dword:0000003b
"Fraction Class"=dword:00000001
"Gender"=dword:00000002
"Head Size"=dword:00000034
"Line Mode"=dword:00000001
"Lowering"=dword:00000028
"Math Mode"=dword:00000000
"Measurements Class"=dword:00000001
"Mode Name"="Keith Bell"
"Money Class"=dword:00000001
"Numerical Hyphen"=dword:00000000
"Ordinal Numbers Class"=dword:00000001
"Pitch"=dword:00000003
"Prominences"=dword:00000016
"ProofRead Mode"=dword:00000000
"Proper Names Class"=dword:00000001
"Speaker Name"="Keith Bell"
"Speaking Rate"=dword:00000011
"Spell Mode"=dword:00000000
"Telephone Numbers Class"=dword:00000001
"Time Class"=dword:00000001
"Volume"=dword:00000046
[HKEY_LOCAL_MACHINE\Software\AT&T\Watson\2.0\FlexTalk\2.0]
"Default Speaker"="{11260610-C84A-11CE-AEC4-0000C0E9CB87}"
[HKEY_LOCAL_MACHINE\Software\AT&T\Watson\2.0\FlexTalk\2.0\Speakers\{000031CB-3699-551F-AED0-6B4893382D57}]
"Abbreviation Expansion"=dword:00000001
"Address Class"=dword:00000001
"Age"=dword:0000001e
"Alphabetic Hyphen"=dword:00000000
"Case Significance"=dword:00000001
"Date Class"=dword:00000001
"Expression"=dword:00000064
"Fraction Class"=dword:00000001
"Gender"=dword:00000001
"Head Size"=dword:0000002d
"Line Mode"=dword:00000000
"Lowering"=dword:00000028
"Math Mode"=dword:00000000
"Measurements Class"=dword:00000001
"Mode Name"="Kerry Watson"
"Money Class"=dword:00000001
"Numerical Hyphen"=dword:00000001
"Ordinal Numbers Class"=dword:00000001
"Pitch"=dword:00000041
"Prominences"=dword:00000011
"ProofRead Mode"=dword:00000000
"Proper Names Class"=dword:00000001
"Speaker Name"="Kerry Watson"
"Speaking Rate"=dword:00000020
"Spell Mode"=dword:00000000
"Telephone Numbers Class"=dword:00000001
"Time Class"=dword:00000001
"Volume"=dword:00000064
[HKEY_LOCAL_MACHINE\Software\AT&T\Watson\2.0\FlexTalk\2.0\Speakers\{11260610-C84A-11CE-AEC4-0000C0E9CB87}]
"Abbreviation Expansion"=dword:00000001
"Address Class"=dword:00000001
"Age"=dword:0000001e
"Alphabetic Hyphen"=dword:00000000
"Case Significance"=dword:00000001
"Date Class"=dword:00000001
"Expression"=dword:0000003b
"Fraction Class"=dword:00000001
"Gender"=dword:00000002
"Head Size"=dword:00000034
"Line Mode"=dword:00000001
"Lowering"=dword:00000028
"Math Mode"=dword:00000000
"Measurements Class"=dword:00000001
"Mode Name"="Keith Bell"
"Money Class"=dword:00000001
"Numerical Hyphen"=dword:00000000
"Ordinal Numbers Class"=dword:00000001
"Pitch"=dword:00000003
"Prominences"=dword:00000016
"ProofRead Mode"=dword:00000000
"Proper Names Class"=dword:00000001
"Speaker Name"="Keith Bell"
"Speaking Rate"=dword:00000011
"Spell Mode"=dword:00000000
"Telephone Numbers Class"=dword:00000001
"Time Class"=dword:00000001
"Volume"=dword:00000046