aboutsummaryrefslogtreecommitdiff
path: root/app/converter/converter.py
diff options
context:
space:
mode:
authorhistoria <historiavg@proton.me>2026-08-25 16:49:36 -0400
committerhistoria <historiavg@proton.me>2026-08-25 16:49:36 -0400
commit775b716d86f5e681807698522e56c3d0f861c5bf (patch)
tree420b31c7b2f743ee83ad933bbc00073d5f6b9e2a /app/converter/converter.py
parent867866f131b0b6c76c54272791e7f7dea01db990 (diff)
downloadtts-audiobook-generator-775b716d86f5e681807698522e56c3d0f861c5bf.tar.gz
feat: combine --speaker and --voice for clarity
Diffstat (limited to 'app/converter/converter.py')
-rw-r--r--app/converter/converter.py38
1 files changed, 15 insertions, 23 deletions
diff --git a/app/converter/converter.py b/app/converter/converter.py
index 6e677c8..80411d3 100644
--- a/app/converter/converter.py
+++ b/app/converter/converter.py
@@ -185,7 +185,6 @@ class AudiobookConverter:
instructions: Optional[str] = None,
request_options: Optional[Dict[str, str]] = None,
api_url: Optional[str] = None,
- speaker: Optional[str] = None,
progress: Optional[Callable[[dict], None]] = None,
cancel=None):
if speed <= 0:
@@ -206,7 +205,6 @@ class AudiobookConverter:
self.output_format = output_format
self.backend = backend
self.voice = voice
- self.speaker = speaker
self.debug = bool(debug)
# Voice design / style instruction and free-form request options
# (audio.cpp only): forwarded to AudioCppTTSClient, which validates
@@ -219,18 +217,17 @@ class AudiobookConverter:
# configured on the server, so no local reference audio is needed.
self.tts = FasterTTSClient(voice=voice, api_url=api_url)
elif backend == BACKEND_AUDIOCPP:
- # Speaker mode (--speaker or no flag on a CustomVoice entry) uses
- # a built-in speaker name; an explicit --voice selects a
- # server-side preset (cloning). model_id overrides
- # AUDIOCPP_MODEL_ID for multi-model servers; instructions describe
- # or style the voice, request_options pass per-model controls
- # through to the server.
+ # --voice picks the voice: a built-in speaker name on the
+ # CustomVoice entry, or a server-side preset (cloning)
+ # elsewhere. model_id overrides AUDIOCPP_MODEL_ID for
+ # multi-model servers; instructions describe or style the
+ # voice, request_options pass per-model controls through to
+ # the server.
self.tts = AudioCppTTSClient(voice=voice, language=self.language,
model_id=model_id,
instructions=instructions,
request_options=self.request_options,
- api_url=api_url,
- speaker=speaker)
+ api_url=api_url)
else:
self.tts = QwenTTSClient(
voice_mode=voice_mode,
@@ -294,14 +291,13 @@ class AudiobookConverter:
"""Narrator name used in output file names (see compute_narrator_tag)."""
return self.compute_narrator_tag(
self.backend, self.voice, self.voice_mode,
- self.voice_clone_ref_audio, self.instructions, self.speaker)
+ self.voice_clone_ref_audio, self.instructions)
@staticmethod
def compute_narrator_tag(backend: str, voice: Optional[str],
voice_mode: str,
voice_clone_ref_audio: Optional[str],
- instructions: Optional[str] = None,
- speaker: Optional[str] = None) -> str:
+ instructions: Optional[str] = None) -> str:
"""Narrator name used in output file names, without a server connection.
Custom voice mode uses the built-in speaker's display name; voice
@@ -322,8 +318,6 @@ class AudiobookConverter:
elif backend == BACKEND_AUDIOCPP:
if voice:
narrator = voice
- elif speaker:
- narrator = speaker
elif instructions:
# The voice comes from the instruction, not a speaker name.
narrator = "designed"
@@ -677,12 +671,12 @@ class AudiobookConverter:
self._say(f"audio.cpp endpoint: {config.AUDIOCPP_API_URL}")
self._say(f"Model id: {self.tts.model_id}")
self._say(f"Model family: {getattr(self.tts, 'family', 'unknown')}")
- if self.voice:
+ if getattr(self.tts, "preset_mode", False):
self._say("Backend: audio.cpp (voice cloning, reference configured on server)")
- self._say(f"Voice: {self.voice}")
- elif self.speaker:
+ self._say(f"Voice: {self.tts.voice}")
+ elif getattr(self.tts, "speaker_mode", False):
self._say("Backend: audio.cpp (custom voice, built-in speaker)")
- self._say(f"Speaker: {self.speaker}")
+ self._say(f"Speaker: {self.tts.voice}")
elif self.instructions:
self._say("Backend: audio.cpp (voice from --instructions description)")
self._say(f"Instruction: {self.instructions}")
@@ -726,7 +720,6 @@ class AudiobookConverter:
voice_clone_ref_audio: Optional[str],
output_format: str,
instructions: Optional[str] = None,
- speaker: Optional[str] = None,
confirm: Optional[Callable[[str, bool], bool]] = None,
) -> Tuple[List[Path], List[Tuple[Path, str]]]:
"""Discover books and ask every overwrite question up front.
@@ -758,8 +751,7 @@ class AudiobookConverter:
# starts, so the rest of the run is unattended.
planned: List[Tuple[Path, str]] = []
narrator_tag = AudiobookConverter.compute_narrator_tag(
- backend, voice, voice_mode, voice_clone_ref_audio, instructions,
- speaker)
+ backend, voice, voice_mode, voice_clone_ref_audio, instructions)
for book_file in book_files:
output_name = book_file.stem
if stem_counts[book_file.stem] > 1:
@@ -795,7 +787,7 @@ class AudiobookConverter:
book_files, planned = AudiobookConverter.preflight_overwrites(
self.backend, self.voice, self.voice_mode,
self.voice_clone_ref_audio, self.output_format,
- self.instructions, self.speaker)
+ self.instructions)
if not book_files:
self._say(f"[INFO] No supported files found in {BOOKS_FOLDER}")