fix(tts): remove monster-voice artefact — disable librosa pitch shift, base speed 1.3→1.0
The emotional TTS path applied a librosa post-hoc pitch_shift (±1–3 semitones) on top of a 1.3x-fast Melo base, producing a robotic "monster" delivery. Zero out the pitch column for every emotion so pitch_shift is never invoked (the worker's _pitch_shift already no-ops on 0.0), and drop the default synthesis speed to 1.0. Emotion is now conveyed by speed alone — natural, artefact-free. The pitch column is retained so a proper pitch method can be re-enabled later. Verified: 29 tests pass; real 2-emotion synthesis on CUDA yields a clean wav with pitch=0.0 on all segments. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -12,7 +12,7 @@ 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 synthesis speed multiplier (default 1.3)
|
||||
WSAI_TTS_SPEED synthesis speed multiplier (default 1.0)
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
@@ -93,7 +93,7 @@ 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.3"))
|
||||
else os.environ.get("WSAI_TTS_SPEED", "1.0"))
|
||||
self.sink = sink or _log_sink
|
||||
self._proc: asyncio.subprocess.Process | None = None
|
||||
self._lock = asyncio.Lock()
|
||||
|
||||
Reference in New Issue
Block a user