aboutsummaryrefslogtreecommitdiff
path: root/converter/converter.py
diff options
context:
space:
mode:
authorhistoria <historiavg@proton.me>2026-08-18 17:58:04 -0400
committerhistoria <historiavg@proton.me>2026-08-18 17:58:04 -0400
commite56754498f1c6b2a9dabb62529f783e73fae8e6b (patch)
tree20ea86a16d6c51c4bfd793cea56fd76ae9985671 /converter/converter.py
parent50f1825f05972e3685c55beb10c288899959b2e5 (diff)
downloadtts-audiobook-generator-e56754498f1c6b2a9dabb62529f783e73fae8e6b.tar.gz
feat: language parameter for potential accent tuning
Diffstat (limited to 'converter/converter.py')
-rw-r--r--converter/converter.py16
1 files changed, 11 insertions, 5 deletions
diff --git a/converter/converter.py b/converter/converter.py
index 6d09e09..29d3bc4 100644
--- a/converter/converter.py
+++ b/converter/converter.py
@@ -13,7 +13,7 @@ from typing import Dict, List, Optional, Tuple
from . import audio, chunking, config, cover, extractors
from .audio import TrackMeta
-from .tts import QwenTTSClient
+from .tts import QwenTTSClient, normalize_language
logger = logging.getLogger(__name__)
@@ -88,11 +88,16 @@ class AudiobookConverter:
def __init__(self, voice_mode: str = config.VOICE_MODE_CUSTOM, voice_clone_ref_audio: Optional[str] = None,
voice_clone_ref_text: Optional[str] = None, skip_transcription: bool = False,
- speed: float = 1.0, single_file: bool = False, output_format: str = "mp3"):
+ speed: float = 1.0, single_file: bool = False, output_format: str = config.AUDIO_FORMAT,
+ language: Optional[str] = None):
if speed <= 0:
raise ValueError(f"Speed must be a positive number, got {speed}")
if output_format not in config.AUDIO_FORMATS:
raise ValueError(f"Unsupported output format: {output_format}")
+ if language is None:
+ language = (config.VOICE_CLONE_LANGUAGE if voice_mode == config.VOICE_MODE_CLONE
+ else config.CUSTOM_VOICE_LANGUAGE)
+ self.language = normalize_language(language)
self.voice_mode = voice_mode
self.voice_clone_ref_audio = voice_clone_ref_audio
self.speed = speed
@@ -104,6 +109,7 @@ class AudiobookConverter:
voice_clone_ref_audio=voice_clone_ref_audio,
voice_clone_ref_text=voice_clone_ref_text,
skip_transcription=skip_transcription,
+ language=self.language,
)
def _validate_configuration(self) -> None:
@@ -117,7 +123,7 @@ class AudiobookConverter:
if not self.voice_clone_ref_audio:
raise ValueError(
"Voice Clone mode requires a reference audio file. "
- "Use --voice-sample <path> to specify it."
+ "Use --clone <path> to specify it."
)
if not Path(self.voice_clone_ref_audio).exists():
@@ -366,10 +372,10 @@ class AudiobookConverter:
print("Model size: 1.7B (always)")
if self.voice_mode == config.VOICE_MODE_CUSTOM:
print(f"Speaker: {config.CUSTOM_VOICE_SPEAKER}")
- print(f"Language: {config.CUSTOM_VOICE_LANGUAGE}")
+ print(f"Language: {self.language}")
elif self.voice_mode == config.VOICE_MODE_CLONE:
print(f"Reference audio: {Path(self.voice_clone_ref_audio).name}")
- print(f"Language: {config.VOICE_CLONE_LANGUAGE}")
+ print(f"Language: {self.language}")
print(f"Output format: {self.output_format}")
if self.single_file and self.output_format != "m4b":
print("Chapter mode: single file (--single-file)")