From d48e87c44fbca04b2669ca561d859532229aec60 Mon Sep 17 00:00:00 2001 From: Dryw Wade Date: Wed, 25 Mar 2026 09:39:15 -0600 Subject: [PATCH 1/4] boards/SPARKFUN_THINGPLUS_ESP32C5: Add SparkFun Thing Plus ESP32-C5 img. Signed-off-by: Thanh20VN --- .../30678-Thing-Plus-ESP32-C5-Feature.jpg | Bin 0 -> 112805 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 boards/SPARKFUN_THINGPLUS_ESP32C5/30678-Thing-Plus-ESP32-C5-Feature.jpg diff --git a/boards/SPARKFUN_THINGPLUS_ESP32C5/30678-Thing-Plus-ESP32-C5-Feature.jpg b/boards/SPARKFUN_THINGPLUS_ESP32C5/30678-Thing-Plus-ESP32-C5-Feature.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2a1185a085090f3b93ac468297166af00d56c34c GIT binary patch literal 112805 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%0DHZ=hTCEfdF+_4{LRsklkxKsI=IRv@SHd6tV;QO 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

2#RcF> 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 HIrIMj?2GGB literal 0 HcmV?d00001 From 35dc673c1af1dcc02a19bdbce6eed06253ecc588 Mon Sep 17 00:00:00 2001 From: thanh20VN <95450843+thanh20VN@users.noreply.github.com> Date: Mon, 18 May 2026 11:20:04 +0000 Subject: [PATCH 2/4] stm32/boards: Add support for WEACT STM32WB55CGU6 board. --- boards/WEACT_STM32WB55CGU6/STM32WB55CGU6.jpg | Bin 0 -> 139558 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 boards/WEACT_STM32WB55CGU6/STM32WB55CGU6.jpg diff --git a/boards/WEACT_STM32WB55CGU6/STM32WB55CGU6.jpg b/boards/WEACT_STM32WB55CGU6/STM32WB55CGU6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12d40a535cbc2b4bdf4a3ea803d919f3c2ea2fff GIT binary patch literal 139558 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 literal 0 HcmV?d00001 From a8e9df4446895f2c166eff95f402b527778cf13c Mon Sep 17 00:00:00 2001 From: thanh20VN <95450843+thanh20VN@users.noreply.github.com> Date: Fri, 5 Jun 2026 21:04:34 +0700 Subject: [PATCH 3/4] Add files via upload --- gradio_main.py | 2005 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2005 insertions(+) create mode 100644 gradio_main.py diff --git a/gradio_main.py b/gradio_main.py new file mode 100644 index 0000000..32647dd --- /dev/null +++ b/gradio_main.py @@ -0,0 +1,2005 @@ +import sys +import io +if sys.platform == "win32": + try: + sys.stdout.reconfigure(encoding="utf-8") + sys.stderr.reconfigure(encoding="utf-8") + except Exception: + sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") + sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8", errors="replace") + +import gradio as gr +print("⏳ Đang khởi động VieNeu-TTS... Vui lòng chờ...") +import soundfile as sf +import tempfile +from vieneu import Vieneu +import os +import time +import numpy as np +import queue +import threading +import yaml +import uuid +from vieneu_utils.core_utils import split_text_into_chunks, join_audio_chunks, env_bool, get_silence_duration_v2 +from vieneu_utils.phonemize_text import phonemize_to_chunks +from sea_g2p import Normalizer +import gc + +from apps.ui_utils import ( + _format_duration, + _split_estimate_status, + wrap_with_estimate, + cleanup_gpu_memory, + get_ref_text_cached, + on_codec_change, + validate_audio_duration, + on_custom_id_change +) +from apps.ui_constants import ( + theme, + css, + head_html, + DEFAULT_TEXT_GPU, + DEFAULT_TEXT_TURBO +) + +# --- CONSTANTS & CONFIG --- +CONFIG_PATH = os.path.join(os.path.dirname(os.path.dirname(__file__)), "config.yaml") +try: + with open(CONFIG_PATH, "r", encoding="utf-8") as f: + _config = yaml.safe_load(f) or {} +except Exception as e: + raise RuntimeError(f"Không thể đọc config.yaml: {e}") + +BACKBONE_CONFIGS = _config.get("backbone_configs", {}) +CODEC_CONFIGS = _config.get("codec_configs", {}) + +# Refilter and Simplify Configs per requirements +HAS_GPU = False +try: + import torch + HAS_GPU = torch.cuda.is_available() or (sys.platform == "darwin" and torch.backends.mps.is_available()) +except ImportError: + pass + +filtered_backbones = {} +if HAS_GPU: + filtered_backbones["VieNeu-TTS-v2 (GPU)"] = { + "repo": "pnnbao-ump/VieNeu-TTS-v2", + "supports_streaming": False, + "description": "VieNeu-TTS Version 2 - hỗ trợ song ngữ (Anh-Việt) và chế độ podcast" + } + filtered_backbones["VieNeu-TTS (GPU)"] = { + "repo": "pnnbao-ump/VieNeu-TTS", + "supports_streaming": False, + "description": "VieNeu-TTS Version 1 - ổn định, production-ready" + } + filtered_backbones["VieNeu-TTS-0.3B-ngoc-huyen (GPU)"] = { + "repo": "pnnbao-ump/VieNeu-TTS-0.3B-ngoc-huyen", + "supports_streaming": False, + "description": "VieNeu-TTS-0.3B - Ngọc Huyền" + } + +filtered_backbones["VieNeu-TTS-v2 (CPU)"] = { + "repo": "pnnbao-ump/VieNeu-TTS-v2", + "gguf_filename": "VieNeu-TTS-v2-Q4-K-M.gguf", + "supports_streaming": False, + "description": "VieNeu-TTS-v2 (CPU) - GGUF Q4_K_M, hỗ trợ song ngữ & podcast" +} + +filtered_backbones["VieNeu-TTS-v2-Turbo (CPU)"] = { + "repo": "pnnbao-ump/VieNeu-TTS-v2-Turbo-GGUF", + "supports_streaming": True, + "description": "VieNeu-TTS-v2-Turbo - Siêu nhanh, tối ưu tuyệt đối cho CPU & Thiết bị yếu" +} + +BACKBONE_CONFIGS = filtered_backbones + +filtered_codecs = { + "NeuCodec (Distill)": { + "repo": "neuphonic/distill-neucodec", + "description": "Codec mặc định cho model GPU", + "use_preencoded": False + }, + "NeuCodec (ONNX)": { + "repo": "neuphonic/neucodec-onnx-decoder-int8", + "description": "Codec siêu nhẹ, tối ưu cho CPU (ONNX)", + "use_preencoded": False + }, + "VieNeu-Codec": { + "repo": "pnnbao-ump/VieNeu-Codec", + "description": "Codec tối ưu cho Turbo v2 (ONNX)", + "use_preencoded": False + } +} +CODEC_CONFIGS = filtered_codecs + +_text_settings = _config.get("text_settings", {}) +MAX_CHARS_PER_CHUNK = _text_settings.get("max_chars_per_chunk", 256) +MAX_TOTAL_CHARS_STREAMING = _text_settings.get("max_total_chars_streaming", 3000) + +if not BACKBONE_CONFIGS or not CODEC_CONFIGS: + raise ValueError("config.yaml thiếu backbone_configs hoặc codec_configs") + +# --- 1. MODEL CONFIGURATION --- +# Global model instance +tts = None +current_backbone = None +current_codec = None +model_loaded = False +using_lmdeploy = False +PRESET_VOICES_CACHE = [] # List of all voices (tuples or strings) +CONV_VOICES_CACHE = [] # Filtered list for conversation (podcast=True) +MAX_SPEAKERS = 8 # Max concurrent speakers in conversation tab + +# Normalizer (module-level singleton) +_text_normalizer = Normalizer() + +def get_available_devices() -> list[str]: + """Get list of available devices for current platform.""" + devices = ["Auto", "CPU"] + + try: + import torch + if sys.platform == "darwin" and torch.backends.mps.is_available(): + devices.append("MPS") + elif torch.cuda.is_available(): + devices.append("CUDA") + except ImportError: + pass + + return devices + +def get_model_status_message() -> str: + """Reconstruct status message from global state""" + global model_loaded, tts, using_lmdeploy, current_backbone, current_codec + if not model_loaded or tts is None: + return "⏳ Chưa tải model." + + if "v2-Turbo" in (current_backbone or ""): + backend_name = "⚡ Turbo (v2)" + elif using_lmdeploy: + backend_name = "🚀 LMDeploy (Optimized)" + else: + backend_name = "📦 Standard" + + # We don't track the exact device strings perfectly in global state, so we estimate + try: + import torch + has_mps = torch.backends.mps.is_available() + has_cuda = torch.cuda.is_available() + except: + has_mps = has_cuda = False + + device_info = "GPU (CUDA)" if (using_lmdeploy or "CUDA" in (current_backbone or "")) else ("MPS (Metal)" if has_mps else "Auto") + + if "v2-Turbo" in (current_backbone or ""): + codec_device = "GPU/MPS" if (has_cuda or has_mps) else "CPU" + elif "ONNX" in (current_codec or ""): + codec_device = "CPU" + else: + codec_device = "GPU/MPS" if (has_cuda or has_mps) else "CPU" + + preencoded_note = "" + opt_info = "" + if using_lmdeploy and hasattr(tts, 'get_optimization_stats'): + stats = tts.get_optimization_stats() + opt_info = ( + f"\n\n🔧 Tối ưu hóa:" + f"\n • Triton: {'✅' if stats['triton_enabled'] else '❌'}" + f"\n • Max Batch Size (Default): {stats.get('max_batch_size', 'N/A')}" + f"\n • Reference Cache: {stats['cached_references']} voices" + f"\n • Prefix Caching: ❌" + ) + + return ( + f"✅ Model đã tải thành công!\n\n" + f"🔧 Backend: {backend_name}\n" + f" Parrot: {current_backbone} on {device_info}\n" + f"🎵 Codec: {current_codec} on {codec_device}{preencoded_note}{opt_info}" + ) + +def restore_ui_state(): + """Update UI components based on persistence""" + global model_loaded + msg = get_model_status_message() + return ( + msg, + gr.update(interactive=model_loaded), # btn_generate + gr.update(interactive=model_loaded), # btn_generate_conv + gr.update(interactive=False) # btn_stop + ) + +def should_use_lmdeploy(backbone_choice: str, device_choice: str) -> bool: + """Determine if we should use LMDeploy backend.""" + # LMDeploy not supported on macOS + if sys.platform == "darwin": + return False + + if "gguf" in backbone_choice.lower() or "v2-turbo" in backbone_choice.lower(): + return False + + try: + import torch + if device_choice == "Auto": + has_gpu = torch.cuda.is_available() + elif device_choice == "CUDA": + has_gpu = torch.cuda.is_available() + else: + has_gpu = False + return has_gpu + except ImportError: + return False + +def load_model(backbone_choice: str, codec_choice: str, device_choice: str, + force_lmdeploy: bool, custom_model_id: str = "", custom_base_model: str = "", + custom_hf_token: str = ""): + """Load model with optimizations and max batch size control""" + global tts, current_backbone, current_codec, model_loaded, using_lmdeploy + lmdeploy_error_reason = None + model_loaded = False # Ensure we don't try to use a half-loaded model + + # Helper for slot updates (initially no change) + slot_no_updates = [gr.update()] * MAX_SPEAKERS + + yield ( + "⏳ Đang tải model với tối ưu hóa... Lưu ý: Quá trình này sẽ tốn thời gian. Vui lòng kiên nhẫn.", + gr.update(interactive=False), # btn_generate + gr.update(interactive=False), # btn_generate_conv + gr.update(interactive=False), # btn_load + gr.update(interactive=False), # btn_stop + gr.update(), # voice_select + gr.update(), gr.update(), gr.update(), gr.update(), # tab_p, tab_c, tab_sel, mode_state + gr.update(), # conv_tab + *slot_no_updates + ) + + try: + # Cleanup before loading new model + if tts is not None: + tts = None # Reset instead of del to avoid NameError if load fails + cleanup_gpu_memory() + + # Prepare Backbone Config/Repo + custom_loading = False + is_merged_lora = False + + if backbone_choice == "Custom Model": + custom_loading = True + if not custom_model_id or not custom_model_id.strip(): + yield ( + "❌ Lỗi: Vui lòng nhập Model ID cho Custom Model.", + gr.update(interactive=False), gr.update(interactive=False), gr.update(interactive=True), gr.update(interactive=False), gr.update(), + gr.update(), gr.update(), gr.update(), gr.update(), + gr.update(), # conv_tab + *slot_no_updates + ) + return + + # Check if it is a LoRA to merge + if "lora" in custom_model_id.lower(): + # Merging mode + print(f"🔄 Detected LoRA in name. preparing merge with base: {custom_base_model}") + if custom_base_model not in BACKBONE_CONFIGS: + yield ( + f"❌ Lỗi: Base Model '{custom_base_model}' không hợp lệ.", + gr.update(interactive=False), gr.update(interactive=False), gr.update(interactive=True), gr.update(interactive=False), + gr.update(), gr.update(), gr.update(), gr.update(), gr.update(), + gr.update(), # conv_tab + *slot_no_updates + ) + return + + base_config = BACKBONE_CONFIGS[custom_base_model] + backbone_config = { + "repo": base_config["repo"], # Load base first + "supports_streaming": base_config["supports_streaming"], + "description": f"Custom Merged: {custom_model_id} + {custom_base_model}" + } + is_merged_lora = True + else: + # Normal custom model + backbone_config = { + "repo": custom_model_id.strip(), + "supports_streaming": False, # Assume false for unknown + "description": f"Custom Model: {custom_model_id}" + } + else: + backbone_config = BACKBONE_CONFIGS[backbone_choice] + + codec_config = CODEC_CONFIGS[codec_choice] + use_lmdeploy = False + + # Override LMDeploy if custom + if custom_loading: + if "gguf" in backbone_config['repo'].lower() or "v2-turbo" in backbone_config['repo'].lower(): + # GGUF must use Standard/Turbo backend + use_lmdeploy = False + elif is_merged_lora: + # LoRA can use LMDeploy if we merge first (checked logic below) or Standard + use_lmdeploy = force_lmdeploy and should_use_lmdeploy(custom_base_model, device_choice) + else: + # Full custom model (e.g. finetune) + use_lmdeploy = force_lmdeploy and should_use_lmdeploy("VieNeu-TTS (GPU)", device_choice) # Assume GPU compatible? + # Use LMDeploy only if Force LMDeploy is set and the model is compatible + # NOTE: For VieNeu-v2-Turbo, we handle LMDeploy inside TurboGPUVieNeuTTS class, + # so we set use_lmdeploy = False here to avoid generic FastVieNeuTTS loading. + # NOTE: For custom_loading, the block above already decided use_lmdeploy correctly + # (e.g. False for GGUF repos). Do NOT override that decision here. + if "v2-Turbo" in backbone_choice: + should_use_generic_fast = False + elif custom_loading: + should_use_generic_fast = False # already handled above per repo name + else: + should_use_generic_fast = force_lmdeploy and should_use_lmdeploy(backbone_choice, device_choice) + + if should_use_generic_fast: + use_lmdeploy = True + + if use_lmdeploy: + lmdeploy_error_reason = None + print(f"🚀 Using LMDeploy backend with optimizations") + + backbone_device = "cuda" + + if "ONNX" in codec_choice: + codec_device = "cpu" + else: + try: + import torch + codec_device = "cuda" if torch.cuda.is_available() else "cpu" + except ImportError: + codec_device = "cpu" + + # Special handling for Custom LoRA + LMDeploy -> Merge & Save + target_backbone_repo = backbone_config["repo"] + + if custom_loading and is_merged_lora: + safe_name = custom_model_id.strip().replace("/", "_").replace("\\", "_").replace(":", "") + cache_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), "merged_models_cache", safe_name) + target_backbone_repo = os.path.abspath(cache_dir) + + # Check if already merged (and voices.json exists) + if not os.path.exists(cache_dir) or not os.path.exists(os.path.join(cache_dir, "vocab.json")): + print(f"🔄 Merging LoRA for LMDeploy optimization: {cache_dir}") + if os.path.exists(cache_dir): + print(" ⚠️ Detected incomplete cache, rebuilding...") + yield ( + f"⏳ Đang merge và lưu model LoRA để tối ưu cho LMDeploy (thao tác này chỉ chạy một lần)...", + gr.update(interactive=False), + gr.update(interactive=False), + gr.update(interactive=False), + gr.update(interactive=False), + gr.update(), + gr.update(), gr.update(), gr.update(), gr.update(), + gr.update(), # conv_tab + *slot_no_updates + ) + + try: + # Use GPU for merging if available for speed + # We use the Base Model specified + from vieneu.standard import VieNeuTTS + base_repo = BACKBONE_CONFIGS[custom_base_model]["repo"] + merge_device = "cuda" if torch.cuda.is_available() else "cpu" + + print(f" • Loading base: {base_repo} ({merge_device})") + temp_tts = VieNeuTTS( + backbone_repo=base_repo, + backbone_device=merge_device, + codec_repo=codec_config["repo"], + codec_device="cpu", # Codec unused for merging, keep on CPU + hf_token=custom_hf_token + ) + + print(f" • Loading Adapter: {custom_model_id}") + temp_tts.load_lora_adapter(custom_model_id.strip(), hf_token=custom_hf_token) + + print(f" • Merging...") + if hasattr(temp_tts.backbone, "merge_and_unload"): + temp_tts.backbone = temp_tts.backbone.merge_and_unload() + + print(f" • Saving to cache: {cache_dir}") + temp_tts.backbone.save_pretrained(cache_dir) + temp_tts.tokenizer.save_pretrained(cache_dir) + + # Fix for LMDeploy: Explicitly save legacy tokenizer files (vocab.json, merges.txt) + # because LMDeploy/Transformers might default to slow tokenizer if fast one has issues, + # and save_pretrained on fast tokenizer sometimes omits legacy files. + try: + print(" • Ensuring legacy tokenizer files...") + from transformers import AutoTokenizer + slow_tokenizer = AutoTokenizer.from_pretrained(base_repo, use_fast=False) + slow_tokenizer.save_pretrained(cache_dir) + except Exception as e: + print(f" ⚠️ Warning: Could not save slow tokenizer files: {e}") + + # Save voices.json to cache directory so FastVieNeuTTS can find it + print(f" • Saving voices definition...") + import json + voices_json_path = os.path.join(cache_dir, "voices.json") + voices_content = { + "meta": { "note": "Automatically generated during LoRA merge" }, + "default_voice": temp_tts._default_voice, + "presets": temp_tts._preset_voices + } + with open(voices_json_path, 'w', encoding='utf-8') as f: + json.dump(voices_content, f, ensure_ascii=False, indent=2) + + del temp_tts + cleanup_gpu_memory() + print(" ✅ Merge & Save successfully!") + + except Exception as e: + import traceback + traceback.print_exc() + raise RuntimeError(f"Failed to merge & save LoRA for LMDeploy: {e}") + + print(f"📦 Loading optimized model...") + print(f" Backbone: {target_backbone_repo} on {backbone_device}") + print(f" Codec: {codec_config['repo']} on {codec_device}") + print(f" Triton: Enabled") + + try: + from vieneu.fast import FastVieNeuTTS + tts = FastVieNeuTTS( + backbone_repo=target_backbone_repo, + backbone_device=backbone_device, + codec_repo=codec_config["repo"], + codec_device=codec_device, + memory_util=0.3, + tp=1, + enable_prefix_caching=False, + enable_triton=True, + hf_token=custom_hf_token + ) + using_lmdeploy = True + + # Legacy caching removed + print(f" ✅ Optimized backend initialized") + + except Exception as e: + import traceback + traceback.print_exc() + + error_str = str(e) + if "$env:CUDA_PATH" in error_str: + lmdeploy_error_reason = "Không tìm thấy biến môi trường CUDA_PATH. Vui lòng cài đặt NVIDIA GPU Computing Toolkit." + else: + lmdeploy_error_reason = f"{error_str}" + + yield ( + f"⚠️ LMDeploy Init Error: {lmdeploy_error_reason}. Đang loading model với backend mặc định - tốc độ chậm hơn so với lmdeploy...", + gr.update(interactive=False), + gr.update(interactive=False), + gr.update(interactive=False), + gr.update(interactive=False), + gr.update(), + gr.update(), gr.update(), gr.update(), gr.update(), + gr.update(), # conv_tab + *slot_no_updates + ) + time.sleep(1) + use_lmdeploy = False + using_lmdeploy = False + + if not use_lmdeploy: + print(f"📦 Using original backend") + + if device_choice == "Auto": + repo_lower = backbone_config['repo'].lower() + is_gguf_backbone = "gguf" in repo_lower + + if is_gguf_backbone: + # GGUF backbones (llama-cpp-python): Metal on Mac, CUDA on Windows/Linux + if sys.platform == "darwin": + backbone_device = "gpu" # llama-cpp-python uses Metal via n_gpu_layers + else: + try: + import torch + backbone_device = "gpu" if torch.cuda.is_available() else "cpu" + except ImportError: + backbone_device = "cpu" + else: + # PyTorch backbones (Standard, Turbo GPU): use native torch device + try: + import torch + if sys.platform == "darwin": + backbone_device = "mps" if torch.backends.mps.is_available() else "cpu" + else: + backbone_device = "cuda" if torch.cuda.is_available() else "cpu" + except ImportError: + backbone_device = "cpu" + + # Codec device + if "ONNX" in codec_choice: + codec_device = "cpu" + else: + try: + import torch + if sys.platform == "darwin": + codec_device = "mps" if torch.backends.mps.is_available() else "cpu" + else: + codec_device = "cuda" if torch.cuda.is_available() else "cpu" + except ImportError: + codec_device = "cpu" + + elif device_choice == "MPS": + backbone_device = "mps" + codec_device = "mps" if "ONNX" not in codec_choice else "cpu" + + else: + backbone_device = device_choice.lower() + codec_device = device_choice.lower() + + if "ONNX" in codec_choice: + codec_device = "cpu" + + if "gguf" in backbone_config['repo'].lower() and backbone_device == "cuda": + # Only Llama-cpp (GGUF) uses the 'gpu' string for CUDA + backbone_device = "gpu" + + print(f"📦 Loading model...") + print(f" Backbone: {backbone_config['repo']} on {backbone_device}") + print(f" Codec: {codec_config['repo']} on {codec_device}") + + if "v2-Turbo" in backbone_choice: + # VieNeu v2 Turbo uses the dedicated backend + print(" ⚡ Mode: Turbo") + mode = "turbo_gpu" if "GPU" in backbone_choice else "turbo" + tts = Vieneu( + mode=mode, + backbone_repo=backbone_config["repo"], + decoder_repo=codec_config["repo"], + device=backbone_device, + backend="lmdeploy" if force_lmdeploy and "GPU" in backbone_choice else "standard", + hf_token=custom_hf_token + ) + else: + from vieneu.standard import VieNeuTTS + tts = VieNeuTTS( + backbone_repo=backbone_config["repo"], + backbone_device=backbone_device, + codec_repo=codec_config["repo"], + codec_device=codec_device, + hf_token=custom_hf_token, + gguf_filename=backbone_config.get("gguf_filename") + ) + + # Perform LoRA Merge if needed (ONLY for Standard Backend) + # For LMDeploy, we handled it above by saving to disk + if is_merged_lora and custom_loading and not using_lmdeploy: + yield ( + f"🔄 Đang tải và merge LoRA adapter: {custom_model_id}...", + gr.update(interactive=False), gr.update(interactive=False), gr.update(interactive=False), gr.update(interactive=False), gr.update(), + gr.update(), gr.update(), gr.update(), gr.update(), + gr.update(), # conv_tab + *slot_no_updates + ) + try: + # 1. Load Adapter + tts.load_lora_adapter(custom_model_id.strip(), hf_token=custom_hf_token) + + # 2. Merge and Unload + # Check if backbone matches expected type for merge + if hasattr(tts, 'backbone') and hasattr(tts.backbone, 'merge_and_unload'): + print(" 🔄 Merging LoRA into backbone...") + tts.backbone = tts.backbone.merge_and_unload() + + # Reset LoRA state so it behaves like a normal model + tts._lora_loaded = False + tts._current_lora_repo = None + print(" ✅ Merged successfully!") + else: + print(" ⚠️ Warning: Model does not support merge_and_unload, keeping adapter active.") + + except Exception as e: + raise RuntimeError(f"Failed to merge LoRA: {e}") + + using_lmdeploy = False + + current_backbone = backbone_choice + current_codec = codec_choice + model_loaded = True + + # Success message with optimization info + backend_name = "🚀 LMDeploy (Optimized)" if using_lmdeploy else "📦 Standard" + device_info = "cuda" if use_lmdeploy else (backbone_device if not use_lmdeploy else "N/A") + + streaming_support = "✅ Có" if backbone_config['supports_streaming'] else "❌ Không" + preencoded_note = "\n⚠️ Codec này cần sử dụng pre-encoded codes (.pt files)" if codec_config['use_preencoded'] else "" + + opt_info = "" + if using_lmdeploy and hasattr(tts, 'get_optimization_stats'): + stats = tts.get_optimization_stats() + opt_info = ( + f"\n\n🔧 Tối ưu hóa:" + f"\n • Triton: {'✅' if stats['triton_enabled'] else '❌'}" + f"\n • Max Batch Size (Default): {stats.get('max_batch_size', 'N/A')}" + f"\n • Reference Cache: {stats['cached_references']} voices" + f"\n • Prefix Caching: ❌" + ) + + warning_msg = "" + if lmdeploy_error_reason: + warning_msg = ( + f"\n\n⚠️ **Cảnh báo:** Không thể kích hoạt LMDeploy (Optimized Backend) do lỗi sau:\n" + f"👉 {lmdeploy_error_reason}\n" + f"💡 Hệ thống đã tự động chuyển về chế độ Standard (chậm hơn)." + ) + + success_msg = get_model_status_message() + if warning_msg: + success_msg += warning_msg + + # Prepare voice update + try: + # Get voices with descriptions for UI from SDK + voices = tts.list_preset_voices() + except Exception: + voices = [] + + has_voices = len(voices) > 0 + + if has_voices: + default_v = tts._default_voice + + # Helper to get values list + is_tuple = (len(voices) > 0 and isinstance(voices[0], tuple)) + voice_values = [v[1] for v in voices] if is_tuple else voices + + if not default_v and voice_values: + default_v = voice_values[0] + + # Ensure default_v is in the list and selected correctly + if default_v and default_v not in voice_values: + if is_tuple: + # Try to find a nice description if possible, else use ID + voices.append((default_v, default_v)) + else: + voices.append(default_v) + + # Sort voices by name/label for better UX + if is_tuple: + voices.sort(key=lambda x: str(x[0])) + else: + voices.sort() + + voice_update = gr.update(choices=voices, value=default_v, interactive=True) + + global PRESET_VOICES_CACHE, CONV_VOICES_CACHE + PRESET_VOICES_CACHE = voices + + # Filter voices for conversation tab (podcast=True) + # Handle both boolean True/False and string "True"/"False" + def _check_podcast(v_id): + val = tts._preset_voices.get(v_id, {}).get('podcast', True) + if isinstance(val, str): + return val.strip().lower() == "true" + return bool(val) + + CONV_VOICES_CACHE = [v for v in voices if _check_podcast(v[1])] + + slot_dd_update = gr.update(choices=CONV_VOICES_CACHE) + + # Show Standard Tabs + tab_p = gr.update(visible=True) + tab_c = gr.update(visible=True) + tab_sel = gr.update(selected="preset_mode") + mode_state = "preset_mode" + else: + # Missing voices.json case + msg = "⚠️ Không tìm thấy file voices.json. Vui lòng dùng Tab Voice Cloning." + voice_update = gr.update(choices=[msg], value=msg, interactive=False) + slot_dd_update = gr.update(choices=[]) + + # Show Preset Tab (to see message) and Custom Tab + tab_p = gr.update(visible=True) + tab_c = gr.update(visible=True) + tab_sel = gr.update(selected="preset_mode") + mode_state = "preset_mode" + + # Check if v2 for conversation tab + is_v2 = (backbone_choice == "VieNeu-TTS-v2 (GPU)" or backbone_choice == "VieNeu-TTS-v2 (CPU)") + conv_tab_update = gr.update(visible=is_v2) + + # Update all MAX_SPEAKERS slot dropdowns + slot_updates = [slot_dd_update] * MAX_SPEAKERS + + yield ( + success_msg, + gr.update(interactive=True), # btn_generate + gr.update(interactive=True), # btn_generate_conv + gr.update(interactive=True), # btn_load + gr.update(interactive=False), # btn_stop + voice_update, + tab_p, tab_c, tab_sel, mode_state, + conv_tab_update, + *slot_updates + ) + + except Exception as e: + import traceback + traceback.print_exc() + model_loaded = False + using_lmdeploy = False + + if "$env:CUDA_PATH" in str(e): + yield ( + "❌ Lỗi khi tải model: Không tìm thấy biến môi trường CUDA_PATH. Vui lòng cài đặt NVIDIA GPU Computing Toolkit (https://developer.nvidia.com/cuda/toolkit)", + gr.update(interactive=False), + gr.update(interactive=False), # btn_generate_conv + gr.update(interactive=True), # btn_load + gr.update(interactive=False), # btn_stop + gr.update(), # voice_select + gr.update(), gr.update(), gr.update(), gr.update(), + gr.update(), # conv_tab + *slot_no_updates + ) + else: + yield ( + f"❌ Lỗi khi tải model: {str(e)}", + gr.update(interactive=False), + gr.update(interactive=False), + gr.update(interactive=True), + gr.update(interactive=False), + gr.update(), + gr.update(), gr.update(), gr.update(), gr.update(), + gr.update(), # conv_tab + *slot_no_updates + ) + + +def resolve_voice_id(v_id: str) -> str: + """Robustly resolve voice ID, handling both display labels and internal IDs.""" + if not v_id: + return v_id + + global PRESET_VOICES_CACHE + if not PRESET_VOICES_CACHE: + return v_id + + for item in PRESET_VOICES_CACHE: + if isinstance(item, (list, tuple)) and len(item) >= 2: + label, value = item[0], item[1] + if v_id == value or v_id == label: + return value + else: + if v_id == item: + return item + + return v_id + +# --- TEXT SAFETY HELPERS --- +# Chặn input vượt context 2048 token của backbone. +MAX_INPUT_TOKENS = _text_settings.get("max_input_tokens", 1800) + + +class _ChunkProxy: + """Giữ nguyên các thuộc tính gốc của chunk, chỉ thay text.""" + + def __init__(self, base_chunk, text: str): + self._base_chunk = base_chunk + self.text = text + + def __getattr__(self, name): + return getattr(self._base_chunk, name) + + +def _get_model_tokenizer(): + """Lấy tokenizer từ tts hiện tại nếu có.""" + global tts + if tts is None: + return None + + candidate_attrs = ("tokenizer", "llm_tokenizer", "text_tokenizer", "processor") + for attr in candidate_attrs: + tok = getattr(tts, attr, None) + if tok is not None: + return tok + + backbone = getattr(tts, "backbone", None) + if backbone is not None: + for attr in candidate_attrs: + tok = getattr(backbone, attr, None) + if tok is not None: + return tok + + return None + + +def _count_tokens(tokenizer, text: str) -> int: + """Đếm token an toàn, fallback 0 nếu tokenizer lỗi.""" + if tokenizer is None: + return 0 + + try: + encoded = tokenizer(text, add_special_tokens=False) + input_ids = getattr(encoded, "input_ids", None) + + if input_ids is None and isinstance(encoded, dict): + input_ids = encoded.get("input_ids") + + if input_ids is None: + return 0 + + if isinstance(input_ids, list) and input_ids and isinstance(input_ids[0], (list, tuple)): + return len(input_ids[0]) + + return len(input_ids) + except Exception: + return 0 + + +def _split_text_by_token_limit(text: str, tokenizer, max_tokens: int = MAX_INPUT_TOKENS): + """Cắt text theo token, giữ style cắt theo từ.""" + text = (text or "").strip() + if not text: + return [] + + if tokenizer is None: + return [text] + + words = text.split() + if not words: + return [text] + + chunks = [] + current_words = [] + + for word in words: + candidate = " ".join(current_words + [word]).strip() + + if current_words and _count_tokens(tokenizer, candidate) > max_tokens: + chunks.append(" ".join(current_words).strip()) + current_words = [word] + else: + current_words.append(word) + + if current_words: + chunks.append(" ".join(current_words).strip()) + + return chunks or [text] + + +def _build_safe_text_chunks(raw_text: str, max_chars: int, is_v2_turbo: bool): + """ + Tạo chunk theo flow cũ của repo, rồi chặn thêm theo token. + - V2 Turbo: giữ object chunk gốc, chỉ thay .text nếu cần. + - Standard: giữ list str như cũ. + """ + tokenizer = _get_model_tokenizer() + + if is_v2_turbo: + base_chunks = phonemize_to_chunks(raw_text, max_chars=max_chars) + if tokenizer is None: + return base_chunks + + safe_chunks = [] + for chunk in base_chunks: + chunk_text = getattr(chunk, "text", str(chunk)) + refined_texts = _split_text_by_token_limit(chunk_text, tokenizer) + + if len(refined_texts) == 1 and refined_texts[0] == chunk_text: + safe_chunks.append(chunk) + else: + for refined in refined_texts: + safe_chunks.append(_ChunkProxy(chunk, refined)) + + return safe_chunks + + safe_chunks = [] + for raw_chunk in split_text_into_chunks(raw_text, max_chars=max_chars): + normalized_chunk = _text_normalizer.normalize(raw_chunk) + refined_texts = _split_text_by_token_limit(normalized_chunk, tokenizer) + + for refined in refined_texts: + safe_chunks.extend(split_text_into_chunks(refined, max_chars=max_chars)) + + return safe_chunks + + +# --- 2. DATA & HELPERS --- + +def synthesize_speech(text: str, voice_choice: str, custom_audio, custom_text: str, + mode_tab: str, generation_mode: str, use_batch: bool, max_batch_size_run: int, + temperature: float, max_chars_chunk: int, session_id: str = None): + """Synthesis with optimization support and max batch size control""" + global tts, current_backbone, current_codec, model_loaded, using_lmdeploy + + _STOP_EVENT.clear() # Reset for new generation + + if not model_loaded or tts is None: + yield None, "⚠️ Vui lòng tải model trước!" + return + + if not text or text.strip() == "": + yield None, "⚠️ Vui lòng nhập văn bản!" + return + + raw_text = text.strip() + + codec_config = CODEC_CONFIGS[current_codec] + use_preencoded = codec_config['use_preencoded'] + + + # Setup Reference + yield None, "📄 Đang xử lý Reference..." + + try: + ref_codes = None + ref_text_raw = "" + + if mode_tab == "preset_mode": + if not voice_choice: + raise ValueError("Vui lòng chọn giọng mẫu.") + if "⚠️" in voice_choice: + raise ValueError("Không có giọng mẫu khả dụng. Vui lòng chuyển sang Tab Voice Cloning.") + + # Use SDK method - handles caching and JSON internally + v_id = resolve_voice_id(voice_choice) + voice_data = tts.get_preset_voice(v_id) + ref_codes = voice_data['codes'] + ref_text_raw = voice_data['text'] + + elif mode_tab == "custom_mode": + if custom_audio is None: + raise ValueError("Vui lòng upload file Audio mẫu (Reference Audio)!") + + is_turbo = "v2-Turbo" in (current_backbone or "") + if not is_turbo and (not custom_text or not custom_text.strip()): + raise ValueError("Vui lòng nhập nội dung văn bản của Audio mẫu (Reference Text)!") + + ref_text_raw = custom_text.strip() if custom_text else "" + ref_codes = tts.encode_reference(custom_audio) + + # Ensure numpy for inference + if 'torch' in sys.modules: + import torch + if isinstance(ref_codes, torch.Tensor): + ref_codes = ref_codes.cpu().numpy() + + except Exception as e: + yield None, f"❌ Lỗi xử lý Reference Audio: {str(e)}" + return + + # === STANDARD MODE === + if generation_mode == "Standard (Một lần)": + backend_name = "LMDeploy" if using_lmdeploy else "Standard" + + is_v2_turbo = "v2-Turbo" in (current_backbone or "") + text_chunks = _build_safe_text_chunks(raw_text, max_chars_chunk, is_v2_turbo) + total_chunks = len(text_chunks) + + batch_info = " (Batch Mode)" if use_batch and using_lmdeploy and total_chunks > 1 else "" + + # Show batch size info + batch_size_info = "" + if use_batch and using_lmdeploy and hasattr(tts, 'max_batch_size'): + batch_size_info = f" [Max batch: {tts.max_batch_size}]" + + yield None, f"🚀 Bắt đầu tổng hợp {backend_name}{batch_info}{batch_size_info} ({total_chunks} đoạn)..." + + all_wavs = [] + sr = 24000 + + start_time = time.time() + + try: + if is_v2_turbo: + # Sequential processing with progress updates + total_chunks = len(text_chunks) + for i, chunk in enumerate(text_chunks): + if _STOP_EVENT.is_set(): + yield None, "⏹️ Đã dừng tạo giọng nói." + return + yield None, f"⚡ Turbo v2: Đang xử lý đoạn {i+1}/{total_chunks}..." + + chunk_wav = tts.infer( + chunk.text, + ref_codes=ref_codes, + temperature=temperature, + max_chars=max_chars_chunk, + skip_normalize=True, + skip_phonemize=True + ) + + if chunk_wav is not None and len(chunk_wav) > 0: + all_wavs.append(chunk_wav) + # Add silence between Gradio-level chunks for Turbo + if i < total_chunks - 1: + sil_dur = get_silence_duration_v2(chunk) + sil_wav = np.zeros(int(sr * sil_dur), dtype=np.float32) + all_wavs.append(sil_wav) + + # Use batch processing if enabled and using LMDeploy (for v1) + elif use_batch and using_lmdeploy and hasattr(tts, 'infer_batch') and total_chunks > 1: + # Process in mini-batches to allow cancellation between batches + num_batches = (total_chunks + max_batch_size_run - 1) // max_batch_size_run + total_batch_duration = 0.0 + completed_batches = 0 + + for i in range(0, total_chunks, max_batch_size_run): + if _STOP_EVENT.is_set(): + print("🛑 Synthesis stopped during batch processing.") + yield None, "⏹️ Đã dừng tạo giọng nói." + return + + batch_idx = i // max_batch_size_run + estimate_info = "" + if completed_batches > 0: + average_batch_duration = total_batch_duration / completed_batches + estimated_total = average_batch_duration * num_batches + estimated_remaining = average_batch_duration * max(0, num_batches - batch_idx) + estimate_info = ( + f" | Ước tính còn lại: {_format_duration(estimated_remaining)}" + f" / tổng: {_format_duration(estimated_total)}" + ) + yield None, f"⚡ Đang xử lý batch {batch_idx+1}/{num_batches} (đoạn {i+1}-{min(i+max_batch_size_run, total_chunks)}){estimate_info}..." + + current_batch = text_chunks[i : i + max_batch_size_run] + batch_start_time = time.time() + batch_wavs = tts.infer_batch( + current_batch, + ref_codes=ref_codes, + ref_text=ref_text_raw, + max_batch_size=max_batch_size_run, + temperature=temperature, + skip_normalize=True + ) + batch_duration = time.time() - batch_start_time + total_batch_duration += batch_duration + completed_batches += 1 + average_batch_duration = total_batch_duration / completed_batches + estimated_total = average_batch_duration * num_batches + estimated_remaining = average_batch_duration * max(0, num_batches - completed_batches) + for chunk_wav in batch_wavs: + if chunk_wav is not None and len(chunk_wav) > 0: + all_wavs.append(chunk_wav) + yield None, ( + f"✅ Xong batch {batch_idx+1}/{num_batches} " + f"(trung bình batch: {_format_duration(average_batch_duration)}, " + f"ước tính còn lại: {_format_duration(estimated_remaining)}, " + f"tổng: {_format_duration(estimated_total)})" + ) + + else: + # Sequential processing (PyTorch or GGUF v1) + for i, chunk in enumerate(text_chunks): + if _STOP_EVENT.is_set(): + yield None, "⏹️ Đã dừng tạo giọng nói." + return + yield None, f"⏳ Đang xử lý đoạn {i+1}/{total_chunks}..." + chunk_wav = tts.infer( + chunk, + ref_codes=ref_codes, + ref_text=ref_text_raw, + temperature=temperature, + max_chars=max_chars_chunk, + skip_normalize=True + ) + if chunk_wav is not None and len(chunk_wav) > 0: + all_wavs.append(chunk_wav) + + if not all_wavs: + yield None, "❌ Không sinh được audio nào." + return + + yield None, "💾 Đang ghép file và lưu..." + + # Use utility function for joining with silence/crossfade + # Default silence=0.15s to match SDK + silence_p = 0.15 if not is_v2_turbo else 0.0 # Turbo adds silence internally + final_wav = join_audio_chunks(all_wavs, sr=sr, silence_p=silence_p) + + with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as tmp: + sf.write(tmp.name, final_wav, sr) + output_path = tmp.name + + process_time = time.time() - start_time + backend_info = f" (Backend: {'LMDeploy 🚀' if using_lmdeploy else 'Standard 📦'})" + speed_info = f", Tốc độ: {len(final_wav)/sr/process_time:.2f}x realtime" if process_time > 0 else "" + + + yield output_path, f"✅ Hoàn tất! (Thời gian: {process_time:.2f}s{speed_info}){backend_info}" + + # Cleanup memory + if using_lmdeploy and hasattr(tts, 'cleanup_memory'): + tts.cleanup_memory() + + cleanup_gpu_memory() + + except Exception as e: + # Check for CUDA OOM specifically if torch is loaded + if 'torch' in sys.modules: + import torch + if isinstance(e, torch.cuda.OutOfMemoryError): + cleanup_gpu_memory() + yield None, ( + f"❌ GPU hết VRAM! Hãy thử:\n" + f"• Giảm Max Batch Size (hiện tại: {tts.max_batch_size if hasattr(tts, 'max_batch_size') else 'N/A'})\n" + f"• Giảm độ dài văn bản\n\n" + f"Chi tiết: {str(e)}" + ) + return + + import traceback + traceback.print_exc() + cleanup_gpu_memory() + yield None, f"❌ Lỗi Standard Mode: {str(e)}" + return + + # === STREAMING MODE === + else: + sr = 24000 + crossfade_samples = int(sr * 0.03) + audio_queue = queue.Queue(maxsize=100) + PRE_BUFFER_SIZE = 3 + + end_event = threading.Event() + error_event = threading.Event() + error_msg = "" + + is_v2_turbo = "v2-Turbo" in (current_backbone or "") + text_chunks = _build_safe_text_chunks(raw_text, max_chars_chunk, is_v2_turbo) + + def producer_thread(): + nonlocal error_msg + try: + previous_tail = None + + for i, chunk_text in enumerate(text_chunks): + if _STOP_EVENT.is_set(): + break + + if is_v2_turbo: + stream_gen = tts.infer_stream( + chunk_text.text, + ref_codes=ref_codes, + temperature=temperature, + max_chars=max_chars_chunk, + skip_normalize=True, + skip_phonemize=True, + emotion_tag="" + ) + else: + stream_gen = tts.infer_stream( + chunk_text, + ref_codes=ref_codes, + ref_text=ref_text_raw, + temperature=temperature, + max_chars=max_chars_chunk, + skip_normalize=True, + emotion_tag="" + ) + + for part_idx, audio_part in enumerate(stream_gen): + if _STOP_EVENT.is_set(): + break + if audio_part is None or len(audio_part) == 0: + continue + + if previous_tail is not None and len(previous_tail) > 0: + overlap = min(len(previous_tail), len(audio_part), crossfade_samples) + if overlap > 0: + fade_out = np.linspace(1.0, 0.0, overlap, dtype=np.float32) + fade_in = np.linspace(0.0, 1.0, overlap, dtype=np.float32) + + blended = (audio_part[:overlap] * fade_in + + previous_tail[-overlap:] * fade_out) + + processed = np.concatenate([ + previous_tail[:-overlap] if len(previous_tail) > overlap else np.array([]), + blended, + audio_part[overlap:] + ]) + else: + processed = np.concatenate([previous_tail, audio_part]) + + tail_size = min(crossfade_samples, len(processed)) + previous_tail = processed[-tail_size:].copy() + output_chunk = processed[:-tail_size] if len(processed) > tail_size else processed + else: + tail_size = min(crossfade_samples, len(audio_part)) + previous_tail = audio_part[-tail_size:].copy() + output_chunk = audio_part[:-tail_size] if len(audio_part) > tail_size else audio_part + + if len(output_chunk) > 0: + audio_queue.put((sr, output_chunk)) + + # Add silence between chunks for Turbo v2 + if is_v2_turbo and i < len(text_chunks) - 1: + sil_dur = get_silence_duration_v2(chunk_text) + sil_wav = np.zeros(int(sr * sil_dur), dtype=np.float32) + audio_queue.put((sr, sil_wav)) + + if previous_tail is not None and len(previous_tail) > 0: + audio_queue.put((sr, previous_tail)) + + except Exception as e: + import traceback + traceback.print_exc() + error_msg = str(e) + error_event.set() + finally: + end_event.set() + audio_queue.put(None) + + threading.Thread(target=producer_thread, daemon=True).start() + + yield (sr, np.zeros(int(sr * 0.05))), "📄 Đang buffering..." + + pre_buffer = [] + while len(pre_buffer) < PRE_BUFFER_SIZE: + try: + item = audio_queue.get(timeout=5.0) + if item is None: + break + pre_buffer.append(item) + except queue.Empty: + if error_event.is_set(): + yield None, f"❌ Lỗi: {error_msg}" + return + break + + full_audio_buffer = [] + backend_info = "🚀 LMDeploy" if using_lmdeploy else "📦 Standard" + for sr, audio_data in pre_buffer: + full_audio_buffer.append(audio_data) + yield (sr, audio_data), f"🔊 Đang phát ({backend_info})..." + + while True: + try: + item = audio_queue.get(timeout=0.05) + if item is None: + break + sr, audio_data = item + full_audio_buffer.append(audio_data) + yield (sr, audio_data), f"🔊 Đang phát ({backend_info})..." + except queue.Empty: + if error_event.is_set(): + yield None, f"❌ Lỗi: {error_msg}" + break + if end_event.is_set() and audio_queue.empty(): + break + continue + + if full_audio_buffer: + final_wav = np.concatenate(full_audio_buffer) + with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as tmp: + sf.write(tmp.name, final_wav, sr) + + yield tmp.name, f"✅ Hoàn tất Streaming! ({backend_info})" + + # Cleanup memory + if using_lmdeploy and hasattr(tts, 'cleanup_memory'): + tts.cleanup_memory() + + cleanup_gpu_memory() + +synthesize_speech_with_estimate = wrap_with_estimate(synthesize_speech) + +def synthesize_conversation_with_empty_estimate(*args): + for audio_path, status in synthesize_conversation(*args): + yield audio_path, status, "" + +# --- CANCELLATION --- +# threading.Event is a mutable object: never reassigned, always the same reference. +# All threads share the exact same object — no scoping/serialization issues. +_STOP_EVENT = threading.Event() + +# --- 3. CONVERSATION LOGIC --- + +def synthesize_conversation( + script_text: str, + *args +): + """ + Synthesizes multi-speaker conversation from a script. + + Gradio passes speaker name boxes and voice dropdowns as individual positional args. + Layout: args[0..MAX_SPEAKERS-1] = speaker names, args[MAX_SPEAKERS..2*MAX_SPEAKERS-1] = voice IDs, + args[2*MAX_SPEAKERS] = silence_duration, args[2*MAX_SPEAKERS+1] = temperature, + args[2*MAX_SPEAKERS+2] = max_chars_chunk, args[2*MAX_SPEAKERS+3] = session_id + """ + speaker_names = list(args[:MAX_SPEAKERS]) + speaker_voices = list(args[MAX_SPEAKERS:MAX_SPEAKERS*2]) + silence_duration = args[MAX_SPEAKERS * 2] + temperature = args[MAX_SPEAKERS * 2 + 1] + max_chars_chunk = args[MAX_SPEAKERS * 2 + 2] + session_id = args[MAX_SPEAKERS * 2 + 3] if len(args) > MAX_SPEAKERS * 2 + 3 else None + + global tts, model_loaded, using_lmdeploy + + _STOP_EVENT.clear() + + if not model_loaded or tts is None: + yield None, "⚠️ Vui lòng tải model trước!" + return + + if not script_text or script_text.strip() == "": + yield None, "⚠️ Vui lòng nhập kịch bản hội thoại!" + return + + # 1. Parse Script + lines = [] + for line in script_text.strip().split('\n'): + if not line.strip(): continue + if ':' in line: + parts = line.split(':', 1) + lines.append({'speaker': parts[0].strip(), 'text': parts[1].strip()}) + else: + if lines: + lines[-1]['text'] += " " + line.strip() + else: + lines.append({'speaker': 'Narrator', 'text': line.strip()}) + + if not lines: + yield None, "⚠️ Không tìm thấy lời thoại hợp lệ (định dạng Nhân vật: Lời thoại)!" + return + + # 2. Build Speaker Mapping from individual slot components + mapping = {} + for name, voice in zip(speaker_names, speaker_voices): + name = str(name).strip() if name else "" + if not name: continue + # Use lowercase key for robust matching + v_id = resolve_voice_id(str(voice)) if voice else "" + mapping[name.lower()] = { + 'type': 'Preset', + 'voice': v_id, + 'ref_text': '' + } + + + # 3. Process Each Line + all_wavs = [] + sr = 24000 + total_lines = len(lines) + + yield None, f"🎭 Đang khởi tạo hội thoại ({total_lines} câu)..." + + start_time = time.time() + + try: + for i, line in enumerate(lines): + if _STOP_EVENT.is_set(): + yield None, "⏹️ Đã dừng hội thoại." + return + spk_name = line['speaker'] + text = line['text'] + + yield None, f"⏳ [{i+1}/{total_lines}] {spk_name}: {text[:30]}..." + + # Determine voice + ref_codes = None + ref_text_val = None + current_voice_obj = None + + # Case-insensitive lookup + config = mapping.get(spk_name.lower()) + + if not config: + print(f" ⚠️ Character '{spk_name}' not found in mapping. Fallback to default.") + # Fallback to default if speaker not mapped + try: + # Get default voice data + default_v_id = tts._default_voice + if not default_v_id: + dv_list = tts.list_preset_voices() + if dv_list: + first = dv_list[0] + default_v_id = first[1] if isinstance(first, tuple) else first + + if default_v_id: + current_voice_obj = tts.get_preset_voice(default_v_id) + ref_codes = current_voice_obj['codes'] + ref_text_val = current_voice_obj['text'] + except Exception as e: + print(f" ❌ Fallback failed: {e}") + else: + try: + v_id = config['voice'] + if config['type'] == "Preset": + current_voice_obj = tts.get_preset_voice(v_id) + if current_voice_obj and 'codes' in current_voice_obj: + ref_codes = current_voice_obj['codes'] + ref_text_val = current_voice_obj['text'] + else: + print(f" ❌ Could not find codes for voice '{v_id}'") + else: # Custom + if v_id and os.path.exists(v_id): + ref_codes = tts.encode_reference(v_id) + ref_text_val = config.get('ref_text', '') + current_voice_obj = {'codes': ref_codes, 'text': ref_text_val} + print(f" 🦜 Using custom voice for '{spk_name}'") + except Exception as e: + print(f" ❌ Lỗi nạp giọng cho {spk_name} (ID: {config.get('voice')}): {e}") + + # Ensure numpy for inference + if 'torch' in sys.modules: + import torch + if isinstance(ref_codes, torch.Tensor): + ref_codes = ref_codes.cpu().numpy() + + # Infer audio + try: + wav = tts.infer( + text, + voice=current_voice_obj, # Use full voice object + ref_codes=ref_codes, # Fallback if object not supported + ref_text=ref_text_val, + temperature=temperature, + max_chars=max_chars_chunk, + emotion_tag="<|emotion_0|>" # Emotion tag for conversation + ) + + all_wavs.append(wav) + + # Add silence between turns + if i < total_lines - 1 and silence_duration > 0: + silence_len = int(sr * silence_duration) + silence = np.zeros(silence_len) + all_wavs.append(silence) + + except Exception as e: + print(f"❌ Lỗi tổng hợp câu {i+1}: {e}") + continue + + if not all_wavs: + yield None, "❌ Không thể tạo được âm thanh nào!" + return + + # 4. Merge and Output + yield None, "🪄 Đang ghép nối âm thanh..." + final_wav = np.concatenate(all_wavs) + + with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as tmp: + sf.write(tmp.name, final_wav, sr) + elapsed = time.time() - start_time + yield tmp.name, f"✅ Hoàn tất hội thoại! ({total_lines} câu, xử lý trong {elapsed:.1f}s)" + + except Exception as e: + import traceback + traceback.print_exc() + yield None, f"❌ Lỗi hệ thống: {str(e)}" + +def extract_speakers_from_script(script): + """Find unique speakers and return gr.update() lists for the 8 slot components.""" + global CONV_VOICES_CACHE + if not script: + # Hide all slots + name_updates = [gr.update(value="", visible=False)] * MAX_SPEAKERS + dd_updates = [gr.update(value=None, visible=False)] * MAX_SPEAKERS + row_updates = [gr.update(visible=False)] * MAX_SPEAKERS + return name_updates + dd_updates + row_updates + + speakers = [] + seen = set() + for line in script.strip().split('\n'): + if ':' in line: + s = line.split(':', 1)[0].strip() + if s and s not in seen: + seen.add(s) + speakers.append(s) + + # Auto-match each speaker name to a preset voice + def _best_match(name): + if not CONV_VOICES_CACHE: + return None + + name_l = name.lower() + + # 0. Manual overrides for specific common names + overrides = { + "phương": "Trúc Ly", + "dũng": "Thanh Bình", + "hùng": "Thái Sơn" + } + if name_l in overrides: + target = overrides[name_l].lower() + for v in CONV_VOICES_CACHE: + label, value = (v[0], v[1]) if isinstance(v, tuple) else (v, v) + if target in label.lower() or target in value.lower(): + return value + + # 1. Try to find name in labels or values + for v in CONV_VOICES_CACHE: + label, value = (v[0], v[1]) if isinstance(v, tuple) else (v, v) + if name_l == label.lower() or name_l == value.lower(): + return value + + # 2. Fuzzy match (contains) + for v in CONV_VOICES_CACHE: + label, value = (v[0], v[1]) if isinstance(v, tuple) else (v, v) + if name_l in label.lower() or name_l in value.lower() or label.lower() in name_l or value.lower() in name_l: + return value + + # 3. Default to first voice if no match + first_voice = CONV_VOICES_CACHE[0] + return first_voice[1] if isinstance(first_voice, tuple) else first_voice + + name_updates, dd_updates, row_updates = [], [], [] + for i in range(MAX_SPEAKERS): + if i < len(speakers): + name_updates.append(gr.update(value=speakers[i], visible=True)) + dd_updates.append(gr.update(value=_best_match(speakers[i]), choices=CONV_VOICES_CACHE, visible=True)) + row_updates.append(gr.update(visible=True)) + else: + name_updates.append(gr.update(value="", visible=False)) + dd_updates.append(gr.update(value=None, choices=CONV_VOICES_CACHE, visible=False)) + row_updates.append(gr.update(visible=False)) + + return name_updates + dd_updates + row_updates + +EXAMPLES_LIST = [ + ["Về miền Tây không chỉ để ngắm nhìn sông nước hữu tình, mà còn để cảm nhận tấm chân tình của người dân nơi đây.", "Vĩnh (nam miền Nam)"], + ["Hà Nội những ngày vào thu mang một vẻ đẹp trầm mặc và cổ kính đến lạ thường.", "Bình (nam miền Bắc)"], +] + +with gr.Blocks(theme=theme, css=css, title="VieNeu-TTS", head=head_html) as demo: + # Session ID for cancellation tracking + session_id_state = gr.State("") + + with gr.Column(elem_classes="container"): + gr.HTML(""" +

+

+ 🦜 + VieNeu-TTS Studio +

+
+
+ Models: + VieNeu-TTS + + VieNeu-TTS-v2 +
+
+ Repository: + GitHub +
+
+ Tác giả: + Phạm Nguyễn Ngọc Bảo +
+
+ Discord: + Tham gia cộng đồng +
+
+
+ """) + + # --- CONFIGURATION --- + with gr.Group(): + with gr.Row(): + # --- BACKBONE & CODEC DEFAULT LOGIC --- + if "VieNeu-TTS-v2 (GPU)" in BACKBONE_CONFIGS: + default_backbone = "VieNeu-TTS-v2 (GPU)" + elif "VieNeu-TTS-v2-Turbo (CPU)" in BACKBONE_CONFIGS: + default_backbone = "VieNeu-TTS-v2-Turbo (CPU)" + else: + default_backbone = list(BACKBONE_CONFIGS.keys())[0] + + # Default parameters based on backbone + if "Turbo" in default_backbone: + default_codec = "VieNeu-Codec" + default_temp = 0.4 + default_text = DEFAULT_TEXT_TURBO + elif "(CPU)" in default_backbone: + default_codec = "NeuCodec (ONNX)" + default_temp = 0.7 + default_text = DEFAULT_TEXT_GPU + else: + default_codec = "NeuCodec (Distill)" if "NeuCodec (Distill)" in CODEC_CONFIGS else list(CODEC_CONFIGS.keys())[0] + default_temp = 0.7 + default_text = DEFAULT_TEXT_GPU + + backbone_select = gr.Dropdown( + list(BACKBONE_CONFIGS.keys()) + ["Custom Model"], + value=default_backbone, + label="🦜 Backbone" + ) + codec_select = gr.Dropdown( + list(CODEC_CONFIGS.keys()), + value=default_codec, + label="🎵 Codec", + interactive=False + ) + device_choice = gr.Radio(get_available_devices(), value="Auto", label="🖥️ Device") + + with gr.Row(visible=False) as custom_model_group: + custom_backbone_model_id = gr.Textbox( + label="📦 Custom Model ID", + placeholder="pnnbao-ump/VieNeu-TTS-0.3B-lora-ngoc-huyen", + info="Nhập HuggingFace Repo ID hoặc đường dẫn local", + scale=2 + ) + custom_backbone_hf_token = gr.Textbox( + label="🔑 HF Token (nếu private)", + placeholder="Để trống nếu repo public", + type="password", + info="Token để truy cập repo private", + scale=1 + ) + base_model_choices = [k for k in BACKBONE_CONFIGS.keys() if "turbo" not in k.lower() and k != "Custom Model"] + custom_backbone_base_model = gr.Dropdown( + base_model_choices, + label="🔗 Base Model (cho LoRA)", + value=base_model_choices[0] if base_model_choices else None, + visible=False, + info="Model gốc để merge với LoRA (GPU Only)", + scale=1 + ) + + with gr.Row(): + use_lmdeploy_cb = gr.Checkbox( + value=True, + label="🚀 Optimize with LMDeploy (Khuyên dùng cho NVIDIA GPU)", + info="Tick nếu bạn dùng GPU để tăng tốc độ tổng hợp đáng kể." + ) + + + gr.Markdown(""" + 💡 **Sử dụng Custom Model:** Chọn "Custom Model" để tải LoRA adapter hoặc bất kỳ model nào được finetune từ **VieNeu-TTS** hoặc **VieNeu-TTS-0.3B**. + """) + + gr.HTML(""" +
+
+ 🦜 Gợi ý tối ưu hiệu năng +
+
+
+ 🐆 Hệ máy GPU +
+ Chế độ podcast và song ngữ Anh Việt đã được hỗ trợ bắt đầu từ phiên bản VieNeu-TTS-v2, tuy nhiên quá trình kiểm thử vẫn đang tiếp tục, có thể sẽ xảy ra lỗi không mong muốn, nếu có lỗi các bạn hãy thông báo với chúng tôi tại: https://discord.com/invite/yJt8kzjzWZ. Trong trường hợp bạn cần sự ổn định hãy sử dụng VieNeu-TTS (GPU). +
+
+
+ 🐢 Hệ máy CPU +
+ Mặc định là VieNeu-TTS-v2-Turbo (CPU) để tốc độ tổng hợp nhanh nhất có thể, tuy nhiên có hạn chế về chất lượng âm thanh. Trong trường hợp bạn cần chất lượng tốt nhất hãy sử dụng VieNeu-TTS-v2 (CPU). +
+
+
+
+ 💡 Mẹo: Nếu máy bạn có GPU mà không thấy các phiên bản GPU hãy xem lại cách cài đặt uv sync --group gpu +
+
+ """) + + btn_load = gr.Button("🔄 Tải Model", variant="primary") + model_status = gr.Markdown("⏳ Chưa tải model.") + + with gr.Row(elem_classes="container"): + # --- INPUT --- + with gr.Column(scale=3): + with gr.Tabs() as main_input_tabs: + # --- TAB 1: SINGLE SPEAKER --- + with gr.Tab("🦜 Đọc truyện", id="single_tab") as single_tab: + text_input = gr.Textbox( + label=f"Văn bản", + lines=8, + value=default_text, + ) + + with gr.Tabs() as tabs: + with gr.TabItem("👤 Preset", id="preset_mode") as tab_preset: + voice_select = gr.Dropdown(choices=[], value=None, label="Giọng mẫu", allow_custom_value=True) + + with gr.TabItem("🦜 Voice Cloning", id="custom_mode") as tab_custom: + with gr.Group(visible=True) as cloning_elements_group: + custom_audio = gr.Audio(label="Audio giọng mẫu (3-5 giây) (.wav)", type="filepath") + cloning_warning_msg = gr.Markdown(visible=False, elem_id="cloning-warning") + custom_text = gr.Textbox(label="Nội dung audio mẫu - vui lòng gõ đúng nội dung của audio mẫu - kể cả dấu câu vì model rất nhạy cảm với dấu câu (.,?!)") + gr.Examples( + examples=[ + [os.path.join(os.path.dirname(os.path.dirname(__file__)), "examples", "audio_ref", "example.wav"), "Ví dụ 2. Tính trung bình của dãy số."], + [os.path.join(os.path.dirname(os.path.dirname(__file__)), "examples", "audio_ref", "example_2.wav"), "Trên thực tế, các nghi ngờ đã bắt đầu xuất hiện."], + [os.path.join(os.path.dirname(os.path.dirname(__file__)), "examples", "audio_ref", "example_3.wav"), "Cậu có nhìn thấy không?"], + [os.path.join(os.path.dirname(os.path.dirname(__file__)), "examples", "audio_ref", "example_4.wav"), "Tết là dịp mọi người háo hức đón chào một năm mới với nhiều hy vọng và mong ước."] + ], + inputs=[custom_audio, custom_text], + label="Ví dụ mẫu để thử nghiệm clone giọng" + ) + + gr.Markdown(""" + **💡 Mẹo nhỏ:** Nếu kết quả Zero-shot Voice Cloning chưa như ý, bạn hãy cân nhắc **Finetune (LoRA)** để đạt chất lượng tốt nhất. + Hướng dẫn chi tiết có tại file: `finetune/README.md` hoặc xem trên [GitHub](https://github.com/pnnbao97/VieNeu-TTS/tree/main/finetune). + """) + + generation_mode = gr.Radio( + ["Standard (Một lần)"], + value="Standard (Một lần)", + label="Chế độ sinh" + ) + btn_generate = gr.Button("🎵 Bắt đầu", variant="primary", scale=2, interactive=False) + + # --- TAB 2: MULTI-SPEAKER CONVERSATION --- + with gr.Tab("🎭 Hội thoại", id="conv_tab", visible=False) as conv_tab: + conv_script_input = gr.Textbox( + label="Kịch bản hội thoại", + placeholder="Phương: Chào mọi người, mình là Phương...", + lines=10, + elem_classes="script-box", + value='Phương: Chào mọi người, mình là Phương. Hôm nay team có một announcement cực lớn về VieNeu-TTS Version 2. Đồng hành cùng mình là anh Dũng và Hùng. Hi guys!\n\nDũng: Yo, chào cả nhà. Mình sẽ đi thẳng vào technical side của bản nâng cấp này để mọi người có cái nhìn deep hơn nhé.\n\nHùng: Chào mọi người. Thật sự V2 là một huge milestone. Nó phá vỡ rào cản của những công cụ đọc văn bản khô khan, hướng tới một sự natural communication đúng nghĩa.\n\nPhương: Correct! Và bất ngờ nhất là: nãy giờ mọi người đang nghe bản demo được tạo ra 100% bằng VieNeu-TTS V2 đấy. Tụi mình đều là sản phẩm của AI hết. Amazing, right?\n\nDũng: Đỉnh thật sự! Tiện đây Hùng share thêm về cái nội công bên trong của model này đi.\n\nHùng: Chắc chắn rồi. Model được train trên 10000 hours audio chất lượng cao, nên nó hỗ trợ code-switching Anh Việt cực mượt, tự nhiên như podcast. Đặc biệt, dự án này hoàn toàn open-source để cộng đồng cùng phát triển.\n\nDũng: Về hiệu năng thì khỏi bàn. Khi test trên GPU quốc dân RTX 3060, tốc độ sinh audio nhanh gấp 10 lần realtime. Và đừng lo, nếu bạn không có card đồ hỏa xịn, tụi mình có sẵn bản CPU version để ai cũng có thể tiếp cận được.\n\nPhương: Tốc độ cực nhanh, hỗ trợ đa nền tảng và hoàn toàn miễn phí. Mọi người hãy cùng trải nghiệm nhé!' + ) + + with gr.Row(): + btn_detect_speakers = gr.Button("🔍 Quét nhân vật", size="sm", variant="secondary") + silence_slider = gr.Slider(minimum=0, maximum=3, value=0.1, step=0.1, label="⏱️ Khoảng lặng (giây)") + + gr.Markdown("### 🎭 Cấu hình giọng đọc") + gr.Markdown("*Nhấn **Quét nhân vật** để tự động phát hiện và ánh xạ giọng đọc. Tải model trước để có danh sách giọng.*") + + # Pre-build MAX_SPEAKERS speaker slot rows + speaker_name_boxes = [] + speaker_voice_dds = [] + speaker_slot_rows = [] + + for _i in range(MAX_SPEAKERS): + # Mặc định cho 3 nhân vật đầu tiên theo yêu cầu + _default_name = "" + _default_voice = None + _row_visible = False + + if _i == 0: + _default_name = "Phương" + _default_voice = "Ly" + _row_visible = True + elif _i == 1: + _default_name = "Dũng" + _default_voice = "Binh" + _row_visible = True + elif _i == 2: + _default_name = "Hùng" + _default_voice = "Sơn" + _row_visible = True + elif _i < 2: + _default_name = f"Nhân vật {_i+1}" + _row_visible = True + + with gr.Row(visible=_row_visible) as _row: + _name = gr.Textbox( + value=_default_name, + label="👤 Nhân vật", + interactive=False, + scale=1, + min_width=120 + ) + _dd = gr.Dropdown( + choices=PRESET_VOICES_CACHE, + value=_default_voice, + label="🎤 Giọng đọc", + interactive=True, + scale=3, + allow_custom_value=True + ) + speaker_slot_rows.append(_row) + speaker_name_boxes.append(_name) + speaker_voice_dds.append(_dd) + + btn_generate_conv = gr.Button("🎭 Bắt đầu hội thoại", variant="primary", interactive=False) + + # Global Generation Settings + with gr.Row(): + use_batch = gr.Checkbox( + value=True, + label="⚡ Batch Processing", + info="Xử lý nhiều đoạn cùng lúc (chỉ áp dụng khi sử dụng GPU và đã cài đặt LMDeploy)" + ) + max_batch_size_run = gr.Slider( + minimum=1, + maximum=16, + value=4, + step=1, + label="📊 Batch Size (Generation)", + info="Số lượng đoạn văn bản xử lý cùng lúc. Giá trị cao = nhanh hơn nhưng tốn VRAM hơn. Giảm xuống nếu gặp lỗi Out of Memory." + ) + + with gr.Accordion("⚙️ Cài đặt nâng cao (Generation)", open=False): + with gr.Row(): + temperature_slider = gr.Slider( + minimum=0.1, maximum=1.5, value=default_temp, step=0.1, + label="🌡️ Temperature", + info="Độ sáng tạo. Cao = đa dạng cảm xúc hơn nhưng dễ lỗi. Thấp = ổn định hơn." + ) + max_chars_chunk_slider = gr.Slider( + minimum=128, maximum=512, value=256, step=32, + label="📝 Max Chars per Chunk", + info="Độ dài tối đa mỗi đoạn xử lý." + ) + + # State to track current mode + current_mode_state = gr.State("preset_mode") + + with gr.Row(): + btn_stop = gr.Button("⏹️ Dừng", variant="stop", scale=1, interactive=False) + + # --- OUTPUT --- + with gr.Column(scale=2): + audio_output = gr.Audio( + label="Kết quả", + type="filepath", + autoplay=True + ) + with gr.Group(): + status_output = gr.Textbox( + label="Trạng thái", + elem_classes="status-box", + lines=2, + max_lines=10, + show_copy_button=True + ) + with gr.Group(): + estimate_output = gr.Textbox( + label="Ước tính thời gian", + elem_classes="estimate-box", + lines=2, + max_lines=4, + show_copy_button=True + ) + gr.Markdown("
🔒 Audio được đóng dấu bản quyền ẩn (Watermarker) để bảo mật và định danh AI.
") + + codec_select.change( + on_codec_change, + inputs=[codec_select, current_mode_state], + outputs=[tab_custom, tabs, current_mode_state] + ) + + # Bind tab events to update state + tab_preset.select(lambda: "preset_mode", outputs=current_mode_state) + tab_custom.select(lambda: "custom_mode", outputs=current_mode_state) + + custom_audio.change(validate_audio_duration, inputs=[custom_audio], outputs=[cloning_warning_msg]) + + # --- Custom Model Event Handlers --- + + def on_backbone_change(choice): + is_custom = (choice == "Custom Model") + print(f" 🔄 Backbone changed to: {choice}") + + # 1. Device logic + # Allow hardware acceleration (MPS/CUDA/Auto) for all GPU models AND Turbo (GGUF) models + is_hw_accel_supported = "(GPU)" in choice or "v2-Turbo" in choice or is_custom + + if is_hw_accel_supported: + dev_choices = get_available_devices() + initial_dev = "Auto" + else: + dev_choices = ["CPU"] + initial_dev = "CPU" + + # 2. Parameter logic + if "Turbo" in choice: + codec_update = gr.update(value="VieNeu-Codec", interactive=False) + text_update = gr.update(value=DEFAULT_TEXT_TURBO) + temp_update = gr.update(value=0.4) + elif "(CPU)" in choice: + codec_update = gr.update(value="NeuCodec (ONNX)", interactive=False) + text_update = gr.update(value=DEFAULT_TEXT_GPU) + temp_update = gr.update(value=0.7) + else: + codec_update = gr.update(value="NeuCodec (Distill)", interactive=False) + text_update = gr.update(value=DEFAULT_TEXT_GPU) + temp_update = gr.update(value=0.7) + + return ( + gr.update(visible=is_custom), + codec_update, + text_update, + temp_update, + gr.update(choices=dev_choices, value=initial_dev), + gr.update(visible=True) + ) + + backbone_select.change( + on_backbone_change, + inputs=[backbone_select], + outputs=[ + custom_model_group, + codec_select, + text_input, + temperature_slider, + device_choice, + cloning_elements_group + ] + ) + + custom_backbone_model_id.change( + on_custom_id_change, + inputs=[custom_backbone_model_id], + outputs=[custom_backbone_base_model, custom_audio, custom_text] + ) + + btn_load.click( + fn=load_model, + inputs=[backbone_select, codec_select, device_choice, use_lmdeploy_cb, + custom_backbone_model_id, custom_backbone_base_model, custom_backbone_hf_token], + outputs=[model_status, btn_generate, btn_generate_conv, btn_load, btn_stop, voice_select, + tab_preset, tab_custom, tabs, current_mode_state, + conv_tab, + *speaker_voice_dds] + ) + + # --- Conversation Event Handlers --- + # Scan speakers → update all 8 slot rows/names/dropdowns + btn_detect_speakers.click( + fn=extract_speakers_from_script, + inputs=[conv_script_input], + outputs=speaker_name_boxes + speaker_voice_dds + speaker_slot_rows + ) + + conv_gen_event = btn_generate_conv.click( + fn=synthesize_conversation_with_empty_estimate, + inputs=[conv_script_input, + *speaker_name_boxes, + *speaker_voice_dds, + silence_slider, temperature_slider, max_chars_chunk_slider, + session_id_state], + outputs=[audio_output, status_output, estimate_output] + ) + btn_generate_conv.click(lambda: gr.update(interactive=True), outputs=btn_stop) + conv_gen_event.then(lambda: gr.update(interactive=False), outputs=btn_stop) + + # --- Auto-adjust Temperature on Tab Switch --- + conv_tab.select( + fn=lambda: gr.update(value=1.0), + outputs=temperature_slider + ) + single_tab.select( + fn=lambda: gr.update(value=default_temp), + outputs=temperature_slider + ) + + # --- Standard Generation Handlers --- + gen_event = btn_generate.click( + fn=synthesize_speech_with_estimate, + inputs=[text_input, voice_select, custom_audio, custom_text, current_mode_state, + generation_mode, use_batch, max_batch_size_run, + temperature_slider, max_chars_chunk_slider, session_id_state], + outputs=[audio_output, status_output, estimate_output] + ) + btn_generate.click(lambda: gr.update(interactive=True), outputs=btn_stop) + gen_event.then(lambda: gr.update(interactive=False), outputs=btn_stop) + + # --- Stop Button --- + def request_stop(): + print("🛑 STOP REQUESTED via button click.") + _STOP_EVENT.set() + return None, "⏹️ Đã dừng tạo giọng nói.", "", gr.update(interactive=False) + + # Handler: set stop event + update UI + # Note: We avoid cancels= here to prevent internal Gradio KeyError crashes, + # relying instead on the frequent _STOP_EVENT.is_set() checks in the code. + btn_stop.click(fn=request_stop, outputs=[audio_output, status_output, estimate_output, btn_stop]) + + # Persistence: Restore UI state on load + demo.load( + fn=restore_ui_state, + outputs=[model_status, btn_generate, btn_generate_conv, btn_stop] + ) + +def main(): + # Cho phép override từ biến môi trường (hữu ích cho Docker) + server_name = os.getenv("GRADIO_SERVER_NAME", "127.0.0.1") + server_port = int(os.getenv("GRADIO_SERVER_PORT", "7860")) + + # Check running in Colab + is_on_colab = os.getenv("COLAB_RELEASE_TAG") is not None + + # Default: + # - Colab: share=True (convenient) + # - Docker/local: share=False (safe) + share = env_bool("GRADIO_SHARE", default=is_on_colab) + + # If server_name is "0.0.0.0" and GRADIO_SHARE is not set, disable sharing + if server_name == "0.0.0.0" and os.getenv("GRADIO_SHARE") is None: + share = False + + demo.queue().launch(server_name=server_name, server_port=server_port, share=share) + +if __name__ == "__main__": + main() From 0999f0a3cb8bf08d74d2c421e0c0c5dccd0ebcd0 Mon Sep 17 00:00:00 2001 From: thanh20VN <95450843+thanh20VN@users.noreply.github.com> Date: Fri, 5 Jun 2026 21:25:21 +0700 Subject: [PATCH 4/4] Create base.py --- base.py | 445 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 445 insertions(+) create mode 100644 base.py diff --git a/base.py b/base.py new file mode 100644 index 0000000..bbff50d --- /dev/null +++ b/base.py @@ -0,0 +1,445 @@ +from abc import ABC, abstractmethod +from pathlib import Path +from typing import Optional, Union, List, Dict, Any +import json +import numpy as np +import logging +from huggingface_hub import hf_hub_download +from sea_g2p import Normalizer + +# Configure logging +logger = logging.getLogger("Vieneu") + +class BaseVieneuTTS(ABC): + """ + Abstract base class for VieNeu-TTS implementations. + Provides shared functionality for voice management and common operations. + """ + + def __init__(self, codec_repo: Optional[str] = None, codec_device: str = "cpu"): + self.sample_rate = 24_000 + self.max_context = 4096 + self.hop_length = 480 + + # Default streaming parameters + self.streaming_overlap_frames = 1 + self.streaming_frames_per_chunk = 50 + self.streaming_lookforward = 5 + self.streaming_lookback = 50 + self.streaming_stride_samples = self.streaming_frames_per_chunk * self.hop_length + + self.assets_dir = Path(__file__).parent / "assets" + self._preset_voices: Dict[str, Any] = {} + self._default_voice: Optional[str] = None + self.normalizer = Normalizer() + self._ref_phoneme_cache: Dict[str, str] = {} + + # Watermarker placeholder + self.watermarker = None + self._init_watermarker() + + if codec_repo: + self._load_codec(codec_repo, codec_device) + + def _load_codec(self, codec_repo: str, codec_device: str) -> None: + """Universal codec loader for all backends.""" + logger.info(f"📦 Loading codec from: {codec_repo} on {codec_device} ...") + + if any(x in codec_repo.lower() for x in ["onnx", "vieneu-codec"]) or codec_repo == "neuphonic/neucodec-onnx-decoder-int8": + if codec_device != "cpu": + logger.warning("⚠️ ONNX decoder only runs on CPU. Ignoring device selection.") + try: + from .utils import NeuCodecOnnx + self.codec = NeuCodecOnnx.from_pretrained(codec_repo) + self._is_onnx_codec = True + return + except Exception as e: + logger.warning(f"Failed to load standalone ONNX decoder: {e}. Trying via neucodec package...") + try: + from neucodec import NeuCodecOnnxDecoder + self.codec = NeuCodecOnnxDecoder.from_pretrained(codec_repo) + self._is_onnx_codec = True + return + except ImportError: + raise ImportError( + "The 'onnxruntime' package is required for ONNX decoder. \n" + "Please install it via: pip install onnxruntime" + ) from e + + # For PyTorch codecs, check for torch first + try: + import torch + from neucodec import NeuCodec, DistillNeuCodec + + # Check MPS + if codec_device == "mps" and not torch.backends.mps.is_available(): + logger.warning("⚠️ MPS not available for codec, falling back to CPU") + codec_device = "cpu" + + if codec_repo == "neuphonic/neucodec": + self.codec = NeuCodec.from_pretrained(codec_repo) + elif codec_repo == "neuphonic/distill-neucodec": + self.codec = DistillNeuCodec.from_pretrained(codec_repo) + else: + raise ValueError(f"Unrecognized codec repository: {codec_repo}") + + self.codec.eval().to(codec_device) + except ImportError: + raise ImportError( + f"Codec '{codec_repo}' requires PyTorch. \n" + "To remain lightweight in Remote mode, please use 'neuphonic/neucodec-onnx-decoder-int8'. \n" + "Or install torch via: pip install vieneu[gpu]" + ) + + + def _init_watermarker(self) -> None: + """Initialize optional audio watermarker.""" + try: + import perth + self.watermarker = perth.PerthImplicitWatermarker() + logger.info("🔒 Audio watermarking initialized (Perth)") + except (ImportError, AttributeError): + self.watermarker = None + + def _load_voices(self, backbone_repo: Optional[str], hf_token: Optional[str] = None, clear_existing: bool = False) -> None: + """Unified voice loading for Local and Remote paths.""" + if not backbone_repo: + return + + path_obj = Path(backbone_repo) + if path_obj.exists(): + # Local Path (Dir or File) + if path_obj.is_dir(): + json_path = path_obj / "voices.json" + else: + json_path = path_obj.parent / "voices.json" + + if json_path.exists(): + self._load_voices_from_file(json_path, clear_existing=clear_existing) + else: + if clear_existing: + self._preset_voices.clear() + logger.warning(f"Validation Warning: Local path '{backbone_repo}' missing 'voices.json'.") + logger.warning(f"Falling back to Custom Voice Cloning mode.") + else: + # Remote Repo + if clear_existing: + self._preset_voices.clear() + + try: + self._load_voices_from_repo(backbone_repo, hf_token) + except Exception as e: + logger.warning(f"Could not load voices from repo '{backbone_repo}': {e}") + logger.warning(f"Falling back to Custom Voice Cloning mode.") + + def _load_voices_from_file(self, file_path: Path, clear_existing: bool = False) -> None: + """Load voices from a local JSON file.""" + try: + if not file_path.exists(): + logger.error(f"Voice file not found: {file_path}") + return + + with open(file_path, 'r', encoding='utf-8') as f: + try: + data = json.load(f) + except json.JSONDecodeError as e: + logger.error(f"Invalid JSON in voice file {file_path}: {e}") + return + + if "presets" in data: + if clear_existing: + self._preset_voices.clear() + logger.info("🧹 Cleared existing voices for replacement") + + # Merge into existing presets + self._preset_voices.update(data["presets"]) + logger.info(f"📢 Loaded {len(data['presets'])} voices from {file_path.name}") + + # Update default voice if provided + if "default_voice" in data and data["default_voice"]: + self._default_voice = data["default_voice"] + + except Exception as e: + logger.error(f"Failed to load voices from {file_path}: {e}") + + def _load_voices_from_repo(self, repo_id: str, hf_token: Optional[str] = None) -> None: + """Download and load voices.json from a HuggingFace repo.""" + voices_file = None + try: + # 1. Try normal download (checks for updates from server) + voices_file = hf_hub_download( + repo_id=repo_id, + filename="voices.json", + token=hf_token, + repo_type="model" + ) + except Exception: + # 2. Network error? Try to use cached version if available + logger.warning(f"Network check failed for voices.json. Trying local cache...") + try: + voices_file = hf_hub_download( + repo_id=repo_id, + filename="voices.json", + token=hf_token, + repo_type="model", + local_files_only=True + ) + logger.info(f"✅ Using cached voices.json") + except Exception: + # 3. No cache available either + pass + + if voices_file: + self._load_voices_from_file(Path(voices_file)) + else: + logger.warning(f"Repository '{repo_id}' is missing 'voices.json'. Falling back to Custom Voice mode.") + + def list_preset_voices(self) -> List[tuple[str, str]]: + """List available preset voices as (description, id).""" + return [ + (v.get("description", k) if isinstance(v, dict) else str(v), k) + for k, v in self._preset_voices.items() + ] + + def get_preset_voice(self, voice_name: Optional[str] = None) -> Dict[str, Any]: + """ + Get reference codes and text for a preset voice. + + Args: + voice_name: Name of voice. If None, uses default_voice. + + Returns: + dict: { 'codes': Union[np.ndarray, 'torch.Tensor'], 'text': str } + """ + if voice_name is None: + voice_name = self._default_voice + if voice_name is None: + if self._preset_voices: + voice_name = next(iter(self._preset_voices)) + else: + raise ValueError("No voice specified and no preset voices available.") + + if voice_name not in self._preset_voices: + raise ValueError(f"Voice '{voice_name}' not found. Available: {self.list_preset_voices()}") + + voice_data = self._preset_voices[voice_name] + codes = voice_data["codes"] + + # Only convert to torch if explicitly requested or if we're not in turbo mode + if isinstance(codes, list): + if codes and isinstance(codes[0], float): + codes = np.array(codes, dtype=np.float32) + else: + # Là integer token sequence (Standard mode) + try: + import torch + codes = torch.tensor(codes, dtype=torch.long) + except ImportError: + codes = np.array(codes, dtype=np.int64) + + return {"codes": codes, "text": voice_data["text"]} + + def get_ref_phonemes(self, ref_text: str) -> str: + """ + Get phonemized version of reference text, using cache if available. + """ + if ref_text not in self._ref_phoneme_cache: + from vieneu_utils.phonemize_text import phonemize_with_dict + self._ref_phoneme_cache[ref_text] = phonemize_with_dict(ref_text) + return self._ref_phoneme_cache[ref_text] + + def save(self, audio: np.ndarray, output_path: Union[str, Path]) -> None: + """Save audio waveform to a file.""" + import soundfile as sf + sf.write(str(output_path), audio, self.sample_rate) + + def encode_reference(self, ref_audio_path: Union[str, Path]) -> Union[np.ndarray, 'torch.Tensor']: + """ + Encode reference audio to codes. + + Args: + ref_audio_path: Path to the reference audio file. + + Returns: + Union[np.ndarray, torch.Tensor]: Encoded codes. + """ + import librosa + wav, _ = librosa.load(ref_audio_path, sr=16000, mono=True) + + # If we have an ONNX encoder or specialized turbo encoder, handle it here + # For now, default backends still use torch + try: + import torch + wav_tensor = torch.from_numpy(wav).float().unsqueeze(0).unsqueeze(0) # [1, 1, T] + + # Ensure device and dtype compatibility + if hasattr(self.codec, "device"): + wav_tensor = wav_tensor.to(self.codec.device) + + with torch.no_grad(): + ref_codes = self.codec.encode_code(audio_or_path=wav_tensor).squeeze(0).squeeze(0) + return ref_codes + except ImportError: + raise ImportError("Torch is required for encode_reference in the current backend. Please install torch or use a backend that supports standalone encoding.") + + def _decode(self, codes_str: str) -> np.ndarray: + """ + Decode speech tokens to audio waveform. + + Args: + codes_str: String containing speech tokens. + + Returns: + np.ndarray: Decoded audio waveform. + """ + from .utils import extract_speech_ids + speech_ids = extract_speech_ids(codes_str) + + if len(speech_ids) == 0: + raise ValueError("No valid speech tokens found in the output.") + + # Onnx decode + if getattr(self, "_is_onnx_codec", False): + codes = np.array(speech_ids, dtype=np.int32)[np.newaxis, np.newaxis, :] + recon = self.codec.decode_code(codes) + # Torch decode + else: + try: + import torch + with torch.no_grad(): + codes = torch.tensor(speech_ids, dtype=torch.long)[None, None, :] + if hasattr(self.codec, "device"): + codes = codes.to(self.codec.device) + + recon = self.codec.decode_code(codes) + if hasattr(recon, "cpu"): + recon = recon.cpu() + if hasattr(recon, "numpy"): + recon = recon.numpy() + except ImportError: + raise ImportError("Torch is required for the current codec backend. Please install torch or use an ONNX-based codec.") + + + return recon[0, 0, :] + + def _resolve_ref_voice( + self, + voice: Optional[Dict[str, Any]] = None, + ref_audio: Optional[Union[str, Path]] = None, + ref_codes: Optional[Union[np.ndarray, 'torch.Tensor']] = None, + ref_text: Optional[str] = None + ) -> tuple[Union[np.ndarray, 'torch.Tensor'], str]: + """Resolve reference voice codes and text.""" + if voice is not None: + ref_codes = voice.get('codes', ref_codes) + ref_text = voice.get('text', ref_text) + + if ref_audio is not None and ref_codes is None: + ref_codes = self.encode_reference(ref_audio) + elif self._default_voice and (ref_codes is None or ref_text is None): + try: + voice_data = self.get_preset_voice(None) + ref_codes = voice_data['codes'] + ref_text = voice_data['text'] + except Exception: + pass + + if ref_codes is None or ref_text is None: + raise ValueError("Must provide either 'voice' dict or both 'ref_codes' and 'ref_text'.") + + return ref_codes, ref_text + + def _apply_watermark(self, wav: np.ndarray) -> np.ndarray: + """Apply watermark to audio if enabled.""" + if self.watermarker: + return self.watermarker.apply_watermark(wav, sample_rate=self.sample_rate) + return wav + + def to_list(self, codes: Any) -> List[int]: + """Convert reference codes (Tensor, Array, List) to a Python list of integers.""" + if isinstance(codes, list): + return codes + if isinstance(codes, np.ndarray): + return codes.flatten().tolist() + + # Check for torch without importing it at module level + try: + import torch + if isinstance(codes, torch.Tensor): + return codes.flatten().tolist() + except ImportError: + pass + + # Fallback for other array-like types + if hasattr(codes, "tolist"): + return codes.flatten().tolist() if hasattr(codes, "flatten") else codes.tolist() + + return list(codes) + + def _format_prompt( + self, + ref_codes: Any, + ref_text: str, + input_text: str, + ref_phonemes: Optional[str] = None, + input_phonemes: Optional[str] = None, + use_chat_format: bool = False, + emotion_tag: Optional[str] = None + ) -> str: + """ + Format the prompt for the TTS model. + Common implementation for LMDeploy (Fast) and Remote backends. + Standard backend uses a specialized chat template via tokenizer. + + Args: + use_chat_format: If True, wraps the prompt with chat-style user/assistant + tokens (used by VieNeu-TTS GPU model). If False (default), + returns a compact prompt without those wrappers. + """ + ref_codes_list = self.to_list(ref_codes) + + # Import inside method to avoid potential circular dependencies between + # base TTS and phonemization utilities. + from vieneu_utils.phonemize_text import phonemize_with_dict + + ref_text_phones = ref_phonemes if ref_phonemes else self.get_ref_phonemes(ref_text) + input_text_phones = input_phonemes if input_phonemes else phonemize_with_dict(input_text, skip_normalize=True) + codes_str = "".join([f"<|speech_{idx}|>" for idx in ref_codes_list]) + + emotion_prefix = emotion_tag if emotion_tag else "" + + if use_chat_format: + return ( + f"user: Convert the text to speech:<|TEXT_PROMPT_START|>{emotion_prefix}{ref_text_phones} {input_text_phones}" + f"<|TEXT_PROMPT_END|>\nassistant:<|SPEECH_GENERATION_START|>{codes_str}" + ) + return ( + f"<|TEXT_PROMPT_START|>{emotion_prefix}{ref_text_phones} {input_text_phones}" + f"<|TEXT_PROMPT_END|><|SPEECH_GENERATION_START|>{codes_str}" + ) + + @abstractmethod + def infer(self, text: str, apply_watermark: bool = True, **kwargs: Any) -> np.ndarray: + """Main inference method for single text.""" + pass + + @abstractmethod + def infer_batch(self, texts: List[str], apply_watermark: bool = True, **kwargs: Any) -> List[np.ndarray]: + """Main inference method for batch processing.""" + pass + + def close(self) -> None: + """Release resources.""" + pass + + def __enter__(self) -> 'BaseVieneuTTS': + return self + + def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None: + self.close() + + def __del__(self): + try: + self.close() + except Exception: + pass