feat(tts): new default tone (1.35/-0.07/-0.30) + collapsible dashboard panel

- Change default voice controls to the user's tuned values: glyph speed 1.35,
  word_gap -0.07s (-70ms), sentence_gap -0.30s, pitch 0 (env defaults, slider
  initial values, and the 기본값 reset button all updated).
- Make the "봇 목소리(TTS) 조절" dashboard panel collapsible via its header;
  starts collapsed (▸), expands on click (▾).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
EJClaw
2026-08-26 22:57:52 +09:00
parent 2ce2806102
commit 39b743d976
2 changed files with 37 additions and 28 deletions

View File

@@ -12,9 +12,9 @@ Env:
WSAI_MELO_DEVICE cpu | cuda | auto (default auto: GPU if torch sees one,
else CPU; the worker falls back to CPU if CUDA fails)
WSAI_TTS_OUT_DIR where wavs are written (default ~/.cache/wsai/tts)
WSAI_TTS_SPEED glyph speed / length_scale multiplier (0.5..2.0, default 1.25)
WSAI_TTS_WORD_GAP intra-sentence pause delta, sec (-0.2..0.5, default 0.25)
WSAI_TTS_SENTENCE_GAP sentence-boundary silence, sec (-0.5..1.5, default 0.75)
WSAI_TTS_SPEED glyph speed / length_scale multiplier (0.5..2.0, default 1.35)
WSAI_TTS_WORD_GAP intra-sentence pause delta, sec (-0.2..0.5, default -0.07)
WSAI_TTS_SENTENCE_GAP sentence-boundary silence, sec (-0.5..1.5, default -0.30)
WSAI_TTS_PITCH global semitone offset (-12..12, default 0.0)
"""
@@ -99,12 +99,12 @@ class MeloTTS:
self.out_dir = Path(out_dir or os.environ.get("WSAI_TTS_OUT_DIR")
or (Path.home() / ".cache/wsai/tts"))
self.speed = float(speed if speed is not None
else os.environ.get("WSAI_TTS_SPEED", "1.25"))
else os.environ.get("WSAI_TTS_SPEED", "1.35"))
# Reply-global rhythm/pitch controls (see melo_worker.py / docs manual).
self.word_gap = float(word_gap if word_gap is not None
else os.environ.get("WSAI_TTS_WORD_GAP", "0.25"))
else os.environ.get("WSAI_TTS_WORD_GAP", "-0.07"))
self.sentence_gap = float(sentence_gap if sentence_gap is not None
else os.environ.get("WSAI_TTS_SENTENCE_GAP", "0.75"))
else os.environ.get("WSAI_TTS_SENTENCE_GAP", "-0.30"))
self.pitch = float(pitch if pitch is not None
else os.environ.get("WSAI_TTS_PITCH", "0.0"))
self.sink = sink or _log_sink