diff --git a/pixelle_video/tts_voices.py b/pixelle_video/tts_voices.py index 02ecf20ff..509067128 100644 --- a/pixelle_video/tts_voices.py +++ b/pixelle_video/tts_voices.py @@ -192,6 +192,19 @@ "locale": "es-ES", "gender": "female" }, + # Vietnamese voices + { + "id": "vi-VN-HoaiMyNeural", + "label_key": "tts.voice.vi_VN_HoaiMyNeural", + "locale": "vi-VN", + "gender": "female" + }, + { + "id": "vi-VN-NamMinhNeural", + "label_key": "tts.voice.vi_VN_NamMinhNeural", + "locale": "vi-VN", + "gender": "male" + }, ] diff --git a/web/i18n/locales/en_US.json b/web/i18n/locales/en_US.json index 28ada4860..a1dee6f02 100644 --- a/web/i18n/locales/en_US.json +++ b/web/i18n/locales/en_US.json @@ -253,6 +253,8 @@ "tts.voice.tr-TR-EmelNeural": "TR Female-Friendly(Emel)", "tts.voice.es-ES-AlvaroNeural": "ES Male-Friendly(Alvaro)", "tts.voice.es-ES-ElviraNeural": "ES Female-Friendly(Elvira)", + "tts.voice.vi_VN_HoaiMyNeural": "VI Female-Gentle (Hoai My)", + "tts.voice.vi_VN_NamMinhNeural": "VI Male-Professional (Nam Minh)", "tts.selector": "Workflow Selection", "tts.what": "Converts narration text to natural human-like speech (some workflows support reference audio for voice cloning)", "tts.how": "Place the exported tts_xxx.json workflow file(API format) into the workflows/selfhost/ folder (for local ComfyUI) or the workflows/runninghub/ folder (for cloud)", diff --git a/web/i18n/locales/vi_VN.json b/web/i18n/locales/vi_VN.json new file mode 100644 index 000000000..0c4571a34 --- /dev/null +++ b/web/i18n/locales/vi_VN.json @@ -0,0 +1,507 @@ +{ + "language_name": "Tiếng Việt", + "t": { + "app.title": "⚡ Pixelle-Video - Trình tạo video ngắn tự động bằng AI", + "app.subtitle": "Phát triển bởi Pixelle.AI", + "section.content_input": "📝 Kịch bản Video", + "section.bgm": "🎵 Nhạc nền", + "section.tts": "🎤 Lồng tiếng", + "section.image": "🎨 Tạo hình ảnh", + "section.video": "🎬 Tạo video", + "section.media": "🎨 Tạo phương tiện", + "section.template": "📐 Mẫu phân cảnh", + "section.video_generation": "🎬 Tạo video", + "input_mode.topic": "💡 Chủ đề", + "input_mode.custom": "✍️ Nội dung tự chọn", + "mode.generate": "💡 AI Tự động tạo", + "mode.fixed": "✍️ Kịch bản tự viết", + "mode.digital": "💻 Chế độ giới thiệu sản phẩm", + "mode.customize": "🧐 Chế độ tùy chỉnh", + "input.topic": "Chủ đề", + "input.topic_placeholder": "AI sẽ tự động tạo số lượng lời thoại được chỉ định\nVí dụ: Cách xây dựng nguồn thu nhập thụ động", + "input.topic_help": "Nhập một chủ đề, AI sẽ tạo nội dung dựa trên chủ đề đó", + "input.text": "Nhập văn bản", + "input.text_help_generate": "Nhập chủ đề (AI sẽ tự động tạo lời bình)", + "input.text_help_fixed": "Nhập toàn bộ kịch bản lời bình (sử dụng trực tiếp không thay đổi)", + "input.text_help_digital": "Nhập mô tả sản phẩm. Nếu đã nhập mô tả sản phẩm, Ngài không cần nhập tên sản phẩm", + "input.text_help_audio": "Nhập gợi ý/mô tả, mô tả chi tiết nhất có thể về nội dung hình ảnh mong muốn", + "split.mode_label": "Phương thức cắt đoạn", + "split.mode_help": "Chọn cách chia nhỏ văn bản thành các phân đoạn video", + "split.mode_paragraph": "📄 Theo đoạn (\\n\\n)", + "split.mode_line": "📝 Theo dòng (\\n)", + "split.mode_sentence": "✂️ Theo câu (。.!?)", + "input.content": "Nội dung", + "input.content_placeholder": "Được sử dụng trực tiếp không sửa đổi (chia đoạn theo phương thức bên dưới)\nVí dụ:\nXin chào mọi người, hôm nay tôi sẽ chia sẻ 3 mẹo học tập hiệu quả.\n\nMẹo đầu tiên là rèn luyện sự tập trung, hãy thiền 10 phút mỗi ngày.\n\nMẹo thứ hai là chủ động gợi nhớ, ôn tập ngay sau khi học xong.", + "input.content_help": "Cung cấp nội dung của Ngài để tạo video", + "input.title": "Tiêu đề (Tùy chọn)", + "input.title_placeholder": "Tiêu đề video (tự động tạo nếu để trống)", + "input.title_help": "Tùy chọn: Đặt tiêu đề riêng cho video", + "voice.title": "🎤 Chọn giọng đọc", + "voice.male_professional": "🎤 Nam - Chuyên nghiệp", + "voice.male_young": "🎙️ Nam - Trẻ trung", + "voice.female_gentle": "🎵 Nữ - Dịu dàng", + "voice.female_energetic": "🎶 Nữ - Năng động", + "voice.preview": "▶ Nghe thử", + "voice.previewing": "Đang tạo bản nghe thử...", + "voice.preview_failed": "Nghe thử thất bại: {error}", + "style.workflow": "Chọn Workflow", + "style.workflow_what": "Quyết định cách tạo hình minh họa cho mỗi khung hình và hiệu ứng của nó (ví dụ: sử dụng FLUX, SD)", + "style.workflow_how": "Đặt tệp workflow đã xuất ở định dạng API (ví dụ: `image_xxx.json`) vào thư mục `workflows/selfhost/` (cho ComfyUI cục bộ) hoặc `workflows/runninghub/` (cho đám mây)", + "style.video_workflow_what": "Quyết định cách tạo đoạn video cho mỗi khung hình và hiệu ứng của nó (ví dụ: sử dụng các mô hình tạo video khác nhau)", + "style.video_workflow_how": "Đặt tệp workflow đã xuất ở định dạng API (ví dụ: `video_xxx.json`) vào thư mục `workflows/selfhost/` (cho ComfyUI cục bộ) hoặc `workflows/runninghub/` (cho đám mây)", + "style.image_size_info": "Kích thước ảnh: {width}x{height} (tự động xác định theo mẫu)", + "style.video_size_info": "Kích thước video: {width}x{height} (tự động xác định theo mẫu)", + "style.prompt_prefix": "Tiền tố gợi ý (Prompt Prefix)", + "style.prompt_prefix_what": "Tự động thêm vào trước tất cả các gợi ý hình ảnh để kiểm soát đồng nhất phong cách minh họa (ví dụ: hoạt hình, tả thực)", + "style.prompt_prefix_how": "Nhập mô tả phong cách vào hộp nhập bên dưới. Để lưu vĩnh viễn, hãy chỉnh sửa tệp config.yaml", + "style.prompt_prefix_placeholder": "Nhập tiền tố phong cách (để trống để dùng mặc định của cấu hình)", + "style.prompt_prefix_help": "Đoạn văn bản này sẽ được tự động thêm vào trước tất cả các gợi ý tạo hình ảnh. Để thay đổi vĩnh viễn, hãy chỉnh sửa tệp config.yaml", + "style.custom": "Tùy chỉnh", + "style.description": "Mô tả phong cách", + "style.description_placeholder": "Mô tả phong cách hình minh họa Ngài muốn (bằng bất kỳ ngôn ngữ nào)...", + "style.preview_title": "Xem trước phong cách", + "style.video_preview_title": "Xem trước video", + "style.test_prompt": "Gợi ý kiểm thử (Test Prompt)", + "style.test_video_prompt": "Gợi ý video kiểm thử", + "style.test_prompt_help": "Nhập gợi ý kiểm thử để xem trước hiệu ứng phong cách", + "style.preview": "🖼️ Tạo xem trước", + "style.video_preview": "🎬 Tạo xem trước video", + "style.previewing": "Đang tạo ảnh xem trước phong cách...", + "style.video_previewing": "Đang tạo video xem trước...", + "style.preview_success": "✅ Tạo ảnh xem trước thành công!", + "style.video_preview_success": "✅ Tạo video xem trước thành công!", + "style.preview_caption": "Xem trước phong cách", + "style.preview_failed": "Xem trước thất bại: {error}", + "style.preview_failed_general": "Không thể tạo ảnh xem trước", + "style.final_prompt_label": "Gợi ý cuối cùng", + "style.generated_prompt": "Gợi ý được tạo: {prompt}", + "template.selector": "Chọn mẫu phân cảnh", + "template.select": "Chọn mẫu", + "template.select_help": "Chọn mẫu và kích thước video", + "template.video_size_info": "Kích thước video cuối: {width} × {height}", + "template.separator_selected": "Vui lòng chọn một mẫu cụ thể, không chọn tiêu đề nhóm", + "template.default": "Mặc định", + "template.modern": "Hiện đại", + "template.neon": "Neon", + "template.what": "Kiểm soát bố cục hình ảnh và phong cách thiết kế của từng khung hình (tiêu đề, văn bản, cách sắp xếp hình ảnh)", + "template.how": "Đặt các tệp mẫu `.html` trong các thư mục tương ứng với kích thước (ví dụ: `templates/1080x1920/`). Các mẫu sẽ tự động được nhóm theo kích thước. Hỗ trợ định dạng CSS tùy chọn.\n\n**Quy tắc đặt tên mẫu:**\n\n- `static_*.html` → Mẫu kiểu tĩnh (không cần sinh ảnh/video bằng AI)\n- `image_*.html` → Mẫu sinh ảnh (ảnh do AI tạo)\n- `video_*.html` → Mẫu sinh video (video do AI tạo)\n\n**Lưu ý:**\n\nMáy tính của Ngài phải cài đặt ít nhất một trong các trình duyệt sau để hệ thống hoạt động bình thường:\n1. Google Chrome (Windows, macOS)\n2. Chromium (Linux)\n3. Microsoft Edge", + "template.size_info": "Kích thước mẫu", + "template.type_selector": "Loại mẫu phân cảnh", + "template.type.static": "📄 Kiểu tĩnh", + "template.type.image": "🖼️ Sinh ảnh minh họa", + "template.type.video": "🎬 Sinh video clip", + "template.type.static_hint": "Sử dụng các kiểu dáng tích hợp của mẫu, không yêu cầu tạo phương tiện bằng AI. Ngài có thể tùy chỉnh hình nền và các thông số khác trong mẫu.", + "template.type.image_hint": "AI tự động tạo hình ảnh minh họa phù hợp với nội dung lời bình. Kích thước hình ảnh được xác định bởi mẫu.", + "template.type.video_hint": "AI tự động tạo các đoạn video ngắn phù hợp với nội dung lời bình. Kích thước video được xác định bởi mẫu.", + "orientation.portrait": "Khung dọc (Portrait)", + "orientation.landscape": "Khung ngang (Landscape)", + "orientation.square": "Khung vuông (Square)", + "template.preview_title": "Xem trước mẫu phân cảnh", + "template.preview_param_title": "Tiêu đề", + "template.preview_param_text": "Văn bản", + "template.preview_param_image": "Đường dẫn ảnh", + "template.preview_param_width": "Chiều rộng", + "template.preview_param_height": "Chiều cao", + "template.preview_default_title": "AI thay đổi cách sáng tạo nội dung", + "template.preview_default_text": "Trí tuệ nhân tạo đang thay đổi cách Pixelle.AI tạo nội dung, giúp mọi người dễ dàng sản xuất các video chất lượng chuyên nghiệp.", + "template.preview_button": "🖼️ Tạo xem trước", + "template.preview_generating": "Đang tạo xem trước mẫu...", + "template.preview_success": "✅ Tạo xem trước thành công!", + "template.preview_failed": "❌ Tạo xem trước thất bại: {error}", + "template.preview_image_help": "Hỗ trợ đường dẫn cục bộ hoặc URL", + "template.preview_caption": "Xem trước mẫu: {template}", + "template.custom_parameters": "Tham số tùy chỉnh", + "template.gallery_view": "Thư viện mẫu phân cảnh", + "template.select_button": "Kiểm tra", + "template.selected": "Đã chọn", + "template.selected_template": "Mẫu hiện tại", + "template.no_templates_with_preview": "⚠️ Không có mẫu nào khả dụng cho loại này", + "image.not_required": "Mẫu hiện tại không yêu cầu tạo ảnh minh họa", + "image.not_required_hint": "Mẫu được chọn chỉ có chữ và không cần hình ảnh. Ưu điểm: ⚡ Tạo nhanh hơn 💰 Chi phí thấp hơn", + "video.title": "🎬 Cài đặt video", + "video.frames": "Số cảnh (Scenes)", + "video.frames_help": "Nhiều phân cảnh hơn = Video dài hơn", + "video.frames_label": "Số cảnh: {n}", + "video.frames_fixed_mode_hint": "💡 Chế độ cố định: số phân cảnh được xác định bởi các đoạn kịch bản thực tế", + "bgm.selector": "Chọn nhạc nền", + "bgm.none": "🔇 Không dùng nhạc nền", + "bgm.volume": "Âm lượng", + "bgm.volume_help": "Điều chỉnh âm lượng nhạc nền (0.0 = tắt âm, 1.0 = âm lượng gốc)", + "bgm.preview": "▶ Nghe thử nhạc", + "bgm.preview_failed": "❌ Không tìm thấy tệp nhạc: {file}", + "bgm.what": "Thêm nhạc nền vào video của Ngài để tạo không khí và sự chuyên nghiệp hơn", + "bgm.how": "Đặt các tệp âm thanh (MP3/WAV/FLAC, v.v.) vào thư mục bgm/ để hệ thống tự động phát hiện", + "btn.generate": "🎬 Tạo Video", + "btn.save_config": "💾 Lưu cấu hình", + "btn.reset_config": "🔄 Đặt lại mặc định", + "btn.save_and_start": "Lưu và Bắt đầu", + "btn.test_connection": "Kiểm tra kết nối", + "status.initializing": "🔧 Đang khởi tạo...", + "status.generating": "🚀 Đang tạo video...", + "status.success": "✅ Tạo video thành công!", + "status.error": "❌ Tạo video thất bại: {error}", + "status.video_generated": "✅ Video đã tạo: {path}", + "status.video_not_found": "Không tìm thấy tệp video: {path}", + "status.config_saved": "✅ Đã lưu cấu hình", + "status.config_reset": "✅ Đã đặt cấu hình về mặc định", + "status.llm_config_incomplete": "⚠️ Cấu hình LLM chưa hoàn thiện, vui lòng điền API Key, Base URL và Model", + "status.save_failed": "Lưu thất bại", + "status.connection_success": "✅ Kết nối thành công", + "status.connection_failed": "❌ Kết nối thất bại", + "progress.generating_title": "Đang tạo tiêu đề...", + "progress.generating_narrations": "Đang tạo lời thoại...", + "progress.splitting_script": "Đang cắt kịch bản...", + "progress.generating_image_prompts": "Đang tạo gợi ý hình ảnh...", + "progress.generating_video_prompts": "Đang tạo gợi ý video...", + "progress.preparing_frames": "Đang chuẩn bị khung hình...", + "progress.frame": "Cảnh {current}/{total}", + "progress.frame_step": "Cảnh {current}/{total} - Bước {step}/4: {action}", + "progress.processing_frame": "Đang xử lý cảnh {current}/{total}...", + "progress.step_audio": "Đang tạo âm thanh", + "progress.step_image": "Đang tạo hình ảnh", + "progress.step_media": "Đang tạo phương tiện", + "progress.step_compose": "Đang ghép khung hình", + "progress.step_video": "Đang tạo phân đoạn video", + "progress.concatenating": "Đang ghép nối video...", + "progress.finalizing": "Đang hoàn tất...", + "progress.generation": "Video đang được tổng hợp...", + "progress.completed": "✅ Hoàn thành", + "error.input_required": "❌ Vui lòng cung cấp chủ đề hoặc nội dung", + "error.api_key_required": "❌ Vui lòng nhập API Key", + "error.missing_field": "Vui lòng nhập {field}", + "info.duration": "Thời lượng", + "info.file_size": "Kích thước tệp", + "info.frames": "Số cảnh (Scenes)", + "info.scenes_unit": " cảnh", + "info.resolution": "Độ phân giải", + "info.video_information": "📊 Thông tin Video", + "info.no_video_yet": "Bản xem trước video sẽ xuất hiện ở đây sau khi tạo xong", + "info.generation_time": "Thời gian tạo", + "settings.title": "⚙️ Cấu hình hệ thống (Bắt buộc)", + "settings.not_configured": "⚠️ Vui lòng hoàn thành cấu hình hệ thống trước khi tạo video", + "settings.llm.title": "🤖 Mô hình ngôn ngữ lớn (LLM)", + "settings.llm.quick_select": "Chọn nhanh", + "settings.llm.quick_select_help": "Chọn cấu hình LLM có sẵn hoặc tùy chỉnh", + "settings.llm.get_api_key": "Lấy API Key", + "settings.llm.api_key": "API Key", + "settings.llm.api_key_help": "Nhập API Key của Ngài", + "settings.llm.base_url": "Base URL", + "settings.llm.base_url_help": "Nhập Base URL của dịch vụ mô hình, không nhập endpoint cụ thể. Ví dụ: OpenAI https://api.openai.com/v1 , Zhipu https://open.bigmodel.cn/api/paas/v4 .", + "settings.llm.model": "Model", + "settings.llm.model_help": "Tên mô hình", + "settings.llm.custom_model": "Tùy chỉnh...", + "settings.llm.custom_model_input": "Tên mô hình tùy chỉnh", + "settings.llm.load_models": "Tải mô hình", + "settings.llm.load_models_help": "Lấy danh sách mô hình khả dụng từ API", + "settings.llm.loading_models": "Đang tải...", + "settings.llm.models_loaded": "Đã tải {count} mô hình", + "settings.llm.models_load_failed": "Tải mô hình thất bại: {error}", + "settings.llm.test_connection": "Kiểm tra", + "settings.llm.test_connection_help": "Kiểm tra kết nối API", + "settings.llm.connection_success": "Kết nối OK! Có {count} mô hình khả dụng", + "settings.llm.connection_failed": "Kết nối thất bại: {error}", + "settings.comfyui.title": "🔧 Cấu hình ComfyUI", + "settings.comfyui.local_title": "ComfyUI Cục bộ/Tự chạy (Self-hosted)", + "settings.comfyui.cloud_title": "RunningHub Cloud", + "settings.comfyui.comfyui_url": "URL máy chủ ComfyUI", + "settings.comfyui.comfyui_url_help": "Địa chỉ máy chủ ComfyUI cục bộ hoặc từ xa", + "settings.comfyui.comfyui_api_key": "ComfyUI API Key", + "settings.comfyui.comfyui_api_key_help": "Tùy chọn, lấy từ https://platform.comfy.org/profile/api-keys", + "settings.comfyui.runninghub_api_key": "RunningHub API Key", + "settings.comfyui.runninghub_api_key_help": "Truy cập https://runninghub.ai để đăng ký và lấy API Key", + "settings.comfyui.runninghub_hint": "Không có ComfyUI cục bộ? Sử dụng RunningHub Cloud:", + "settings.comfyui.runninghub_get_api_key": "Lấy RunningHub API Key tại đây", + "settings.comfyui.runninghub_concurrent_limit": "Giới hạn đồng thời", + "settings.comfyui.runninghub_concurrent_limit_help": "Giới hạn chạy đồng thời của RunningHub (1-10), mặc định là 1 cho thành viên thường, điều chỉnh theo cấp độ thành viên của Ngài", + "settings.comfyui.runninghub_instance_type": "Thông số máy cấu hình", + "settings.comfyui.runninghub_instance_type_help": "Chọn thông số máy RunningHub, VRAM 48G phù hợp cho các mô hình lớn hoặc tạo độ phân giải cao (yêu cầu tài khoản thành viên hỗ trợ)", + "settings.comfyui.runninghub_instance_24g": "24G VRAM", + "settings.comfyui.runninghub_instance_48g": "48G VRAM", + "tts.inference_mode": "Chế độ lồng tiếng", + "tts.mode.local": "Lồng tiếng cục bộ", + "tts.mode.comfyui": "Lồng tiếng qua ComfyUI", + "tts.mode.local_hint": "💡 Sử dụng Edge TTS, không cần cấu hình thêm, có thể sử dụng ngay (yêu cầu mạng hoạt động ổn định)", + "tts.mode.comfyui_hint": "⚙️ Sử dụng workflow ComfyUI, linh hoạt và mạnh mẽ", + "tts.voice_selector": "Chọn giọng đọc", + "tts.speed": "Tốc độ", + "tts.speed_label": "{speed}x", + "tts.voice.zh_CN_XiaoxiaoNeural": "Giọng nữ - Nhẹ nhàng (Xiaoxiao)", + "tts.voice.zh_CN_XiaoyiNeural": "Giọng nữ - Ngọt ngào (Xiaoyi)", + "tts.voice.zh_CN_YunjianNeural": "Giọng nam - Chuyên nghiệp (Yunjian)", + "tts.voice.zh_CN_YunxiNeural": "Giọng nam - Cuốn hút (Yunxi)", + "tts.voice.zh_CN_YunyangNeural": "Giọng nam - Tin tức (Yunyang)", + "tts.voice.zh_CN_YunyeNeural": "Giọng nam - Tự nhiên (Yunye)", + "tts.voice.zh_CN_YunfengNeural": "Giọng nam - Điềm đạm (Yunfeng)", + "tts.voice.zh_CN_liaoning_XiaobeiNeural": "Giọng nữ - Đông Bắc (Xiaobei)", + "tts.voice.en_US_AriaNeural": "Giọng nữ - Tự nhiên (Aria)", + "tts.voice.en_US_JennyNeural": "Giọng nữ - Ấm áp (Jenny)", + "tts.voice.en_US_GuyNeural": "Giọng nam - Tiêu chuẩn (Guy)", + "tts.voice.en_US_DavisNeural": "Giọng nam - Thân thiện (Davis)", + "tts.voice.en_GB_SoniaNeural": "Giọng nữ - Anh-Anh (Sonia)", + "tts.voice.en_GB_RyanNeural": "Giọng nam - Anh-Anh (Ryan)", + "tts.voice.ko-KR-InJoonNeural": "Giọng nam Hàn - Thân thiện (InJoon)", + "tts.voice.ko-KR-SunHiNeural": "Giọng nữ Hàn - Thân thiện (SunHi)", + "tts.voice.fr-FR-EloiseNeural": "Giọng nữ Pháp - Thân thiện (Eloise)", + "tts.voice.fr-FR-HenriNeural": "Giọng nam Pháp - Thân thiện (Henri)", + "tts.voice.pt-PT-DuarteNeural": "Giọng nam Bồ Đào Nha - Thân thiện (Duarte)", + "tts.voice.pt-PT-RaquelNeural": "Giọng nữ Bồ Đào Nha - Thân thiện (Raquel)", + "tts.voice.de-DE-AmalaNeural": "Giọng nữ Đức - Thân thiện (Amala)", + "tts.voice.de-DE-ConradNeural": "Giọng nam Đức - Thân thiện (Conrad)", + "tts.voice.ru-RU-DmitryNeural": "Giọng nam Nga - Thân thiện (Dmitry)", + "tts.voice.ru-RU-SvetlanaNeural": "Giọng nữ Nga - Thân thiện (Svetlana)", + "tts.voice.tr-TR-AhmetNeural": "Giọng nam Thổ Nhĩ Kỳ - Thân thiện (Ahmet)", + "tts.voice.tr-TR-EmelNeural": "Giọng nữ Thổ Nhĩ Kỳ - Thân thiện (Emel)", + "tts.voice.es-ES-AlvaroNeural": "Giọng nam Tây Ban Nha - Thân thiện (Alvaro)", + "tts.voice.es-ES-ElviraNeural": "Giọng nữ Tây Ban Nha - Thân thiện (Elvira)", + "tts.voice.vi_VN_HoaiMyNeural": "Giọng nữ Việt - Truyền cảm (Hoài My)", + "tts.voice.vi_VN_NamMinhNeural": "Giọng nam Việt - Chuyên nghiệp (Nam Minh)", + "tts.selector": "Chọn Workflow", + "tts.what": "Chuyển đổi văn bản lời bình thành giọng nói tự nhiên giống con người (một số workflow hỗ trợ file âm thanh mẫu để sao chép giọng nói)", + "tts.how": "Đặt tệp workflow đã xuất ở định dạng API (ví dụ: `tts_xxx.json`) vào thư mục `workflows/selfhost/` (cho ComfyUI cục bộ) hoặc `workflows/runninghub/` (cho đám mây)", + "tts.ref_audio": "Âm thanh mẫu (Reference Audio)", + "tts.ref_audio_help": "Tải lên tệp âm thanh để sao chép giọng nói (chỉ một số workflow hỗ trợ)", + "tts.preview_title": "Nghe thử giọng đọc TTS", + "tts.preview_text": "Văn bản thử nghiệm", + "tts.preview_text_placeholder": "Nhập nội dung muốn nghe thử...", + "tts.preview_button": "🔊 Phát thử giọng đọc", + "tts.previewing": "Đang tạo giọng đọc nghe thử...", + "tts.preview_success": "✅ Tạo giọng đọc nghe thử thành công!", + "tts.preview_failed": "❌ Phát thử thất bại: {error}", + "welcome.first_time": "🎉 Chào mừng Ngài đến với Pixelle-Video! Vui lòng hoàn thành cấu hình cơ bản", + "welcome.config_hint": "💡 Lần đầu thiết lập yêu cầu cấu hình API Key của LLM, Ngài có thể chỉnh sửa lại trong cài đặt nâng cao sau này", + "wizard.llm_required": "🤖 Cấu hình mô hình ngôn ngữ lớn LLM (Bắt buộc)", + "wizard.image_optional": "🎨 Cấu hình tạo hình ảnh (Tùy chọn)", + "wizard.image_hint": "💡 Nếu không cấu hình, hệ thống sẽ sử dụng mẫu mặc định (không sinh ảnh bằng AI)", + "wizard.configure_image": "Cấu hình tạo ảnh (Khuyên dùng)", + "label.required": "(Bắt buộc)", + "label.optional": "(Tùy chọn)", + "help.feature_description": "💡 Mô tả tính năng", + "help.what": "Mục đích", + "help.how": "Cách tùy biến", + "language.select": "🌐 Ngôn ngữ", + "version.title": "📦 Thông tin phiên bản", + "version.current": "Phiên bản hiện tại", + "github.title": "⭐ Hỗ trợ nguồn mở", + "history.page_title": "📚 Lịch sử tạo video", + "history.total_tasks": "Tổng số tác vụ", + "history.completed_count": "Đã hoàn thành", + "history.failed_count": "Thất bại", + "history.total_duration": "Tổng thời lượng", + "history.total_size": "Tổng dung lượng", + "history.filter_status": "Lọc trạng thái", + "history.status_all": "Tất cả", + "history.status_completed": "Đã hoàn thành", + "history.status_failed": "Thất bại", + "history.status_running": "Đang chạy", + "history.status_pending": "Đang chờ", + "history.sort_by": "Sắp xếp theo", + "history.sort_created_at": "Thời gian tạo", + "history.sort_completed_at": "Thời gian hoàn thành", + "history.sort_title": "Tiêu đề", + "history.sort_duration": "Thời lượng", + "history.sort_order_desc": "Giảm dần", + "history.sort_order_asc": "Tăng dần", + "history.page_size": "Số mục mỗi trang", + "history.no_tasks": "Chưa có bản ghi tác vụ nào", + "history.task_card.title": "Tiêu đề", + "history.task_card.created_at": "Đã tạo lúc", + "history.task_card.duration": "Thời lượng", + "history.task_card.frames": "Số phân cảnh", + "history.task_card.view_detail": "Xem chi tiết", + "history.task_card.duplicate": "Sao chép tham số", + "history.task_card.delete": "Xóa", + "history.task_card.download": "Tải video", + "history.task_card.status_completed": "✅ Đã hoàn thành", + "history.task_card.status_failed": "❌ Thất bại", + "history.task_card.status_running": "⏳ Đang chạy", + "history.task_card.status_pending": "⏸️ Đang chờ", + "history.detail.modal_title": "Chi tiết tác vụ", + "history.detail.task_id": "Mã tác vụ (Task ID)", + "history.detail.input_params": "Tham số đầu vào", + "history.detail.text": "Kịch bản chữ", + "history.detail.mode": "Chế độ", + "history.detail.n_scenes": "Số phân cảnh", + "history.detail.tts_mode": "Chế độ lồng tiếng", + "history.detail.voice": "Giọng đọc", + "history.detail.storyboard": "Kịch bản hình ảnh (Storyboard)", + "history.detail.frame_index": "Phân cảnh {index}", + "history.detail.frame": "Cảnh", + "history.detail.download_video": "Tải video xuống", + "history.detail.narration": "Lời bình", + "history.detail.image_prompt": "Gợi ý hình ảnh", + "history.detail.audio_path": "Âm thanh", + "history.detail.image_path": "Hình ảnh", + "history.detail.video_segment_path": "Đoạn video ngắn", + "history.detail.close": "Đóng", + "history.action.duplicate_success": "✅ Đã sao chép tham số, đang chuyển hướng...", + "history.action.duplicate_failed": "❌ Sao chép thất bại: {error}", + "history.action.delete_confirm": "Xác nhận xóa tác vụ này? Hành động này không thể hoàn tác!", + "history.action.delete_success": "✅ Đã xóa tác vụ thành công", + "history.action.delete_failed": "❌ Xóa thất bại: {error}", + "history.page_info": "Trang {page} / {total_pages}", + "batch.mode_label": "🔢 Chế độ tạo hàng loạt", + "batch.mode_help": "Tạo nhiều video cùng lúc, mỗi dòng một chủ đề", + "batch.section_title": "Nhập danh sách chủ đề hàng loạt", + "batch.section_generation": "📦 Tạo Video Hàng Loạt", + "batch.rules_title": "Quy tắc tạo hàng loạt", + "batch.rule_1": "Tự động sử dụng chế độ \"AI Tự động tạo nội dung\"", + "batch.rule_2": "Mỗi dòng nhập một chủ đề", + "batch.rule_3": "Tất cả các video sẽ sử dụng cùng một cấu hình (Giọng đọc, Mẫu, Workflow, v.v.)", + "batch.topics_label": "Chủ đề hàng loạt (mỗi dòng một chủ đề)", + "batch.topics_placeholder": "Tại sao nên xây dựng thói quen đọc sách\nCách quản lý thời gian hiệu quả\n5 bí quyết sống khỏe mạnh\nLợi ích của việc dậy sớm\nCách vượt qua sự trì hoãn\nCác kỹ thuật để duy trì sự tập trung\nPhương pháp quản lý cảm xúc\nMẹo để cải thiện trí nhớ\nXây dựng các mối quan hệ tốt đẹp\nKiến thức cơ bản về quản lý tài chính", + "batch.topics_help": "Mỗi dòng là một chủ đề video, AI sẽ dựa vào đó để tự động tạo kịch bản", + "batch.count_success": "✅ Đã nhận diện {count} chủ đề", + "batch.count_error": "❌ Số lượng chủ đề hàng loạt vượt quá giới hạn (tối đa 100), hiện tại: {count}", + "batch.preview_title": "📋 Xem trước danh sách chủ đề", + "batch.title_prefix_label": "Tiền tố tiêu đề (tùy chọn)", + "batch.title_prefix_placeholder": "Ví dụ: Chia sẻ kiến thức", + "batch.title_prefix_help": "Định dạng tiêu đề cuối: {prefix} - {topic}, Ví dụ: Chia sẻ kiến thức - Tại sao nên xây dựng thói quen đọc sách", + "batch.n_scenes_label": "Số cảnh (áp dụng chung cho mọi video)", + "batch.n_scenes_help": "Số lượng cảnh của mỗi video, tất cả các video sẽ dùng chung cấu hình này", + "batch.n_scenes_caption": "Số cảnh: {n}", + "batch.config_info": "Các cấu hình khác: Giọng đọc TTS, mẫu video, workflow hình ảnh, v.v. sẽ lấy từ cấu hình ở bảng bên phải, áp dụng chung cho mọi video", + "batch.no_topics": "⚠️ Vui lòng nhập danh sách chủ đề ở cột bên trái (mỗi dòng một chủ đề)", + "batch.prepare_info": "📊 Sẵn sàng tạo {count} video (sử dụng chung một cấu hình)", + "batch.estimated_time": "⏱️ Thời gian dự kiến: khoảng {minutes} phút", + "batch.generate_button": "🚀 Bắt đầu tạo hàng loạt {count} Video", + "batch.generate_help": "⚠️ Vui lòng giữ trang web này luôn mở trong suốt quá trình tạo hàng loạt, không đóng trình duyệt", + "batch.overall_progress": "Tiến trình tổng thể", + "batch.current_task": "Tác vụ hiện tại", + "batch.completed": "Đã tạo hàng loạt hoàn tất!", + "batch.results_title": "📊 Kết quả tạo hàng loạt", + "batch.total": "Tổng số", + "batch.success": "Thành công", + "batch.failed": "Thất bại", + "batch.total_time": "Tổng thời gian", + "batch.minutes": "phút", + "batch.seconds": "giây", + "batch.success_message": "✅ Đã tạo video hàng loạt thành công! Tất cả video đã được lưu vào lịch sử.", + "batch.view_in_history": "💡 Gợi ý: Ngài có thể xem lại tất cả các video đã tạo ở trang \"📚 Lịch sử\".", + "batch.goto_history": "Đi tới trang Lịch sử", + "batch.failed_list": "❌ Các tác vụ thất bại", + "batch.task": "Tác vụ", + "batch.error": "Lỗi", + "batch.error_detail": "Xem chi tiết ngăn xếp lỗi (error stack)", + "pipeline.quick_create.name": "Sáng tạo nhanh", + "pipeline.quick_create.description": "Nhập một ý tưởng, AI sẽ hoàn thiện toàn bộ video cho Ngài", + "pipeline.custom_media.name": "Sử dụng tư liệu riêng", + "pipeline.custom_media.description": "Sử dụng hình ảnh/video của riêng Ngài, AI sẽ thêm kịch bản và lồng tiếng", + "pipeline.digital_human.name": "Phát sóng kỹ thuật số (Digital Human)", + "pipeline.digital_human.description": "Sử dụng một văn bản kịch bản, hai bức ảnh và một đoạn âm thanh mẫu, AI sẽ sinh ra video người kỹ thuật số nói chuyện cho Ngài", + "pipeline.i2v.name": "Biến ảnh thành video (Image to Video)", + "pipeline.i2v.description": "Nhập một bức ảnh và gợi ý chuyển động, AI sẽ sinh ra video ngay lập tức", + "pipeline.action_transfer.name": "Di chuyển động (Action Transfer)", + "pipeline.action_transfer.description": "Sử dụng một hình ảnh và một video mẫu để tái tạo lại các động tác chuyển động tuyệt vời", + "asset_based.section.assets": "📦 Tải lên tư liệu", + "asset_based.section.video_info": "📝 Thông tin video", + "asset_based.section.source": "⚙️ Cấu hình dịch vụ", + "asset_based.assets.what": "Tải lên các hình ảnh hoặc tài nguyên video của Ngài, AI sẽ tự động phân tích và tạo kịch bản video", + "asset_based.assets.how": "Hỗ trợ định dạng ảnh JPG/PNG/GIF/WebP và video MP4/MOV/AVI. Mỗi tài nguyên nên rõ nét và liên quan đến chủ đề", + "asset_based.assets.upload": "Tải tài nguyên lên", + "asset_based.assets.upload_help": "Hỗ trợ tải lên nhiều tệp ảnh hoặc video", + "asset_based.assets.count": "✅ Đã tải lên {count} tài nguyên", + "asset_based.assets.preview": "📷 Xem trước tài nguyên", + "asset_based.assets.empty_hint": "💡 Vui lòng tải lên ít nhất một hình ảnh hoặc video tư liệu", + "asset_based.video_title": "Tiêu đề video (Tùy chọn)", + "asset_based.video_title_placeholder": "Ví dụ: Sự kiện giảm giá cuối năm của cửa hàng thú cưng", + "asset_based.video_title_help": "Tiêu đề chính cho video, để trống nếu không muốn hiển thị tiêu đề", + "asset_based.intent": "Ý đồ video", + "asset_based.intent_placeholder": "Ví dụ: Quảng cáo chương trình khuyến mãi đặc biệt cuối năm của cửa hàng thú cưng để thu hút khách hàng đến mua sắm, tông giọng ấm áp thân thiện", + "asset_based.intent_help": "Mô tả mục đích, thông điệp truyền tải và phong cách mong muốn cho video này", + "asset_based.duration": "Thời lượng đích (giây)", + "asset_based.duration_help": "Thời lượng video mong muốn, AI sẽ tự điều chỉnh theo số lượng tài nguyên", + "asset_based.duration_label": "Thời lượng đích: {seconds} giây", + "asset_based.source.what": "Chọn nhà cung cấp dịch vụ để phân tích hình ảnh", + "asset_based.source.how": "RunningHub là dịch vụ đám mây yêu cầu cấu hình API Key; SelfHost sử dụng ComfyUI chạy cục bộ", + "asset_based.source.select": "Chọn dịch vụ", + "asset_based.source.runninghub": "☁️ RunningHub (Cloud)", + "asset_based.source.selfhost": "🖥️ SelfHost (Cục bộ)", + "asset_based.source.runninghub_hint": "💡 Sử dụng dịch vụ đám mây RunningHub để phân tích tài nguyên", + "asset_based.source.selfhost_hint": "💡 Sử dụng máy chủ ComfyUI cục bộ để phân tích tài nguyên", + "asset_based.source.runninghub_not_configured": "⚠️ Chưa cấu hình RunningHub API Key", + "asset_based.source.selfhost_not_configured": "⚠️ Chưa cấu hình địa chỉ ComfyUI cục bộ", + "asset_based.output.no_assets": "💡 Vui lòng tải tài nguyên lên ở bảng bên trái trước", + "asset_based.output.ready": "📦 {count} tài nguyên đã sẵn sàng, Ngài có thể bắt đầu tạo video", + "asset_based.progress.analyzing": "🔍 Đang phân tích tài nguyên...", + "asset_based.progress.analyzing_start": "🔍 Bắt đầu phân tích {total} tài nguyên...", + "asset_based.progress.analyzing_asset": "🔍 Đang phân tích tài nguyên {current}/{total}: {name}", + "asset_based.progress.analyzing_complete": "✅ Hoàn tất phân tích tài nguyên (Tổng cộng {count})", + "asset_based.progress.generating_script": "📝 Đang sinh kịch bản video...", + "asset_based.progress.script_complete": "✅ Hoàn tất tạo kịch bản video", + "asset_based.progress.concat_complete": "✅ Hoàn tất ghép nối video", + "digital_human.section.character_assets": "😊 Tải lên hình ảnh nhân vật", + "digital_human.assets.character_what": "Tải lên bức ảnh chân dung đại diện cho nhân vật kỹ thuật số", + "digital_human.assets.character_warning": "Vui lòng tải lên bức ảnh nhân vật chân dung", + "digital_human.assets.goods_warning": "Vui lòng tải lên các hình ảnh sản phẩm", + "digital_human.assets.digital_mode": "Vui lòng nhập kịch bản nói tự viết hoặc chủ đề AI sáng tạo", + "digital_human.assets.digital_mode_warning": "⚠️ Chỉ cần nhập một trong hai: Kịch bản nói tự viết hoặc Chủ đề AI sáng tạo. Nếu kịch bản nói tự viết đã có nội dung, hệ thống sẽ bỏ qua chủ đề AI.", + "digital_human.assets.customize_mode": "Vui lòng nhập kịch bản lời nói tùy chỉnh", + "digital_human.assets.how": "Định dạng hỗ trợ: JPG/PNG/WebP; nên sử dụng hình ảnh rõ nét và liên quan đến chủ thể", + "digital_human.assets.upload": "Tải tài nguyên lên", + "digital_human.assets.upload_help": "Chỉ hỗ trợ tải lên một ảnh duy nhất", + "digital_human.assets.character_sucess": "Tải ảnh nhân vật thành công", + "digital_human.assets.preview": "📷 Xem trước tài nguyên", + "digital_human.assets.character_empty_hint": "💡 Vui lòng tải lên một bức ảnh chân dung nhân vật kỹ thuật số", + "digital_human.section.select_mode": "💫 Chọn chế độ tạo video", + "digital_human.assets.mode_what": "Chọn chế độ tạo người kỹ thuật số mong muốn", + "digital_human.assets.select_how": "Hỗ trợ chế độ quảng bá sản phẩm thông minh và chế độ kịch bản nói tự viết tùy chọn", + "digital_human.input.topic_placeholder": "Kịch bản lời bình\nVí dụ: Hương thơm lưu lại những kỷ niệm đẹp đẽ. Nếu Ngài đang tìm kiếm một hương nước hoa đặc trưng dành riêng cho mình, hãy thử trải nghiệm nước hoa TALIA.", + "digital_human.input.content_placeholder": "Được dùng trực tiếp, không viết lại\nVí dụ:\nHương thơm lưu lại những kỷ niệm đẹp đẽ. Nếu Ngài đang tìm kiếm một hương nước hoa đặc trưng dành riêng cho mình, hãy thử trải nghiệm nước hoa TALIA. Nó tinh tế, sâu lắng và tôn lên vẻ lôi cuốn của Ngài. Hãy bắt đầu tạo nên những khoảnh khắc tuyệt vời ngay hôm nay cùng TALIA.", + "digital_human.assets.goods_sucess": "Tải hình ảnh sản phẩm thành công", + "digital_human.assets.goods_empty_hint": "💡 Vui lòng tải lên hình ảnh sản phẩm minh họa", + "digital_human.section.goods_info": "🗃️ Thông tin sản phẩm", + "digital_human.goods_title": "AI tự tạo kịch bản nói", + "digital_human.goods_title_placeholder": "Ví dụ: son môi, máy pha cà phê, robot hút bụi, v.v.", + "digital_human.goods_title_help": "Tên sản phẩm. Nếu được điền, AI sẽ tự động sinh kịch bản giới thiệu. Ngài không cần nhập lại phần mô tả bên dưới trừ khi muốn bổ sung chi tiết.", + "digital_human.input_text": "Kịch bản nói", + "digital_human.customize_text": "Lời nói tùy chỉnh", + "digital_human.section.workflow": "⚙️ Nạp Workflow", + "digital_human.workflow.what": "Cấu hình quy trình 2 bước để tạo video nhân vật nói chuyện: bước 1 tạo bố cục hình ảnh ghép và lời thoại, bước 2 tạo video hoàn thiện cuối", + "digital_human.workflow.first_step": "Đã nạp thành công workflow tạo kịch bản & ghép hình ảnh", + "digital_human.workflow.second_step": "Đã nạp thành công workflow tổng hợp video nhân vật kỹ thuật số", + "digital_human.workflow.ready": "Quy trình tạo video nhân vật kỹ thuật số đã sẵn sàng. Ngài có thể bắt đầu tạo video", + "digital_human.workflow.missing": "Thiếu cấu hình workflow tạo người kỹ thuật số bắt buộc. Vui lòng kiểm tra lại cấu hình", + "digital_tts.what": "Chuyển văn bản kịch bản thành giọng nói tự nhiên giống con người", + "i2v.video_generation": "🛠️ Tham số cấu hình", + "i2v.assets.image_what": "Ảnh tham chiếu cho khung hình đầu tiên của đoạn video muốn tạo", + "i2v.assets.how": "Hỗ trợ định dạng ảnh JPG/PNG/WebP. Khuyên dùng ảnh rõ nét, độ phân giải cao. Gợi ý mô tả chuyển động chi tiết sẽ mang lại hiệu ứng video tối ưu hơn", + "i2v.input.topic_placeholder": "Nhập các mô tả sáng tạo (ví dụ: chuyển động của camera, nhịp điệu chuyển động, phong cách hình ảnh tổng thể, tông màu sắc, v.v.)", + "i2v.assets.upload": "Tải ảnh khung hình đầu tiên lên", + "i2v.assets.upload_help": "Chỉ hỗ trợ tải lên một ảnh duy nhất", + "i2v.assets.character_sucess": "Tải tài nguyên thành công", + "i2v.assets.preview": "📷 Xem trước tài liệu", + "i2v.assets.character_empty_hint": "💡 Vui lòng tải lên bức ảnh đại diện cho khung hình đầu tiên của video Ngài muốn sinh", + "i2v.input_text": "Mô tả chuyển động video (Prompt)", + "i2v.assets.image_warning": "Tải lên hình ảnh khung hình đầu tiên của video", + "i2v.assets.prompt_warning": "Vui lòng nhập văn bản mô tả chuyển động video", + "i2v.workflow_select": "Chọn workflow biến hình ảnh thành video (bao gồm cục bộ và runninghub)", + "action_transfer.video_upload": "🎞️ Tài liệu video mẫu", + "action_transfer.assets.video_what": "Tải lên video mẫu chứa các động tác chuyển động mà Ngài muốn nhân vật bắt chước theo", + "action_transfer.assets.video_how": "Hỗ trợ định dạng MP4/MKV/MOV. Video mẫu nên chỉ xuất hiện một người thực hiện động tác rõ ràng để đạt kết quả tốt nhất", + "action_transfer.assets.video_upload": "Tải video chứa động tác mẫu lên", + "action_transfer.assets.video_upload_help": "Chỉ hỗ trợ tải lên một video mẫu duy nhất, chứa hình ảnh một người chuyển động. Độ dài video nên dưới hoặc bằng 30 giây. Nếu dài hơn 30 giây, hệ thống sẽ chỉ cắt lấy 30 giây đầu tiên để tham khảo", + "action_transfer.assets.video_sucess": "Tải lên video mẫu thành công", + "action_transfer.assets.preview": "👀 Xem trước tài nguyên", + "action_transfer.assets.video_empty_hint": "💡 Vui lòng tải lên một video mẫu tham khảo cho quá trình chuyển động", + "action_transfer.image_upload": "✏️ Tham số cấu hình", + "action_transfer.assets.image_what": "Tải lên bức ảnh nhân vật muốn thực hiện động tác bắt chước theo video mẫu", + "action_transfer.assets.image_how": "Hỗ trợ các định dạng JPG/PNG/WebP. Khuyên dùng ảnh nhân vật rõ nét, chính diện", + "action_transfer.assets.image_upload": "Tải ảnh nhân vật bắt chước chuyển động lên", + "action_transfer.assets.image_upload_help": "Chỉ hỗ trợ tải lên một ảnh duy nhất; hình ảnh có một người đơn lẻ sẽ cho kết quả tối ưu nhất", + "action_transfer.assets.image_sucess": "Tải ảnh nhân vật thành công", + "action_transfer.assets.image_empty_hint": "💡 Vui lòng tải lên một bức ảnh nhân vật bắt chước chuyển động", + "action_transfer.input_text": "Gợi ý bổ sung cho video", + "action_transfer.input.topic_placeholder": "Nhập các yêu cầu sáng tạo (ví dụ: bắt chước điệu nhảy trong video tham chiếu, giữ nguyên vị trí đứng, chuyển động chân khớp và đều với nhạc, v.v.)", + "action_transfer.workflow_select": "Chọn workflow chuyển động nhân vật (bao gồm cục bộ và runninghub)", + "action_transfer.assets.image_warning": "Vui lòng tải ảnh nhân vật bắt chước chuyển động lên", + "action_transfer.assets.video_warning": "Vui lòng tải video chứa động tác mẫu lên", + "action_transfer.assets.prompt_warning": "Vui lòng nhập văn bản mô tả gợi ý bổ sung cho video", + "faq.expand_to_view": "Câu hỏi thường gặp (FAQ)", + "faq.load_error": "Không thể tải nội dung Câu hỏi thường gặp", + "faq.more_help": "Ngài cần thêm sự giúp đỡ?", + "selfhost.warning.title": "Ngài đã chọn một workflow cục bộ (SelfHost). Vui lòng xác nhận các bước sau:", + "selfhost.warning.message": "1. Trước tiên, hãy **nạp và chạy thử** workflow `{workflow_path}` trên giao diện ComfyUI cục bộ của Ngài ({comfyui_url})\n2. Đảm bảo workflow **chạy thành công** hoàn chỉnh, không bị thiếu nút (nodes) hay thiếu mô hình (models)\n3. Sau khi chạy thử nghiệm ổn định, quay lại giao diện này để bắt đầu sử dụng chính thức", + "selfhost.warning.hint": "⚠️ Nếu Ngài chưa kiểm thử chạy thử workflow này trực tiếp trong ComfyUI, quá trình tạo video tiếp theo **chắc chắn sẽ thất bại** (thông thường là lỗi 400)! Vui lòng không bỏ qua bước này.", + "selfhost.warning.confirm": "Tôi đã hiểu, tiếp tục chạy" + } +} diff --git a/web/i18n/locales/zh_CN.json b/web/i18n/locales/zh_CN.json index f8bb00fab..1f6cb0e57 100644 --- a/web/i18n/locales/zh_CN.json +++ b/web/i18n/locales/zh_CN.json @@ -253,6 +253,8 @@ "tts.voice.tr-TR-EmelNeural": "TR 女声-友好(埃梅尔)", "tts.voice.es-ES-AlvaroNeural": "ES 男声-友好(阿尔瓦罗)", "tts.voice.es-ES-ElviraNeural": "ES 女声-友好(埃尔维拉)", + "tts.voice.vi_VN_HoaiMyNeural": "VI 女声-温柔(怀美)", + "tts.voice.vi_VN_NamMinhNeural": "VI 男声-专业(南明)", "tts.selector": "工作流选择", "tts.what": "将旁白文本转换为真人般的自然语音(部分工作流支持参考音频克隆声音)", "tts.how": "将导出的 tts_xxx.json 工作流文件(API格式)放入 workflows/selfhost/(本地 ComfyUI)或 workflows/runninghub/(云端)文件夹",