@leejungkiin/awkit 1.4.0 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/awk.js +458 -7
- package/bin/claude-generators.js +122 -0
- package/core/AGENTS.md +16 -0
- package/core/CLAUDE.md +155 -0
- package/core/GEMINI.md +44 -9
- package/package.json +1 -1
- package/skills/ai-sprite-maker/SKILL.md +81 -0
- package/skills/ai-sprite-maker/scripts/animate_sprite.py +102 -0
- package/skills/ai-sprite-maker/scripts/process_sprites.py +140 -0
- package/skills/code-review/SKILL.md +21 -33
- package/skills/lucylab-tts/SKILL.md +64 -0
- package/skills/lucylab-tts/resources/voices_library.json +908 -0
- package/skills/lucylab-tts/scripts/.env +1 -0
- package/skills/lucylab-tts/scripts/lucylab_tts.py +506 -0
- package/skills/orchestrator/SKILL.md +5 -0
- package/skills/short-maker/SKILL.md +150 -0
- package/skills/short-maker/_backup/storyboard.html +106 -0
- package/skills/short-maker/_backup/video_mixer.py +296 -0
- package/skills/short-maker/outputs/fitbite-promo/background.jpg +0 -0
- package/skills/short-maker/outputs/fitbite-promo/final/promo-final.mp4 +0 -0
- package/skills/short-maker/outputs/fitbite-promo/script.md +19 -0
- package/skills/short-maker/outputs/fitbite-promo/segments/scene-01.mp4 +0 -0
- package/skills/short-maker/outputs/fitbite-promo/segments/scene-02.mp4 +0 -0
- package/skills/short-maker/outputs/fitbite-promo/segments/scene-03.mp4 +0 -0
- package/skills/short-maker/outputs/fitbite-promo/segments/scene-04.mp4 +0 -0
- package/skills/short-maker/outputs/fitbite-promo/storyboard/scene-01.png +0 -0
- package/skills/short-maker/outputs/fitbite-promo/storyboard/scene-02.png +0 -0
- package/skills/short-maker/outputs/fitbite-promo/storyboard/scene-03.png +0 -0
- package/skills/short-maker/outputs/fitbite-promo/storyboard/scene-04.png +0 -0
- package/skills/short-maker/outputs/fitbite-promo/storyboard.html +133 -0
- package/skills/short-maker/outputs/fitbite-promo/storyboard.json +38 -0
- package/skills/short-maker/outputs/fitbite-promo/temp/merged_chroma.mp4 +0 -0
- package/skills/short-maker/outputs/fitbite-promo/temp/merged_crossfaded.mp4 +0 -0
- package/skills/short-maker/outputs/fitbite-promo/temp/ready_00.mp4 +0 -0
- package/skills/short-maker/outputs/fitbite-promo/temp/ready_01.mp4 +0 -0
- package/skills/short-maker/outputs/fitbite-promo/temp/ready_02.mp4 +0 -0
- package/skills/short-maker/outputs/fitbite-promo/temp/ready_03.mp4 +0 -0
- package/skills/short-maker/outputs/fitbite-promo/tts/manifest.json +31 -0
- package/skills/short-maker/outputs/fitbite-promo/tts/scene-01.wav +0 -0
- package/skills/short-maker/outputs/fitbite-promo/tts/scene-02.wav +0 -0
- package/skills/short-maker/outputs/fitbite-promo/tts/scene-03.wav +0 -0
- package/skills/short-maker/outputs/fitbite-promo/tts/scene-04.wav +0 -0
- package/skills/short-maker/outputs/fitbite-promo/tts_script.txt +11 -0
- package/skills/short-maker/scripts/google-flow-cli/.project-identity +41 -0
- package/skills/short-maker/scripts/google-flow-cli/.trae/rules/project_rules.md +52 -0
- package/skills/short-maker/scripts/google-flow-cli/CODEBASE.md +67 -0
- package/skills/short-maker/scripts/google-flow-cli/GoogleFlowCli.code-workspace +29 -0
- package/skills/short-maker/scripts/google-flow-cli/README.md +168 -0
- package/skills/short-maker/scripts/google-flow-cli/docs/specs/PROJECT.md +12 -0
- package/skills/short-maker/scripts/google-flow-cli/docs/specs/REQUIREMENTS.md +22 -0
- package/skills/short-maker/scripts/google-flow-cli/docs/specs/ROADMAP.md +16 -0
- package/skills/short-maker/scripts/google-flow-cli/docs/specs/TECH-SPEC.md +13 -0
- package/skills/short-maker/scripts/google-flow-cli/gflow/__init__.py +3 -0
- package/skills/short-maker/scripts/google-flow-cli/gflow/api/__init__.py +19 -0
- package/skills/short-maker/scripts/google-flow-cli/gflow/api/client.py +1921 -0
- package/skills/short-maker/scripts/google-flow-cli/gflow/api/models.py +64 -0
- package/skills/short-maker/scripts/google-flow-cli/gflow/api/rpc_ids.py +98 -0
- package/skills/short-maker/scripts/google-flow-cli/gflow/auth/__init__.py +15 -0
- package/skills/short-maker/scripts/google-flow-cli/gflow/auth/browser_auth.py +692 -0
- package/skills/short-maker/scripts/google-flow-cli/gflow/auth/humanizer.py +417 -0
- package/skills/short-maker/scripts/google-flow-cli/gflow/auth/proxy_ext.py +120 -0
- package/skills/short-maker/scripts/google-flow-cli/gflow/auth/recaptcha.py +482 -0
- package/skills/short-maker/scripts/google-flow-cli/gflow/batchexecute/__init__.py +5 -0
- package/skills/short-maker/scripts/google-flow-cli/gflow/batchexecute/client.py +414 -0
- package/skills/short-maker/scripts/google-flow-cli/gflow/cli/__init__.py +1 -0
- package/skills/short-maker/scripts/google-flow-cli/gflow/cli/main.py +1075 -0
- package/skills/short-maker/scripts/google-flow-cli/pyproject.toml +36 -0
- package/skills/short-maker/scripts/google-flow-cli/script.txt +22 -0
- package/skills/short-maker/scripts/google-flow-cli/tests/__init__.py +0 -0
- package/skills/short-maker/scripts/google-flow-cli/tests/test_batchexecute.py +113 -0
- package/skills/short-maker/scripts/google-flow-cli/tests/test_client.py +190 -0
- package/skills/short-maker/templates/aida_script.md +40 -0
- package/skills/short-maker/templates/mimic_analyzer.md +29 -0
- package/skills/single-flow-task-execution/SKILL.md +9 -6
- package/skills/skill-creator/SKILL.md +44 -0
- package/skills/spm-build-analysis/SKILL.md +92 -0
- package/skills/spm-build-analysis/references/build-optimization-sources.md +155 -0
- package/skills/spm-build-analysis/references/recommendation-format.md +85 -0
- package/skills/spm-build-analysis/references/spm-analysis-checks.md +105 -0
- package/skills/spm-build-analysis/scripts/check_spm_pins.py +118 -0
- package/skills/symphony-enforcer/SKILL.md +51 -83
- package/skills/symphony-orchestrator/SKILL.md +1 -1
- package/skills/trello-sync/SKILL.md +27 -28
- package/skills/verification-gate/SKILL.md +13 -2
- package/skills/xcode-build-benchmark/SKILL.md +88 -0
- package/skills/xcode-build-benchmark/references/benchmark-artifacts.md +94 -0
- package/skills/xcode-build-benchmark/references/benchmarking-workflow.md +67 -0
- package/skills/xcode-build-benchmark/schemas/build-benchmark.schema.json +230 -0
- package/skills/xcode-build-benchmark/scripts/benchmark_builds.py +308 -0
- package/skills/xcode-build-fixer/SKILL.md +218 -0
- package/skills/xcode-build-fixer/references/build-settings-best-practices.md +216 -0
- package/skills/xcode-build-fixer/references/fix-patterns.md +290 -0
- package/skills/xcode-build-fixer/references/recommendation-format.md +85 -0
- package/skills/xcode-build-fixer/scripts/benchmark_builds.py +308 -0
- package/skills/xcode-build-orchestrator/SKILL.md +156 -0
- package/skills/xcode-build-orchestrator/references/benchmark-artifacts.md +94 -0
- package/skills/xcode-build-orchestrator/references/build-settings-best-practices.md +216 -0
- package/skills/xcode-build-orchestrator/references/orchestration-report-template.md +143 -0
- package/skills/xcode-build-orchestrator/references/recommendation-format.md +85 -0
- package/skills/xcode-build-orchestrator/scripts/benchmark_builds.py +308 -0
- package/skills/xcode-build-orchestrator/scripts/diagnose_compilation.py +273 -0
- package/skills/xcode-build-orchestrator/scripts/generate_optimization_report.py +533 -0
- package/skills/xcode-compilation-analyzer/SKILL.md +89 -0
- package/skills/xcode-compilation-analyzer/references/build-optimization-sources.md +155 -0
- package/skills/xcode-compilation-analyzer/references/code-compilation-checks.md +106 -0
- package/skills/xcode-compilation-analyzer/references/recommendation-format.md +85 -0
- package/skills/xcode-compilation-analyzer/scripts/diagnose_compilation.py +273 -0
- package/skills/xcode-project-analyzer/SKILL.md +76 -0
- package/skills/xcode-project-analyzer/references/build-optimization-sources.md +155 -0
- package/skills/xcode-project-analyzer/references/build-settings-best-practices.md +216 -0
- package/skills/xcode-project-analyzer/references/project-audit-checks.md +101 -0
- package/skills/xcode-project-analyzer/references/recommendation-format.md +85 -0
- package/templates/project-identity/android.json +0 -10
- package/templates/project-identity/backend-nestjs.json +0 -10
- package/templates/project-identity/expo.json +0 -10
- package/templates/project-identity/ios.json +0 -10
- package/templates/project-identity/web-nextjs.json +0 -10
- package/workflows/_uncategorized/ship-to-code.md +85 -0
- package/workflows/context/codebase-sync.md +10 -87
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
import math
|
|
4
|
+
|
|
5
|
+
try:
|
|
6
|
+
from PIL import Image
|
|
7
|
+
except ImportError:
|
|
8
|
+
print("Error: Module 'Pillow' is not installed. Vui lòng chạy: pip install Pillow")
|
|
9
|
+
sys.exit(1)
|
|
10
|
+
|
|
11
|
+
def is_green_screen(r, g, b, tolerance=100):
|
|
12
|
+
"""
|
|
13
|
+
Thuật toán nhận biết màu nền xanh (green screen / chroma key).
|
|
14
|
+
Bản gốc màu lý tưởng: #00FF00 (0, 255, 0).
|
|
15
|
+
"""
|
|
16
|
+
dist = math.sqrt((r - 0)**2 + (g - 255)**2 + (b - 0)**2)
|
|
17
|
+
if dist < tolerance:
|
|
18
|
+
return True
|
|
19
|
+
if g > r + 40 and g > b + 40 and g > 130:
|
|
20
|
+
return True
|
|
21
|
+
return False
|
|
22
|
+
|
|
23
|
+
def align_grid(img, cols, rows):
|
|
24
|
+
width, height = img.size
|
|
25
|
+
orig_cell_w = width // cols
|
|
26
|
+
orig_cell_h = height // rows
|
|
27
|
+
|
|
28
|
+
frames = []
|
|
29
|
+
for r in range(rows):
|
|
30
|
+
for c in range(cols):
|
|
31
|
+
box = (c * orig_cell_w, r * orig_cell_h, c * orig_cell_w + orig_cell_w, r * orig_cell_h + orig_cell_h)
|
|
32
|
+
frames.append(img.crop(box))
|
|
33
|
+
|
|
34
|
+
contents = []
|
|
35
|
+
valid_w = []
|
|
36
|
+
valid_h = []
|
|
37
|
+
|
|
38
|
+
for frame in frames:
|
|
39
|
+
bbox = frame.getbbox()
|
|
40
|
+
if bbox:
|
|
41
|
+
content = frame.crop(bbox)
|
|
42
|
+
w = bbox[2] - bbox[0]
|
|
43
|
+
h = bbox[3] - bbox[1]
|
|
44
|
+
valid_w.append(w)
|
|
45
|
+
valid_h.append(h)
|
|
46
|
+
contents.append((content, w, h))
|
|
47
|
+
else:
|
|
48
|
+
contents.append(None)
|
|
49
|
+
|
|
50
|
+
if not valid_w:
|
|
51
|
+
return img
|
|
52
|
+
|
|
53
|
+
valid_w.sort()
|
|
54
|
+
valid_h.sort()
|
|
55
|
+
# Dùng median thay vì max để loại trừ khung bị lỗi do AI vẽ quá dài (outliers)
|
|
56
|
+
median_w = valid_w[len(valid_w) // 2]
|
|
57
|
+
median_h = valid_h[len(valid_h) // 2]
|
|
58
|
+
|
|
59
|
+
padding = 20
|
|
60
|
+
cell_w = median_w + padding * 2
|
|
61
|
+
cell_h = median_h + padding * 2
|
|
62
|
+
|
|
63
|
+
aligned_frames = []
|
|
64
|
+
for item in contents:
|
|
65
|
+
new_frame = Image.new("RGBA", (cell_w, cell_h), (0,0,0,0))
|
|
66
|
+
if item:
|
|
67
|
+
content, content_w, content_h = item
|
|
68
|
+
shift_x = (cell_w - content_w) // 2
|
|
69
|
+
shift_y = (cell_h - padding) - content_h
|
|
70
|
+
if shift_y < 0: shift_y = 0
|
|
71
|
+
new_frame.paste(content, (shift_x, shift_y))
|
|
72
|
+
aligned_frames.append(new_frame)
|
|
73
|
+
|
|
74
|
+
out_img = Image.new("RGBA", (cell_w * cols, cell_h * rows), (0,0,0,0))
|
|
75
|
+
for i, frame in enumerate(aligned_frames):
|
|
76
|
+
row = i // cols
|
|
77
|
+
col = i % cols
|
|
78
|
+
out_img.paste(frame, (col * cell_w, row * cell_h))
|
|
79
|
+
|
|
80
|
+
return out_img
|
|
81
|
+
|
|
82
|
+
def remove_green_screen(input_path, output_path, align_cols=0, align_rows=0):
|
|
83
|
+
print(f"[*] Bắt đầu đọc tệp ảnh: {input_path}")
|
|
84
|
+
try:
|
|
85
|
+
img = Image.open(input_path).convert("RGBA")
|
|
86
|
+
except Exception as e:
|
|
87
|
+
print(f"[!] Không thể mở file ảnh gốc: {e}")
|
|
88
|
+
sys.exit(1)
|
|
89
|
+
|
|
90
|
+
data = img.getdata()
|
|
91
|
+
new_data = []
|
|
92
|
+
|
|
93
|
+
# Lặp qua các mảng Pixels và lọc màu Chroma-key
|
|
94
|
+
for r, g, b, a in data:
|
|
95
|
+
if a > 0 and is_green_screen(r, g, b, tolerance=110):
|
|
96
|
+
# Các viền pixel ám xanh sẽ được hạ alpha xuống trong suốt tuyệt đối (0)
|
|
97
|
+
new_data.append((255, 255, 255, 0))
|
|
98
|
+
else:
|
|
99
|
+
new_data.append((r, g, b, a))
|
|
100
|
+
|
|
101
|
+
img.putdata(new_data)
|
|
102
|
+
|
|
103
|
+
# Căn chỉnh lưới (Auto-Align) hoặc cắt gọn (Auto-Crop)
|
|
104
|
+
if align_cols > 0 and align_rows > 0:
|
|
105
|
+
print(f"[*] Đang căn chỉnh tự động các frame theo lưới {align_cols}x{align_rows} (đáy chạm đất, giữa tâm)...")
|
|
106
|
+
img = align_grid(img, align_cols, align_rows)
|
|
107
|
+
else:
|
|
108
|
+
bbox = img.getbbox()
|
|
109
|
+
if bbox:
|
|
110
|
+
img = img.crop(bbox)
|
|
111
|
+
|
|
112
|
+
# Tạo cấu trúc thư mục nếu chưa tồn tại
|
|
113
|
+
os.makedirs(os.path.dirname(os.path.abspath(output_path)), exist_ok=True)
|
|
114
|
+
img.save(output_path, "PNG")
|
|
115
|
+
print(f"[*] Thành công! Đã xoá nền và lưu Sprite thành phẩm tại: {output_path}")
|
|
116
|
+
|
|
117
|
+
if __name__ == "__main__":
|
|
118
|
+
if len(sys.argv) < 3:
|
|
119
|
+
print("Cú pháp: python process_sprites.py <file_raw.png> <file_output.png> [--align CxR]")
|
|
120
|
+
sys.exit(1)
|
|
121
|
+
|
|
122
|
+
input_file = sys.argv[1]
|
|
123
|
+
output_file = sys.argv[2]
|
|
124
|
+
|
|
125
|
+
align_c = 0
|
|
126
|
+
align_r = 0
|
|
127
|
+
|
|
128
|
+
if len(sys.argv) >= 5 and sys.argv[3] == "--align":
|
|
129
|
+
try:
|
|
130
|
+
dims = sys.argv[4].lower().split('x')
|
|
131
|
+
align_c = int(dims[0])
|
|
132
|
+
align_r = int(dims[1])
|
|
133
|
+
except:
|
|
134
|
+
print("[!] Lỗi tham số --align. Ví dụ đúng: --align 3x2")
|
|
135
|
+
|
|
136
|
+
if not os.path.exists(input_file):
|
|
137
|
+
print(f"[!] Lỗi: Không tìm thấy đường dẫn file ảnh gốc! ({input_file})")
|
|
138
|
+
sys.exit(1)
|
|
139
|
+
|
|
140
|
+
remove_green_screen(input_file, output_file, align_c, align_r)
|
|
@@ -24,47 +24,35 @@ Review early, review often. Catch issues before they cascade.
|
|
|
24
24
|
- Before refactoring (baseline check)
|
|
25
25
|
- After fixing complex bug
|
|
26
26
|
|
|
27
|
-
## The Review Process
|
|
27
|
+
## The Review Process (Execution via Codex CLI)
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
Thay vì tự đọc diff và đánh giá, Antigravity **BẮT BUỘC** gọi `codex` CLI để thực hiện Code Review nhằm mở rộng Context Window và sử dụng subagent chuyên dụng.
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
Có 3 chế độ review chính tùy theo bối cảnh:
|
|
32
32
|
|
|
33
|
+
### 1. Review Toàn Bộ Codebase (Full Review)
|
|
34
|
+
Sử dụng khi cần đánh giá tổng thể dự án, review architecture, security, hoặc chuẩn bị big release.
|
|
33
35
|
```bash
|
|
34
|
-
|
|
35
|
-
git diff main..HEAD --stat
|
|
36
|
-
git log main..HEAD --oneline
|
|
37
|
-
|
|
38
|
-
# OR for specific task
|
|
39
|
-
git diff HEAD~1..HEAD --stat
|
|
36
|
+
codex -p "Review toàn bộ codebase. Tập trung kiểm tra tính nhất quán kiến trúc (architecture), rủi ro bảo mật (security) và hiệu suất (performance)." --approval-mode auto
|
|
40
37
|
```
|
|
41
38
|
|
|
42
|
-
###
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|-------|-------------|---------|
|
|
48
|
-
| **WHAT** | What was implemented | "Water reminder notification system" |
|
|
49
|
-
| **SPEC** | What it should do | "Send notification every 2h between 8am-10pm" |
|
|
50
|
-
| **FILES** | Changed files | `WaterReminderManager.swift`, `NotificationService.swift` |
|
|
51
|
-
| **SCOPE** | Review focus | "Logic correctness + thread safety" |
|
|
52
|
-
|
|
53
|
-
### Step 3: Classify Findings
|
|
54
|
-
|
|
55
|
-
| Severity | Action | Example |
|
|
56
|
-
|----------|--------|---------|
|
|
57
|
-
| 🔴 **Critical** | BLOCK — fix immediately | Thread-unsafe shared state, data loss risk |
|
|
58
|
-
| 🟡 **Important** | Fix before proceeding | Missing error handling, incomplete validation |
|
|
59
|
-
| 🟢 **Minor** | Note for later | Naming convention, code style preference |
|
|
60
|
-
| ℹ️ **Suggestion** | Consider but optional | Performance optimization, alternative approach |
|
|
39
|
+
### 2. Review Những Thay Đổi (Changes / Diff Review)
|
|
40
|
+
Sử dụng khi vừa hoàn thành xong code một tính năng hoặc fix bug (các thay đổi workspace, stashed, unstaged, hoặc dải diff ngắn).
|
|
41
|
+
```bash
|
|
42
|
+
codex -p "Review những thay đổi hiện tại (git diff/staged). Tập trung kiểm tra logic, edge cases và conventions." --approval-mode auto
|
|
43
|
+
```
|
|
61
44
|
|
|
62
|
-
###
|
|
45
|
+
### 3. Review Commit Cụ Thể (Specific Commit)
|
|
46
|
+
Sử dụng khi cần review một nhánh git, PR, hoặc một commit hash cụ thể.
|
|
47
|
+
```bash
|
|
48
|
+
codex -p "Review commit <commit_hash> (hoặc range main..HEAD). Tập trung đánh giá xem code có giải quyết đúng vấn đề và compliance với Spec không." --approval-mode auto
|
|
49
|
+
```
|
|
63
50
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
51
|
+
### Cách Xử Lý Output Từ Codex
|
|
52
|
+
1. Fix 🔴 **Critical** issues NGAY LẬP TỨC.
|
|
53
|
+
2. Fix 🟡 **Important** issues trước khi kết thúc task hoặc chuyển sang Phase mới.
|
|
54
|
+
3. Log 🟢 **Minor** issues để cấu trúc lại sau.
|
|
55
|
+
4. Proceed nếu Subagent Codex báo "LGTM" hoặc không có issue nào nghiêm trọng.
|
|
68
56
|
|
|
69
57
|
## Two-Stage Review (Subagent-Driven)
|
|
70
58
|
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lucylab-tts
|
|
3
|
+
description: |
|
|
4
|
+
Công cụ tạo Text-to-Speech (TTS) sử dụng API của LucyLab với nhiều giọng đọc khác nhau.
|
|
5
|
+
Hỗ trợ tạo giọng đọc từ kịch bản có sẵn, quản lý voice library và xuất file âm thanh chất lượng cao.
|
|
6
|
+
metadata:
|
|
7
|
+
stage: workflow
|
|
8
|
+
version: "1.0"
|
|
9
|
+
requires: "python3, requests"
|
|
10
|
+
tags: [tts, lucylab, voice, audio, text-to-speech]
|
|
11
|
+
trigger: explicit
|
|
12
|
+
activation_keywords:
|
|
13
|
+
- "/lucylab"
|
|
14
|
+
- "/tts"
|
|
15
|
+
- "chuyển văn bản thành giọng nói"
|
|
16
|
+
- "tạo giọng đọc"
|
|
17
|
+
- "đọc script"
|
|
18
|
+
- "tạo tts"
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# 🎙️ LucyLab TTS (Text-to-Speech Generator)
|
|
22
|
+
|
|
23
|
+
> **Mục tiêu**: Tự động hóa quá trình tạo giọng đọc (Voiceover) từ văn bản hoặc kịch bản phân cảnh (Scenes) bằng API của LucyLab, hỗ trợ nhiều giọng đọc vùng miền và giới tính khác nhau. Được tách ra thành skill độc lập để dễ dàng gọi từ các workflow khác (ví dụ: short-maker).
|
|
24
|
+
|
|
25
|
+
## 📡 Chế độ hoạt động (Triggers)
|
|
26
|
+
|
|
27
|
+
- **Plain Text Mode**: Nhập một đoạn văn bản (text), Tool sẽ dùng một giọng mặc định để đọc toàn bộ.
|
|
28
|
+
- **Script Scenes Mode**: Nhập kịch bản phân cảnh (SCENE 1, SCENE 2,...). Tool sẽ tự động phân tách từng câu thoại của mỗi cảnh và gọi LucyLab API để tạo các file lẻ. Rất phù hợp với quá trình tạo video tự động (Short Maker).
|
|
29
|
+
|
|
30
|
+
## 🧱 Quy trình hoạt động (Mandatory Flow)
|
|
31
|
+
|
|
32
|
+
0. **Giai đoạn Setup (Authentication)**: AI CẦN PHẢI KIỂM TRA QUYỀN TRUY CẬP TRƯỚC TIÊN:
|
|
33
|
+
- Quét file `.env` (tại thư mục làm việc hiện tại hoặc `~/.gemini/antigravity/.env`) tìm `LUCYLAB_BEARER`. Nếu KHÔNG TỒN TẠI, AI phải yêu cầu người dùng cung cấp API Key của LucyLab để lưu vào `.env`. Tuyệt đối không được chạy script trực tiếp để tránh lỗi do thiếu Authorization.
|
|
34
|
+
1. **Chuẩn bị Kịch bản**: Kịch bản cần được đưa vào file text (ví dụ: `script.txt`) chứa thoại, hoặc truyền trực tiếp chữ thông qua `--text`.
|
|
35
|
+
2. **Chọn Giọng đọc**: Dựa trên danh sách giọng trong `~/.gemini/antigravity/skills/lucylab-tts/resources/voices_library.json` hoặc truyền trực tiếp `--voice <id>`. Có các template phân nhóm: Nam/Nữ, miền Bắc/Nam.
|
|
36
|
+
3. **Thực thi Tạo Audio**:
|
|
37
|
+
- Tool kích hoạt script Python nằm trong: `~/.gemini/antigravity/skills/lucylab-tts/scripts/lucylab_tts.py`.
|
|
38
|
+
- Tool tự động lấy `LUCYLAB_BEARER` từ `.env` (hỗ trợ .env cục bộ hoặc ~/.gemini/antigravity/.env).
|
|
39
|
+
4. **Hậu kiểm Output**:
|
|
40
|
+
- Files MP3/WAV sẽ được lưu vào thư mục định sẵn (mặc định `outputs/tts-lucylab/<voice-slug>/`) với các file như `scene-01.mp3`, `scene-02.mp3`...
|
|
41
|
+
- Sẵn sàng dùng kết hợp với FFmpeg để ráp vào video.
|
|
42
|
+
|
|
43
|
+
## 💻 Cấu trúc lệnh (CLI Reference)
|
|
44
|
+
|
|
45
|
+
Để gọi engine TTS, bạn có thể thực thi lệnh thông qua bash:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# Đọc một đoạn text đơn giản (không chia cảnh)
|
|
49
|
+
python ~/.gemini/antigravity/skills/lucylab-tts/scripts/lucylab_tts.py \
|
|
50
|
+
--text "Chào mừng bạn đến với hệ thống." \
|
|
51
|
+
--voice "12345:Giọng chuẩn" \
|
|
52
|
+
--mode plain \
|
|
53
|
+
--out-dir "outputs/sample"
|
|
54
|
+
|
|
55
|
+
# Đọc từ kịch bản chia cảnh, chọn nhiều giọng từ thư viện
|
|
56
|
+
python ~/.gemini/antigravity/skills/lucylab-tts/scripts/lucylab_tts.py \
|
|
57
|
+
--text-file "script.txt" \
|
|
58
|
+
--mode auto \
|
|
59
|
+
--voice-json "/Users/trungkientn/.gemini/antigravity/skills/lucylab-tts/resources/voices_library.json" \
|
|
60
|
+
--voices "Nam miền Bắc" \
|
|
61
|
+
--out-dir "outputs/tts"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
> ⚠️ **Lưu ý**: Chắc chắn rằng biến môi trường `LUCYLAB_BEARER` đã được cấu hình trong dự án hiện tại (`.env`) hoặc `~/.gemini/antigravity/skills/lucylab-tts/scripts/.env` để được phép Authentication.
|