voice declarations: mark Flextalk voices no-pitch; refresh contract snapshot

This commit is contained in:
Fisto
2026-09-15 11:55:49 +02:00
parent 4bed006ea9
commit fa4fbaf74b
3 changed files with 19 additions and 9 deletions
+2 -2
View File
@@ -64,8 +64,8 @@ The wrapper maps voice IDs (`sam`, `mary`, `mike`, `keith-bell`, `kerry-watson`,
MSTTS variants), reads `VESKSLOP_TTS_VOICE`, `VESKSLOP_TTS_SPEED` (multiplier) and MSTTS variants), reads `VESKSLOP_TTS_VOICE`, `VESKSLOP_TTS_SPEED` (multiplier) and
`VESKSLOP_TTS_PITCH` (semitones), starts Xvfb when `DISPLAY` is unset, and writes a `VESKSLOP_TTS_PITCH` (semitones), starts Xvfb when `DISPLAY` is unset, and writes a
48 kHz mono s16le WAV trimmed, faded and normalized to about -16 LUFS (-3 dBFS true peak). 48 kHz mono s16le WAV trimmed, faded and normalized to about -16 LUFS (-3 dBFS true peak).
Flextalk voices ignore pitch (engine limitation); everything else maps as documented in Flextalk voices ignore pitch (engine limitation) and are declared with the `no-pitch`
`docs/TTS-DESIGN.md`. flag; everything else maps as documented in `docs/TTS-DESIGN.md`.
## Layout ## Layout
+14 -6
View File
@@ -137,10 +137,13 @@ Implemented on the Veskslop side (2026-09-15):
`VESKSLOP_TTS_PITCH` only when the value is set. `VESKSLOP_TTS_PITCH` only when the value is set.
- The HTTP provider adds `speed` and `pitch` to the request body only when set. - The HTTP provider adds `speed` and `pitch` to the request body only when set.
- The TTS panel has speed and pitch sliders; changes are saved to the daemon preferences. - The TTS panel has speed and pitch sliders; changes are saved to the daemon preferences.
- Command mode advertises voices through `VESKSLOP_TTS_VOICES` - Command mode advertises voices through `VESKSLOP_TTS_VOICES`. Entries are separated by commas or
(`id`, `id|Name`, `id|Name|gender`, or `id|Name|gender|language`, comma separated). While a newlines and use `id`, `id|Name`, `id|Name|gender`, `id|Name|gender|language`, or
custom command is set, the engine's declared voices replace the espeak list, so no misleading `id|Name|gender|language|flags`, where flags are `+`-separated. The `no-pitch` flag marks a voice
espeak entries appear. Reading `/voices` for the HTTP provider is still future work. that ignores pitch; `/api/audio/tts/voices` then reports `supportsPitch: false` and the TTS panel
disables the pitch slider. While a custom command is set, the engine's declared voices replace
the espeak list, so no misleading espeak entries appear. Reading `/voices` for the HTTP provider
is still future work.
Do not encode settings into the voice string (for example `anna+speed1.2`). It breaks voice lists Do not encode settings into the voice string (for example `anna+speed1.2`). It breaks voice lists
and is hard to validate. and is hard to validate.
@@ -236,7 +239,8 @@ record what the engine needs to interpret, add, or hide._
- Mapping implemented in `setup/vekslop-tts.sh`: `speed 1.0` = the voice's natural rate - Mapping implemented in `setup/vekslop-tts.sh`: `speed 1.0` = the voice's natural rate
(150 MSTTS, 300 Flextalk), scaled by the multiplier and clamped to the engine range. (150 MSTTS, 300 Flextalk), scaled by the multiplier and clamped to the engine range.
`pitch` for MSTTS maps ±12 semitones to engine units `100 ± 6.25·st`, clamped to 50-200. `pitch` for MSTTS maps ±12 semitones to engine units `100 ± 6.25·st`, clamped to 50-200.
Pitch is a no-op for Flextalk voices. Pitch is a no-op for Flextalk voices; the wrapper's `--voices` output marks
`keith-bell` and `kerry-watson` with the `no-pitch` flag so the UI disables the slider.
- `{setting}` is unused; the wrapper reads `VESKSLOP_TTS_SPEED` and - `{setting}` is unused; the wrapper reads `VESKSLOP_TTS_SPEED` and
`VESKSLOP_TTS_PITCH` from the environment when Veskslop later exports them. `VESKSLOP_TTS_PITCH` from the environment when Veskslop later exports them.
@@ -299,6 +303,10 @@ _Added 2026-09-15._
the client's display. the client's display.
- **Voice declarations**: list only usable IDs in `VESKSLOP_TTS_VOICES`. Veskslop hides the - **Voice declarations**: list only usable IDs in `VESKSLOP_TTS_VOICES`. Veskslop hides the
espeak list while a custom command is set, so a missing declaration means an empty voice list, espeak list while a custom command is set, so a missing declaration means an empty voice list,
not a fallback. not a fallback. The list accepts commas or newlines, and the optional `no-pitch` flag tells the
UI to grey out the pitch slider for that voice.
- **Flextalk pitch**: confirmed that pitch is a no-op for Keith Bell and Kerry Watson. Mark those
entries `no-pitch` so users are not offered a control that does nothing. Speed applies to every
voice and needs no flag.
- **Licensing**: keep the engine DLLs and voice data local and out of any repository; Veskslop - **Licensing**: keep the engine DLLs and voice data local and out of any repository; Veskslop
never bundles or redistributes them. never bundles or redistributes them.
+3 -1
View File
@@ -19,7 +19,9 @@ ROOT=$(CDPATH= cd -- "$HERE/.." && pwd)
export WINEPREFIX=${WINEPREFIX:-$HOME/.wine-microslopsam} export WINEPREFIX=${WINEPREFIX:-$HOME/.wine-microslopsam}
export WINEARCH=win32 export WINEARCH=win32
VOICES="sam|Sam|male|en,mary|Mary|female|en,mike|Mike|male|en,keith-bell|Keith Bell|male|en,kerry-watson|Kerry Watson|female|en,mike-telephone|Mike (for Telephone)|male|en,mary-telephone|Mary (for Telephone)|female|en,mike-hall|Mike in Hall|male|en,mike-stadium|Mike in Stadium|male|en,mike-space|Mike in Space|male|en,mary-hall|Mary in Hall|female|en,mary-stadium|Mary in Stadium|female|en,mary-space|Mary in Space|female|en" # VESKSLOP_TTS_VOICES entries: id|Name|gender|language[|flags]
# `no-pitch` marks voices whose engine ignores pitch (Flextalk).
VOICES="sam|Sam|male|en,mary|Mary|female|en,mike|Mike|male|en,keith-bell|Keith Bell|male|en|no-pitch,kerry-watson|Kerry Watson|female|en|no-pitch,mike-telephone|Mike (for Telephone)|male|en,mary-telephone|Mary (for Telephone)|female|en,mike-hall|Mike in Hall|male|en,mike-stadium|Mike in Stadium|male|en,mike-space|Mike in Space|male|en,mary-hall|Mary in Hall|female|en,mary-stadium|Mary in Stadium|female|en,mary-space|Mary in Space|female|en"
if [ "${1:-}" = "--voices" ]; then if [ "${1:-}" = "--voices" ]; then
echo "$VOICES" echo "$VOICES"