| |
| """ |
| Synthesize Tamil-script text with the female VITS checkpoint. |
| |
| Usage: |
| python inference.py "சொராஷ்ட்ர மொழி" -o output.wav |
| python inference.py "சொராஷ்ட்ர மொழி" --gpu 1 |
| python inference.py "சொராஷ்ட்ர மொழி" --cpu |
| """ |
| import argparse |
| import os |
| import re |
| import unicodedata |
| from pathlib import Path |
|
|
| import torch |
| from TTS.api import TTS |
|
|
| CHECKPOINT = "best_model.pth" |
| MODEL_DIR = Path(__file__).parent |
|
|
|
|
| def clean_text(text: str) -> str: |
| text = re.sub(r"(?:\{[^}]*\}\s*)+", lambda m: re.findall(r"\{([^}]*)\}", m.group(0))[-1].strip(), text) |
| text = unicodedata.normalize("NFC", text) |
| text = text.replace(":", "").replace(".", "").replace("'", "").replace("’", "") |
| return re.sub(r" +", " ", text).strip() |
|
|
|
|
| def synthesize(tts, text: str, output_path: str) -> None: |
| tts.tts_to_file(text=text, file_path=output_path) |
|
|
|
|
| def main(): |
| parser = argparse.ArgumentParser(description="Female Tamil-script TTS inference") |
| parser.add_argument("text", help="Input text in Tamil script") |
| parser.add_argument("-o", "--output", default="output.wav", help="Output WAV path (default: output.wav)") |
| parser.add_argument("--gpu", type=int, default=0, help="GPU device ID (default: 0)") |
| parser.add_argument("--cpu", action="store_true", help="Force CPU inference") |
| args = parser.parse_args() |
|
|
| if not args.cpu: |
| os.environ["CUDA_VISIBLE_DEVICES"] = str(args.gpu) |
|
|
| device = "cpu" if args.cpu else ("cuda:0" if torch.cuda.is_available() else "cpu") |
|
|
| tts = TTS( |
| model_path=str(MODEL_DIR / CHECKPOINT), |
| config_path=str(MODEL_DIR / "config.json"), |
| progress_bar=False, |
| ) |
| tts.to(device) |
|
|
| text = clean_text(args.text) |
| print(f"Device : {device}") |
| print(f"Text : {text}") |
| print(f"Output : {args.output}") |
|
|
| synthesize(tts, text, args.output) |
| print("Done.") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|