diff --git a/README.md b/README.md index 22f765a..cb4ad66 100644 --- a/README.md +++ b/README.md @@ -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 `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). -Flextalk voices ignore pitch (engine limitation); everything else maps as documented in -`docs/TTS-DESIGN.md`. +Flextalk voices ignore pitch (engine limitation) and are declared with the `no-pitch` +flag; everything else maps as documented in `docs/TTS-DESIGN.md`. ## Layout diff --git a/docs/TTS-DESIGN.md b/docs/TTS-DESIGN.md index af05172..63f6736 100644 --- a/docs/TTS-DESIGN.md +++ b/docs/TTS-DESIGN.md @@ -137,10 +137,13 @@ Implemented on the Veskslop side (2026-09-15): `VESKSLOP_TTS_PITCH` only when the value is 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. -- Command mode advertises voices through `VESKSLOP_TTS_VOICES` - (`id`, `id|Name`, `id|Name|gender`, or `id|Name|gender|language`, comma separated). 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. +- Command mode advertises voices through `VESKSLOP_TTS_VOICES`. Entries are separated by commas or + newlines and use `id`, `id|Name`, `id|Name|gender`, `id|Name|gender|language`, or + `id|Name|gender|language|flags`, where flags are `+`-separated. The `no-pitch` flag marks a voice + 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 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 (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 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 `VESKSLOP_TTS_PITCH` from the environment when Veskslop later exports them. @@ -299,6 +303,10 @@ _Added 2026-09-15._ the client's display. - **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, - 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 never bundles or redistributes them. diff --git a/setup/vekslop-tts.sh b/setup/vekslop-tts.sh index dab692a..e115199 100755 --- a/setup/vekslop-tts.sh +++ b/setup/vekslop-tts.sh @@ -19,7 +19,9 @@ ROOT=$(CDPATH= cd -- "$HERE/.." && pwd) export WINEPREFIX=${WINEPREFIX:-$HOME/.wine-microslopsam} 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 echo "$VOICES"