humanizer-th 0.0.0-stage → 0.5.0

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.
Files changed (34) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +176 -0
  3. package/README.md +227 -2
  4. package/bin/cli.js +123 -0
  5. package/package.json +33 -4
  6. package/skills/humanizer-th/SKILL.md +254 -0
  7. package/skills/humanizer-th/agents/openai.yaml +4 -0
  8. package/skills/humanizer-th/references/patterns.md +574 -0
  9. package/skills/humanizer-th/references/registers.md +127 -0
  10. package/skills/humanizer-th/references/style.md +102 -0
  11. package/skills/humanizer-th/references/word-swaps.md +206 -0
  12. package/skills/localize-th/SKILL.md +213 -0
  13. package/skills/localize-th/agents/openai.yaml +4 -0
  14. package/skills/localize-th/references/characters.md +89 -0
  15. package/skills/localize-th/references/formats.md +154 -0
  16. package/skills/localize-th/references/games.md +74 -0
  17. package/skills/localize-th/references/glossary.md +168 -0
  18. package/skills/localize-th/references/patterns.md +574 -0
  19. package/skills/localize-th/references/registers.md +127 -0
  20. package/skills/localize-th/references/style.md +102 -0
  21. package/skills/localize-th/references/subtitles.md +110 -0
  22. package/skills/localize-th/references/translation.md +255 -0
  23. package/skills/localize-th/references/ui.md +117 -0
  24. package/skills/localize-th/references/word-swaps.md +206 -0
  25. package/skills/localize-th/scripts/check_translation.py +484 -0
  26. package/skills/script-th/SKILL.md +162 -0
  27. package/skills/script-th/agents/openai.yaml +4 -0
  28. package/skills/script-th/references/characters.md +89 -0
  29. package/skills/script-th/references/dialogue.md +236 -0
  30. package/skills/script-th/references/patterns.md +574 -0
  31. package/skills/script-th/references/registers.md +127 -0
  32. package/skills/script-th/references/style.md +102 -0
  33. package/skills/script-th/references/video-prompts.md +103 -0
  34. package/skills/script-th/references/voice.md +107 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 inatbalthazar
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.en.md ADDED
@@ -0,0 +1,176 @@
1
+ # humanizer-th
2
+
3
+ ![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg) ![version](https://img.shields.io/badge/version-0.5.0-green.svg)
4
+
5
+ A set of Thai-language [Agent Skills](https://agentskills.io). Translate subtitles, games, apps and websites into Thai that doesn't read like a translation, write and polish dialogue for AI-generated short dramas and Thai AI voice-over, and edit AI-written Thai so it reads like a native writer wrote it.
6
+
7
+ Works with Claude, ChatGPT, Gemini, Codex, GitHub Copilot, Cursor and any tool that supports Agent Skills. Tools without skill support can use a single bundled prompt file instead.
8
+
9
+ [อ่านภาษาไทย](README.md)
10
+
11
+ ## The skills
12
+
13
+ | Skill | What it does | Example request |
14
+ |---|---|---|
15
+ | **localize-th** | English to Thai for subtitles, dubbing scripts, app and website strings, and games | "แปลซับนี้เป็นไทย" / "Translate this strings file into Thai" |
16
+ | **script-th** | Writes and polishes Thai dialogue for AI short dramas, per-shot video prompts, and TTS-ready voice scripts | "เขียนบทละครสั้นเรื่อง..." / "Polish this script" |
17
+ | **humanizer-th** | Edits AI-written Thai posts, emails and chat messages, and writes in the user's own voice from samples of their past writing | "เกลาให้หน่อย" / "เขียนให้เหมือนที่เราเขียน" |
18
+
19
+ Install once and the agent picks the right skill for each request.
20
+
21
+ ```bash
22
+ npx humanizer-th
23
+ ```
24
+
25
+ No terminal, or using ChatGPT or Gemini? See [Install](#install).
26
+
27
+ ## If you don't read Thai
28
+
29
+ - **Ask in English.** The Thai output stays Thai, and everything that explains it (translation notes, change summaries, questions) comes back in English. Thai words quoted in the notes get their meaning in brackets.
30
+ - **Back-translations.** For short jobs, up to about 30 lines, subtitle blocks or strings, the agent adds a table that says in plain English what the Thai actually says, so you can check the meaning. For longer files, ask for one. Back-translations never go into the translated file.
31
+ - **Example:** [game menu strings for a developer who doesn't read Thai](examples/localize-th/04-english-speaker.md).
32
+ - **Still get a native review.** Have a Thai speaker read anything you publish.
33
+
34
+ ## localize-th: subtitles, games, apps and websites
35
+
36
+ | Source | Typical machine translation | localize-th |
37
+ |---|---|---|
38
+ | Oh no. (subtitle) | โอ้ไม่ ("oh no", literal) | ซวยแล้ว ("I'm in trouble") |
39
+ | Payment failed. (app) | การชำระเงินล้มเหลว ("the payment has failed") | ชำระเงินไม่สำเร็จ ("payment didn't go through") |
40
+ | Your cart (app) | ตะกร้าของคุณ ("your cart") | ตะกร้า ("cart"; Thai UI drops "your") |
41
+ | No haggling, my back can't take it. (game) | literal joke that falls flat | ห้ามต่อนะ ข้าแก่แล้ว เถียงไม่ไหว ("no haggling, I'm too old to argue") |
42
+
43
+ - **Files stay valid:** subtitle timings and block numbers, keys, placeholders (`{name}`, `%s`, `[PlayerName]`, ICU plurals) and tags are kept exactly.
44
+ - **Readable subtitles:** at most 35 characters per line, 2 lines, about 20 characters per second, line breaks on word boundaries (Thai has no spaces between words). The defaults follow Netflix's Thai timed-text guide and can be overridden.
45
+ - **Characters sound like people:** pronouns and particles are chosen per relationship and kept consistent. English "I" and "you" have a dozen Thai equivalents.
46
+ - **Consistent terms:** follows your glossary, or a built-in glossary of standard Thai UI and game terms with Royal Institute spellings.
47
+ - **Checker script:** `skills/localize-th/scripts/check_translation.py` compares a translation with its source (SRT, VTT, ASS, JSON, ARB, PO, XLIFF, `.strings`, Android XML, CSV) and reports broken timings, missing keys or placeholders, long lines and reading speed. Agents that can run commands run it themselves.
48
+
49
+ ```bash
50
+ python3 skills/localize-th/scripts/check_translation.py en.srt th.srt
51
+ ```
52
+
53
+ Examples: [SRT subtitles](examples/localize-th/01-subtitle-srt.md), [app JSON](examples/localize-th/02-app-ui-json.md), [game CSV](examples/localize-th/03-game-dialogue-csv.md), [for a developer who doesn't read Thai](examples/localize-th/04-english-speaker.md).
54
+
55
+ ## script-th: AI short dramas and Thai voice-over
56
+
57
+ Four modes: write a script from an idea, polish an existing script without changing the story, turn it into per-shot prompts for AI video tools, and prepare a voice script that Thai TTS reads correctly (numbers as words, unambiguous spellings, pauses and voice direction).
58
+
59
+ - Character sheets with fixed English visual descriptions, copied verbatim into every shot prompt for consistency.
60
+ - Lines sized to the clip length using a syllable estimate, with long lines split across shots.
61
+ - Twelve AI-dialogue tells (SC01–SC12), such as characters naming their feelings, exposition dumps, stock lines from short dramas and everyone sounding the same.
62
+ - Three ways to add Thai speech (native audio from the video model, separate TTS with lip-sync, or narration and subtitles), because many video models still speak Thai poorly.
63
+
64
+ Examples: [write from an idea](examples/script-th/01-write-short-drama.md), [polish an AI script](examples/script-th/02-polish-ai-script.md), [shot prompts and voice script](examples/script-th/03-shot-prompts-and-voice.md).
65
+
66
+ ## humanizer-th: AI-written Thai
67
+
68
+ Four modes (ตรวจ check, เขียนใหม่ rewrite, แก้เฉพาะจุด fix spots, เลียนสไตล์ match style) across the four registers taught in Thai schools: กันเอง (intimate), ไม่เป็นทางการ (informal), กึ่งทางการ (semi-formal) and ทางการ (formal). It checks 29 patterns (TH01–TH29), most of which Thai grammar classes call ประโยคฟุ่มเฟือย (redundant sentences) and สำนวนต่างประเทศ (foreign-style phrasing). See [patterns.md](shared/patterns.md) and [examples/humanizer-th/](examples/humanizer-th/).
69
+
70
+ ### Writing in your own voice (เลียนสไตล์)
71
+
72
+ Natural Thai is not the same as your Thai. Send three or more pieces you wrote yourself, plus an AI draft or just a brief, and the skill builds a style profile: what you call yourself, where you put `ครับ`/`ค่ะ`, how often you break lines, how you open and close, how you write times and prices. It then writes the new text that way.
73
+
74
+ - Content comes only from the draft or brief. Nothing is lifted from the samples, and nothing is invented to fit the style; the skill asks instead.
75
+ - It copies habits only as often as they appear in the samples, never copies misspellings, and never copies translationese like `ได้ทำการ` even if the writer uses it.
76
+ - The profile can be saved and pasted next time instead of the samples.
77
+ - The same profile method works in `localize-th` (continue a translation in the style of earlier episodes or app versions) and `script-th` (write a new episode in the style of earlier ones).
78
+
79
+ Full example with the profile: [examples/humanizer-th/07-match-style.md](examples/humanizer-th/07-match-style.md).
80
+
81
+ ### Why English humanizers don't work for Thai
82
+
83
+ - **Grammar:** Thai has no tense or articles, drops subjects freely, and marks politeness with particles. Translated Thai shows up as `ได้ทำการ`, `ถูก...โดย` (passive) and `ซึ่ง...ซึ่ง...` chains, not as "delve" or "tapestry".
84
+ - **Register:** readers notice the wrong register immediately, such as government-letter Thai in a LINE message.
85
+ - **Particles and pronouns:** `ครับ`/`ค่ะ` carry the writer's gender. Putting one on every sentence, or mixing them, is a tell, and so is overusing `คุณ` ("you").
86
+ - **Punctuation:** Thai separates phrases with spaces, not commas and full stops. English punctuation, emoji and "!" are tells.
87
+
88
+ **None of the skills change** facts, numbers, dates, names, brands, links, code or the writer's `ครับ`/`ค่ะ`, and none add information that isn't in the source.
89
+
90
+ ## Install
91
+
92
+ ### One command
93
+
94
+ Open Terminal (Mac) or PowerShell (Windows) and run
95
+
96
+ ```bash
97
+ npx humanizer-th
98
+ ```
99
+
100
+ It installs all three skills for Claude Code, Codex, Gemini CLI and GitHub Copilot, whichever you have. Restart your tool once, then just ask.
101
+
102
+ - Needs Node.js 18 or later, from [nodejs.org](https://nodejs.org). Most Claude Code and Codex users already have it.
103
+ - If it asks `Ok to proceed?`, press `y`.
104
+ - Update with `npx humanizer-th@latest`, remove with `npx humanizer-th uninstall`, pick one skill with `--skill localize-th`, or install into the current project only with `--project`.
105
+
106
+ ### Without a terminal
107
+
108
+ **Claude.ai and Claude Desktop:** download the zip for each skill you want from [Releases](https://github.com/inatbalthazar/humanizer-th/releases/latest) (`localize-th.zip`, `script-th.zip`, `humanizer-th.zip`) and upload them one at a time under Settings → Capabilities → Skills.
109
+
110
+ **ChatGPT, Gemini and other AI tools:** download the bundled prompt for each skill from [Releases](https://github.com/inatbalthazar/humanizer-th/releases/latest) (`localize-th-prompt.md`, `script-th-prompt.md`, `humanizer-th-prompt.md`):
111
+
112
+ - **ChatGPT:** one GPT per skill. Upload the file under Knowledge and set Instructions to "Follow every instruction in [file name]." (Instructions is capped at 8,000 characters, too short for the whole file).
113
+ - **Gemini:** create a Gem and paste the whole file into its instructions, or attach it.
114
+ - **API:** use the whole file as the system prompt.
115
+ - **Any chat:** attach the file and ask the model to follow it.
116
+
117
+ The bundles are 59,000 to 94,000 characters. Thai uses more tokens than English, so sending one on every API call adds up.
118
+
119
+ <details>
120
+ <summary><strong>Other ways</strong> (Claude Code plugin, Skills CLI, no Node.js, manual)</summary>
121
+
122
+ **Claude Code plugin:** run inside Claude Code
123
+
124
+ ```text
125
+ /plugin marketplace add inatbalthazar/humanizer-th
126
+ /plugin install humanizer-th@humanizer-th
127
+ ```
128
+
129
+ **Skills CLI:** installs for every agent the [Skills CLI](https://github.com/vercel-labs/skills) supports, including Cursor and Windsurf
130
+
131
+ ```bash
132
+ npx skills add inatbalthazar/humanizer-th --global --agent '*'
133
+ ```
134
+
135
+ **No Node.js (macOS or Linux):**
136
+
137
+ ```bash
138
+ curl -fsSL https://raw.githubusercontent.com/inatbalthazar/humanizer-th/main/install.sh | bash
139
+ ```
140
+
141
+ Use `| bash -s -- --skill localize-th` for one skill and `| bash -s -- --uninstall` to remove them.
142
+
143
+ **Manual:** copy the folders in `skills/` into the agent's skills folder
144
+
145
+ | Tool | All projects | One project |
146
+ |---|---|---|
147
+ | Claude Code | `~/.claude/skills/` | `.claude/skills/` |
148
+ | Codex CLI | `~/.agents/skills/` | `.agents/skills/` |
149
+ | Gemini CLI | `~/.gemini/skills/` | `.gemini/skills/` |
150
+ | GitHub Copilot in VS Code | `~/.copilot/skills/` | `.github/skills/` |
151
+
152
+ Agents not in the table mostly read `.agents/skills/`. To build the zips and prompt bundles from source, run `bash scripts/build.sh`; output goes to `dist/`.
153
+
154
+ </details>
155
+
156
+ ## What this is not
157
+
158
+ - **Not an AI-detector evasion tool.** The goal is text that is easier for Thai readers, and the skills never insert deliberate mistakes.
159
+ - **No writing as someone else.** Style matching is for your own writing, or ghostwriting the person knows about (a page admin posting for the shop owner). It won't fake messages from other people.
160
+ - **No scripts that put words in real people's mouths** for AI video, unless the user is that person or has permission, and no deceptive content such as fake news or scam clips.
161
+ - **English source only** for translation for now.
162
+
163
+ ## Limitations
164
+
165
+ - The skills are guidance the model follows, not deterministic programs. Review the output, and have a native Thai reader check translations before publishing.
166
+ - Tested in depth with Claude only. Results with other models depend on how well they handle Thai.
167
+ - Shot prompts and voice scripts have not yet been run through real video and TTS tools. The syllables-per-second figure is an estimate to calibrate on the first shot. See [tests/manual-test-v0.3.md](tests/manual-test-v0.3.md).
168
+ - Style matching has been tested on one made-up set of samples, not yet on real writers' work. See [tests/manual-test-v0.4.md](tests/manual-test-v0.4.md).
169
+
170
+ ## Contributing
171
+
172
+ See [CONTRIBUTING.md](CONTRIBUTING.md).
173
+
174
+ ## License
175
+
176
+ [MIT](LICENSE)
package/README.md CHANGED
@@ -1,3 +1,228 @@
1
- # Temporary Holding Version
1
+ # humanizer-th
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ ![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg) ![version](https://img.shields.io/badge/version-0.5.0-green.svg)
4
+
5
+ ชุด skill ภาษาไทยสำหรับ AI แปลซับหนัง เกม แอป และเว็บไซต์เป็นภาษาไทยที่อ่านแล้วไม่รู้ว่าแปลมา เขียนบทละครสั้นและบทพากย์สำหรับวิดีโอ AI และเกลาข้อความที่ AI เขียนให้อ่านเหมือนคนไทยเขียนเอง
6
+
7
+ ใช้ได้กับ Claude, ChatGPT, Gemini, Codex, GitHub Copilot, Cursor และ AI ตัวอื่นที่รองรับ [Agent Skills](https://agentskills.io) ตัวที่ไม่รองรับก็ใช้ได้ โดยวางไฟล์รวมเป็นคำสั่งแทน
8
+
9
+ [English](README.en.md)
10
+
11
+ ## มีอะไรบ้าง
12
+
13
+ | skill | ใช้ทำอะไร | พิมพ์ประมาณนี้ |
14
+ |---|---|---|
15
+ | **localize-th** | แปลภาษาอังกฤษเป็นไทย ทั้งซับไตเติล บทพากย์ ข้อความในแอปและเว็บไซต์ และเกม | "แปลซับนี้เป็นไทย" "แปลไฟล์ภาษาของแอปนี้" |
16
+ | **script-th** | เขียนและเกลาบทละครสั้นที่สร้างด้วย AI ทำพรอมต์ทีละช็อต และเตรียมบทให้ AI พากย์เสียงไทย | "เขียนบทละครสั้นเรื่อง..." "เกลาบทนี้ให้หน่อย" |
17
+ | **humanizer-th** | เกลาข้อความไทยที่ AI เขียน เช่น โพสต์ อีเมล ข้อความ LINE และเขียนให้เป็นสำนวนของเราเองจากงานเก่าที่ส่งให้ดู | "เกลาให้หน่อย" "เขียนให้เหมือนที่เราเขียน" |
18
+
19
+ ติดตั้งครั้งเดียวได้ทั้งสามตัว AI จะเลือกใช้ตัวที่ตรงกับคำสั่งเอง
20
+
21
+ ```bash
22
+ npx humanizer-th
23
+ ```
24
+
25
+ ไม่ใช้ terminal หรือใช้ ChatGPT กับ Gemini ดูหัวข้อ[ติดตั้ง](#ติดตั้ง)
26
+
27
+ **ผู้ใช้ที่อ่านไทยไม่ออก** สั่งเป็นภาษาอังกฤษได้ งานที่ได้ยังเป็นภาษาไทย แต่บันทึกและคำอธิบายจะเป็นภาษาอังกฤษ งานสั้นจะมีคำแปลกลับเป็นภาษาอังกฤษให้ตรวจความหมายด้วย เหมาะกับบริษัทเกมและแอปต่างชาติที่จะออกเวอร์ชันไทย ดู[ตัวอย่าง](examples/localize-th/04-english-speaker.md) และ [README ภาษาอังกฤษ](README.en.md)
28
+
29
+ ## แปลซับ เกม แอป และเว็บไซต์ (localize-th)
30
+
31
+ งานแปลส่วนใหญ่ที่ได้จาก AI ถูกทุกคำแต่คนไทยอ่านแล้วรู้ทันทีว่าแปลมา และบางครั้งทำไฟล์พังด้วย เช่น เวลาในซับเลื่อน หรือตัวแปรในแอปหาย
32
+
33
+ | ต้นฉบับ | แปลแบบทั่วไป | localize-th |
34
+ |---|---|---|
35
+ | Oh no. (ซับ) | โอ้ไม่ | ซวยแล้ว |
36
+ | What do you think? (ซับ) | คุณคิดว่าอย่างไร | คิดว่าไงล่ะ |
37
+ | Payment failed. (แอป) | การชำระเงินล้มเหลว | ชำระเงินไม่สำเร็จ |
38
+ | Your cart (แอป) | ตะกร้าของคุณ | ตะกร้า |
39
+ | No haggling, my back can't take it. (เกม) | ห้ามต่อรอง หลังของฉันรับไม่ไหว | ห้ามต่อนะ ข้าแก่แล้ว เถียงไม่ไหว |
40
+
41
+ **สิ่งที่ skill คุมให้**
42
+
43
+ - **ไฟล์ไม่พัง:** เวลาและเลขบล็อกในซับ key ตัวแปรอย่าง `{name}` `%s` `[PlayerName]` และแท็กต่างๆ อยู่ครบเหมือนต้นฉบับ
44
+ - **ซับอ่านทัน:** บรรทัดละไม่เกิน 35 ตัวอักษร ไม่เกิน 2 บรรทัด ความเร็วการอ่านไม่เกิน 20 ตัวอักษรต่อวินาที และตัดบรรทัดที่ขอบคำ ตามแนวทางซับไทยของ Netflix เปลี่ยนตัวเลขได้ถ้ามี style guide ของตัวเอง
45
+ - **ตัวละครพูดเหมือนคน:** เลือกสรรพนามและคำลงท้ายตามความสัมพันธ์ เช่น พี่น้องใช้ "พี่" กับ "แก" เกมแฟนตาซีใช้ "ข้า" กับ "เจ้า" และใช้แบบเดียวกันตลอดเรื่อง
46
+ - **ศัพท์ตรงกันทั้งงาน:** ใช้อภิธานศัพท์ของผู้ใช้ ถ้าไม่มีก็ใช้คำมาตรฐานที่คนไทยเห็นในแอปทั่วไป และสะกดคำทับศัพท์ตามราชบัณฑิตยสถาน
47
+ - **บทพากย์:** ความยาวที่พูดใกล้ต้นฉบับ และเขียนให้อ่านออกเสียงได้ทันที
48
+
49
+ **ไฟล์ที่รองรับ:** SRT, VTT, ASS, JSON, ARB, PO, XLIFF, iOS `.strings` `.stringsdict` `.xcstrings`, Android `strings.xml`, YAML, CSV และข้อความที่วางมาในแชต
50
+
51
+ **ตรวจไฟล์ด้วยสคริปต์:** ใน skill มี `check_translation.py` เทียบไฟล์ที่แปลกับต้นฉบับ แจ้งเวลาที่เปลี่ยน key หรือตัวแปรที่หาย บรรทัดซับที่ยาวเกิน และความเร็วการอ่านที่เกิน AI ที่รันคำสั่งได้ (เช่น Claude Code, Codex) จะรันให้เอง หรือจะรันเองก็ได้
52
+
53
+ ```bash
54
+ python3 skills/localize-th/scripts/check_translation.py en.srt th.srt
55
+ ```
56
+
57
+ ตัวอย่างเต็ม: [ซับ SRT](examples/localize-th/01-subtitle-srt.md) / [แอป JSON](examples/localize-th/02-app-ui-json.md) / [เกม CSV](examples/localize-th/03-game-dialogue-csv.md) / [เมนูเกมสำหรับคนที่อ่านไทยไม่ออก](examples/localize-th/04-english-speaker.md)
58
+
59
+ ## บทละครสั้น AI และบทพากย์ (script-th)
60
+
61
+ ใช้กับละครสั้นแนวตั้งที่สร้างด้วยเว็บสร้างวิดีโอ AI และงานที่ให้ AI พากย์เสียงไทย
62
+
63
+ **ก่อน** (บทที่ AI เขียน)
64
+
65
+ ```text
66
+ นิว: ต้น ฉันรู้สึกผิดหวังและเสียใจมากที่คุณโกหกฉันเรื่องที่คุณไปเชียงใหม่
67
+ ต้น: นิว ผมขอโทษครับ ผมไม่ได้มีเจตนาที่จะทำให้คุณรู้สึกแย่ ซึ่งผมมีเหตุผลที่ผมไม่สามารถบอกคุณได้ในตอนนี้ครับ
68
+ ```
69
+
70
+ **หลัง**
71
+
72
+ ```text
73
+ นิว: เชียงใหม่สนุกมั้ย
74
+ ต้น: (ชะงัก) ขอโทษ มีเหตุผลจริงๆ แต่ตอนนี้ยังบอกไม่ได้
75
+ ```
76
+
77
+ **สั่งได้ 4 แบบ**
78
+
79
+ | แบบ | ได้อะไร |
80
+ |---|---|
81
+ | เขียนบท | ตารางตัวละคร บทแบ่งฉาก เปิดเรื่องให้ดึงคนดูใน 3 วินาที จบตอนแบบค้างให้อยากดูต่อ |
82
+ | เกลาบท | บทเดิมที่พูดเหมือนคนจริงขึ้น เรื่องและข้อมูลไม่เปลี่ยน |
83
+ | ทำพรอมต์ | พรอมต์ทีละช็อตที่คัดลอกไปวางได้ทันที บทพูดยาวพอดีคลิป หน้าตาตัวละครเหมือนกันทุกช็อต |
84
+ | เตรียมบทพากย์ | บทที่เสียง AI อ่านถูก ตัวเลขเขียนเป็นคำ คำอ่านยากเขียนตามเสียง มีทิศทางเสียงทุกบรรทัด |
85
+
86
+ skill จะถามว่าจะใส่เสียงแบบไหน ให้โมเดลวิดีโอพูดเอง ใช้เสียง AI แยกแล้วทำลิปซิงก์ หรือใช้เสียงบรรยายกับซับ เพราะเว็บสร้างวิดีโอหลายตัวยังพูดภาษาไทยได้ไม่ดี
87
+
88
+ ตัวอย่างเต็ม: [เขียนบทจากไอเดีย](examples/script-th/01-write-short-drama.md) / [เกลาบทที่ AI เขียน](examples/script-th/02-polish-ai-script.md) / [พรอมต์และบทพากย์](examples/script-th/03-shot-prompts-and-voice.md)
89
+
90
+ ## เกลาข้อความที่ AI เขียน (humanizer-th)
91
+
92
+ ข้อความ LINE ขอให้รุ่นพี่ที่ทำงานเข้ากะแทน
93
+
94
+ **ก่อน**
95
+
96
+ > สวัสดีครับพี่เมย์ ผมหวังว่าพี่จะสบายดีนะครับ ผมต้องการที่จะขอความช่วยเหลือจากพี่ในเรื่องหนึ่งครับ เนื่องจากในวันเสาร์ที่ 7 นี้ ผมมีความจำเป็นต้องเดินทางกลับต่างจังหวัดเพื่อไปร่วมงานบวชของน้องชาย ดังนั้น ผมจึงอยากสอบถามว่าพี่จะสามารถช่วยเข้ากะแทนผมในช่วงเวลา 13.00–21.00 น. ได้หรือไม่ครับ ทั้งนี้ ผมยินดีที่จะเข้ากะแทนพี่ในวันอื่นเป็นการตอบแทนครับ ขอบคุณพี่มากๆ สำหรับการพิจารณาครับ 🙏
97
+
98
+ **หลัง**
99
+
100
+ > พี่เมย์ครับ ขอรบกวนหน่อย เสาร์ที่ 7 นี้ผมต้องกลับต่างจังหวัดไปงานบวชน้องชาย พี่พอจะเข้ากะแทนผมช่วง 13.00–21.00 น. ได้ไหมครับ เดี๋ยวผมเข้ากะแทนพี่วันอื่นคืนให้ ขอบคุณมากครับ
101
+
102
+ สั่งได้ 4 แบบ คือ **ตรวจ** (บอกว่าตรงไหนดูเป็น AI ยังไม่แก้) **เขียนใหม่** (เกลาทั้งชิ้น) **แก้เฉพาะจุด** (แก้แค่คำที่แข็ง) และ **เลียนสไตล์** (เขียนให้เป็นสำนวนของเราเอง ดูหัวข้อถัดไป) และเลือกระดับภาษาตามที่เรียนในวิชาภาษาไทย คือ กันเอง ไม่เป็นทางการ กึ่งทางการ และทางการ
103
+
104
+ ตรวจ 29 รูปแบบ ส่วนใหญ่คือสิ่งที่วิชาภาษาไทยเรียกว่า**ประโยคฟุ่มเฟือย**กับ**สำนวนต่างประเทศ** เช่น "ได้ทำการ" "ถูกพัฒนาโดย" "ทำให้แน่ใจว่า" ที่เหลือเป็นนิสัยของแชตบอต เช่น อีโมจิท้ายข้อความ ดูรายละเอียดใน [patterns.md](shared/patterns.md) และตัวอย่างอื่นใน [examples/humanizer-th/](examples/humanizer-th/)
105
+
106
+ ### เขียนให้เป็นสำนวนของเราเอง (เลียนสไตล์)
107
+
108
+ ข้อความที่เกลาแล้วอาจเป็นธรรมชาติ แต่ยังไม่ใช่เสียงของเรา คนที่อ่านโพสต์เราทุกวันอ่านแล้วรู้สึกว่าไม่ใช่เรา โหมดนี้มีไว้แก้เรื่องนั้น ส่งงานเก่าของตัวเองมา 3 ชิ้นขึ้นไป พร้อมร่างที่ AI เขียน หรือแค่บอกว่าจะเขียนเรื่องอะไร skill จะดูว่าเราเรียกตัวเองว่าอะไร ใส่ "ครับ" ตรงไหน ขึ้นบรรทัดใหม่บ่อยแค่ไหน ชอบเปิดและปิดยังไง เขียนเวลาและราคาแบบไหน แล้วเขียนตามนั้น
109
+
110
+ **ร่างจาก AI**
111
+
112
+ ```text
113
+ 📢 ประกาศสำคัญจากทางร้าน 📢
114
+
115
+ เรียนลูกค้าทุกท่าน ทางร้านขอแจ้งให้ทราบว่า ร้านจะปิดให้บริการเป็นการชั่วคราวในวันจันทร์ที่ 14 และวันอังคารที่ 15 นี้ เนื่องจากเจ้าของร้านจะเดินทางไปเข้าร่วมการอบรมการคั่วกาแฟที่จังหวัดเชียงราย ...
116
+ ```
117
+
118
+ **หลังเลียนสไตล์จากโพสต์เก่า 3 ชิ้นของเจ้าของร้าน**
119
+
120
+ ```text
121
+ จันทร์ที่ 14 กับอังคารที่ 15 นี้ร้านปิดนะ
122
+ ผมไปเรียนคั่วกาแฟที่เชียงราย
123
+ กลับมาจะได้คั่วให้ดีกว่าเดิม
124
+
125
+ ช่วงที่ร้านปิด ใครจะสั่งเมล็ดทักแชตเพจได้ตามปกติ
126
+ เดี๋ยวผมส่งให้วันพุธ
127
+
128
+ ขอโทษที่ต้องปิดไปสองวัน ขอบคุณที่แวะมากันตลอด
129
+ พุธที่ 16 เปิดตามเดิม 8 โมงถึงบ่าย 3 ครับ
130
+ ```
131
+
132
+ - **เนื้อหามาจากร่างหรือโจทย์เท่านั้น** ไม่หยิบเรื่องจากงานเก่ามาใส่ และไม่แต่งเรื่องเพิ่มให้เหมือนสไตล์ ถ้าสไตล์ต้องใช้ข้อมูลที่ไม่มี จะถามแทน
133
+ - **เลียนเท่าที่เห็นจริง** ใช้คำติดปากถี่เท่างานเก่า ไม่ลอกคำที่สะกดผิด และไม่เลียนสำนวนแปลอย่าง "ได้ทำการ" แม้เราจะใช้ประจำ
134
+ - **เก็บโปรไฟล์สำนวนไว้ใช้ครั้งหน้าได้** ครั้งต่อไปวางโปรไฟล์แทนงานเก่า แล้วบอกแค่ว่าจะเขียนอะไร
135
+ - **ใช้กับงานแปลและงานบทได้ด้วย** ส่งซับตอนก่อนหรือข้อความแอปเวอร์ชันเดิมให้ `localize-th` แปลต่อให้เข้ากัน หรือส่งบทตอนก่อนให้ `script-th` เขียนตอนใหม่ในสไตล์เดิม
136
+
137
+ ตัวอย่างเต็มพร้อมโปรไฟล์: [examples/humanizer-th/07-match-style.md](examples/humanizer-th/07-match-style.md)
138
+
139
+ **ทั้งสาม skill ไม่แตะ** ตัวเลข วันที่ ราคา ชื่อคน ชื่อแบรนด์ ลิงก์ โค้ด และ "ครับ" "ค่ะ" ของคนเขียน และไม่เติมข้อมูลที่ต้นฉบับไม่มี
140
+
141
+ ## ติดตั้ง
142
+
143
+ ### คำสั่งเดียว
144
+
145
+ เปิด Terminal (Mac) หรือ PowerShell (Windows) แล้วพิมพ์
146
+
147
+ ```bash
148
+ npx humanizer-th
149
+ ```
150
+
151
+ ติดตั้งทั้งสาม skill ให้ Claude Code, Codex, Gemini CLI และ GitHub Copilot ที่มีในเครื่อง เสร็จแล้วปิดเปิดโปรแกรมใหม่หนึ่งรอบ แล้วพิมพ์สั่งได้เลย
152
+
153
+ - ต้องมี Node.js 18 ขึ้นไป ถ้ายังไม่มี โหลดได้ที่ [nodejs.org](https://nodejs.org) (ถ้าใช้ Claude Code หรือ Codex อยู่ ส่วนใหญ่มีแล้ว)
154
+ - ถ้าขึ้นว่า `Ok to proceed?` ให้กด `y`
155
+ - อัปเดต `npx humanizer-th@latest` / ลบ `npx humanizer-th uninstall` / เลือกบางตัว `npx humanizer-th --skill localize-th` / ติดตั้งเฉพาะโปรเจกต์ที่เปิดอยู่ `npx humanizer-th --project`
156
+
157
+ ### ไม่ใช้ terminal
158
+
159
+ **Claude.ai และ Claude Desktop:** โหลดไฟล์ zip ของ skill ที่ต้องการจากหน้า [Releases](https://github.com/inatbalthazar/humanizer-th/releases/latest) (`localize-th.zip` `script-th.zip` `humanizer-th.zip`) แล้วอัปโหลดทีละไฟล์ใน Settings → Capabilities → Skills
160
+
161
+ **ChatGPT, Gemini และ AI ตัวอื่น:** โหลดไฟล์รวมของ skill ที่ต้องการจากหน้า [Releases](https://github.com/inatbalthazar/humanizer-th/releases/latest) (`localize-th-prompt.md` `script-th-prompt.md` `humanizer-th-prompt.md`) แต่ละไฟล์รวมทุกอย่างของ skill นั้นไว้ในไฟล์เดียว
162
+
163
+ - **ChatGPT:** สร้าง GPT หนึ่งตัวต่อหนึ่ง skill อัปโหลดไฟล์ในช่อง Knowledge แล้วพิมพ์ในช่อง Instructions ว่า "ทำตามคำสั่งในไฟล์ [ชื่อไฟล์] ทุกข้อ" (ช่อง Instructions รับได้ 8,000 ตัวอักษร วางทั้งไฟล์ไม่พอ)
164
+ - **Gemini:** สร้าง Gem แล้ววางเนื้อหาทั้งไฟล์ในช่องคำสั่ง หรือแนบเป็นไฟล์
165
+ - **เรียกผ่าน API:** ใช้เนื้อหาทั้งไฟล์เป็น system prompt
166
+ - **แชตทั่วไป:** แนบไฟล์ แล้วพิมพ์ว่าให้ทำตามไฟล์นี้
167
+
168
+ ไฟล์รวมยาว 59,000–94,000 ตัวอักษร ถ้าเรียกผ่าน API ทุกครั้งจะเสียค่า token พอสมควร เพราะภาษาไทยกิน token มากกว่าภาษาอังกฤษ
169
+
170
+ <details>
171
+ <summary><strong>วิธีอื่น</strong> (plugin ของ Claude Code, skills CLI, เครื่องที่ไม่มี Node.js, ติดตั้งเอง)</summary>
172
+
173
+ **plugin ของ Claude Code:** พิมพ์ใน Claude Code
174
+
175
+ ```text
176
+ /plugin marketplace add inatbalthazar/humanizer-th
177
+ /plugin install humanizer-th@humanizer-th
178
+ ```
179
+
180
+ **skills CLI:** ติดตั้งให้ทุกเครื่องมือที่ [skills CLI](https://github.com/vercel-labs/skills) รู้จัก รวมถึง Cursor และ Windsurf
181
+
182
+ ```bash
183
+ npx skills add inatbalthazar/humanizer-th --global --agent '*'
184
+ ```
185
+
186
+ **ไม่มี Node.js (Mac หรือ Linux):**
187
+
188
+ ```bash
189
+ curl -fsSL https://raw.githubusercontent.com/inatbalthazar/humanizer-th/main/install.sh | bash
190
+ ```
191
+
192
+ ต้องการแค่บางตัว ใช้ `| bash -s -- --skill localize-th` ถ้าจะลบ ใช้ `| bash -s -- --uninstall`
193
+
194
+ **ติดตั้งเอง:** คัดลอกโฟลเดอร์ใน `skills/` ไปไว้ในโฟลเดอร์ skill ของเครื่องมือที่ใช้
195
+
196
+ | เครื่องมือ | ใช้กับทุกโปรเจกต์ | ใช้เฉพาะโปรเจกต์ |
197
+ |---|---|---|
198
+ | Claude Code | `~/.claude/skills/` | `.claude/skills/` |
199
+ | Codex CLI | `~/.agents/skills/` | `.agents/skills/` |
200
+ | Gemini CLI | `~/.gemini/skills/` | `.gemini/skills/` |
201
+ | GitHub Copilot ใน VS Code | `~/.copilot/skills/` | `.github/skills/` |
202
+
203
+ เครื่องมือที่ไม่อยู่ในตาราง ส่วนใหญ่อ่าน `.agents/skills/` ได้ ถ้าจะสร้างไฟล์ zip และไฟล์รวมเองจากโค้ดล่าสุด รัน `bash scripts/build.sh` ไฟล์จะอยู่ในโฟลเดอร์ `dist/`
204
+
205
+ </details>
206
+
207
+ ## สิ่งที่ไม่ทำ
208
+
209
+ - **ไม่ได้มีไว้หลบ AI detector** ทำมาให้คนอ่านอ่านง่ายขึ้น และจะไม่แกล้งใส่คำผิดให้ดูเหมือนคนเขียน
210
+ - **ไม่เขียนในนามคนอื่น** โหมดเลียนสไตล์ใช้กับงานของตัวเอง หรืองานที่เขียนแทนโดยเจ้าตัวรู้ เช่น แอดมินเขียนโพสต์ในนามเจ้าของร้าน ไม่ใช้ปลอมข้อความของคนอื่น
211
+ - **ไม่เขียนบทให้คนจริงพูด** เช่น ดารา นักการเมือง เพื่อเอาไปทำวิดีโอ AI เว้นแต่เป็นตัวผู้ใช้เองหรือได้รับอนุญาต และไม่เขียนบทหลอกลวง เช่น ข่าวปลอม คลิปหลอกโอนเงิน
212
+ - **แปลจากภาษาอังกฤษเท่านั้น** ยังไม่มีกฎสำหรับต้นฉบับภาษาอื่น
213
+
214
+ ## ข้อจำกัด
215
+
216
+ - AI ทำตามคำแนะนำในไฟล์ ไม่ได้รันเป็นโปรแกรม ผลแต่ละครั้งจึงไม่เหมือนกันเป๊ะ ควรอ่านทวนก่อนเอาไปใช้ งานแปลที่จะเผยแพร่ควรมีคนไทยอ่านทวนอีกรอบ
217
+ - ทดสอบกับ Claude เท่านั้น ตัวอื่นใช้กฎชุดเดียวกัน แต่ผลขึ้นกับว่าโมเดลนั้นเก่งภาษาไทยแค่ไหน
218
+ - ยังไม่ได้ลองเอาพรอมต์และบทพากย์ไปใช้กับเว็บสร้างวิดีโอและเสียง AI จริง ตัวเลขพยางค์ต่อวินาทีเป็นค่าประมาณ ให้ลองช็อตแรกแล้วปรับ ดูผลทดสอบใน [tests/manual-test-v0.3.md](tests/manual-test-v0.3.md)
219
+ - โหมดเลียนสไตล์ทดสอบกับตัวอย่างที่แต่งขึ้นชุดเดียว ยังไม่ได้ลองกับงานจริงหลายแบบ ดู [tests/manual-test-v0.4.md](tests/manual-test-v0.4.md)
220
+ - บางรูปแบบเป็นเรื่องรสนิยม ทุกรูปแบบจึงเขียนไว้ด้วยว่าตอนไหนไม่ต้องแก้
221
+
222
+ ## อยากช่วยพัฒนา
223
+
224
+ ถ้าเจอสำนวนที่ AI ชอบใช้แต่ยังไม่อยู่ในรายการ คำแปลที่ skill เลือกแล้วแปลก หรือบทพูดที่ยังฟังเหมือน AI ดูวิธีเสนอได้ใน [CONTRIBUTING.md](CONTRIBUTING.md)
225
+
226
+ ## สัญญาอนุญาต
227
+
228
+ MIT ดูรายละเอียดใน [LICENSE](LICENSE)
package/bin/cli.js ADDED
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env node
2
+ // Install the Thai skills (humanizer-th, localize-th, script-th) into every
3
+ // AI tool found on this machine.
4
+ //
5
+ // npx humanizer-th install all three skills
6
+ // npx humanizer-th --skill localize-th install one skill (repeatable)
7
+ // npx humanizer-th --project install into the current folder only
8
+ // npx humanizer-th --target DIR install into DIR/<skill>
9
+ // npx humanizer-th uninstall remove the skills
10
+ "use strict";
11
+
12
+ const fs = require("fs");
13
+ const os = require("os");
14
+ const path = require("path");
15
+
16
+ const ALL_SKILLS = ["humanizer-th", "localize-th", "script-th"];
17
+ const SRC = path.join(__dirname, "..", "skills");
18
+ const VERSION = require("../package.json").version;
19
+
20
+ const HELP = `humanizer-th ${VERSION}
21
+
22
+ npx humanizer-th ติดตั้งทั้งสาม skill / install all three skills
23
+ npx humanizer-th --skill localize-th ติดตั้งบางตัว / install one skill (repeatable)
24
+ npx humanizer-th --project ติดตั้งเฉพาะโฟลเดอร์นี้ / this folder only
25
+ npx humanizer-th --target DIR ติดตั้งลง DIR / install into DIR
26
+ npx humanizer-th uninstall ลบออก / remove
27
+
28
+ Skills: ${ALL_SKILLS.join(", ")}`;
29
+
30
+ function fail(message) {
31
+ console.error(message);
32
+ process.exit(1);
33
+ }
34
+
35
+ function parseArgs(argv) {
36
+ const opts = { command: "install", skills: [], target: "", project: false };
37
+ for (let i = 0; i < argv.length; i++) {
38
+ const arg = argv[i];
39
+ if (arg === "install" || arg === "uninstall") opts.command = arg;
40
+ else if (arg === "--skill") opts.skills.push(argv[++i] || fail("--skill needs a name"));
41
+ else if (arg === "--target") opts.target = argv[++i] || fail("--target needs a folder");
42
+ else if (arg === "--project") opts.project = true;
43
+ else if (arg === "-h" || arg === "--help" || arg === "help") opts.command = "help";
44
+ else if (arg === "-v" || arg === "--version") opts.command = "version";
45
+ else fail(`Unknown option: ${arg}\n\n${HELP}`);
46
+ }
47
+ if (opts.skills.length === 0) opts.skills = ALL_SKILLS;
48
+ for (const s of opts.skills) {
49
+ if (!ALL_SKILLS.includes(s)) fail(`Unknown skill: ${s} (choose from ${ALL_SKILLS.join(", ")})`);
50
+ }
51
+ return opts;
52
+ }
53
+
54
+ // Skill folders to install into, with the tool each one serves.
55
+ // .agents/skills is shared by Codex and other tools that follow the Agent
56
+ // Skills standard, so it is always used. The rest only when the tool exists.
57
+ function destinations(opts) {
58
+ if (opts.target) return [{ dir: path.resolve(opts.target), tool: opts.target }];
59
+ if (opts.project) {
60
+ const cwd = process.cwd();
61
+ return [
62
+ { dir: path.join(cwd, ".agents", "skills"), tool: "Codex and others" },
63
+ { dir: path.join(cwd, ".claude", "skills"), tool: "Claude Code" },
64
+ ];
65
+ }
66
+ const home = os.homedir();
67
+ const dests = [{ dir: path.join(home, ".agents", "skills"), tool: "Codex and others" }];
68
+ const optional = [
69
+ [".claude", "Claude Code"],
70
+ [".gemini", "Gemini CLI"],
71
+ [".copilot", "GitHub Copilot"],
72
+ ];
73
+ for (const [folder, tool] of optional) {
74
+ if (fs.existsSync(path.join(home, folder))) dests.push({ dir: path.join(home, folder, "skills"), tool });
75
+ }
76
+ return dests;
77
+ }
78
+
79
+ function install(opts) {
80
+ for (const s of opts.skills) {
81
+ if (!fs.existsSync(path.join(SRC, s, "SKILL.md"))) fail(`${s}/SKILL.md is missing from this package`);
82
+ }
83
+ const dests = destinations(opts);
84
+ for (const { dir } of dests) {
85
+ fs.mkdirSync(dir, { recursive: true });
86
+ for (const s of opts.skills) {
87
+ const to = path.join(dir, s);
88
+ fs.rmSync(to, { recursive: true, force: true });
89
+ fs.cpSync(path.join(SRC, s), to, { recursive: true });
90
+ }
91
+ }
92
+ console.log(`humanizer-th ${VERSION}: ${opts.skills.join(", ")}`);
93
+ for (const { dir, tool } of dests) console.log(` ${dir} (${tool})`);
94
+ console.log(`
95
+ เสร็จแล้ว ถ้าเปิดโปรแกรม AI อยู่ ให้ปิดแล้วเปิดใหม่ก่อน แล้วลองพิมพ์
96
+ "แปลซับนี้เป็นไทย" แล้วแนบไฟล์ซับ
97
+ "เขียนบทละครสั้นเรื่อง..."
98
+ "เกลาให้หน่อย" ตามด้วยข้อความภาษาไทย
99
+
100
+ Done. Restart your AI tool, then just ask, e.g. "Translate this subtitle file into Thai".
101
+ อัปเดตเวอร์ชันใหม่ / update: npx humanizer-th@latest`);
102
+ }
103
+
104
+ function uninstall(opts) {
105
+ let removed = 0;
106
+ for (const { dir } of destinations(opts)) {
107
+ for (const s of opts.skills) {
108
+ const to = path.join(dir, s);
109
+ if (fs.existsSync(to)) {
110
+ fs.rmSync(to, { recursive: true, force: true });
111
+ console.log(`Removed ${to}`);
112
+ removed++;
113
+ }
114
+ }
115
+ }
116
+ if (removed === 0) console.log("ไม่พบ skill ที่ติดตั้งไว้ / Nothing to remove");
117
+ }
118
+
119
+ const opts = parseArgs(process.argv.slice(2));
120
+ if (opts.command === "help") console.log(HELP);
121
+ else if (opts.command === "version") console.log(VERSION);
122
+ else if (opts.command === "uninstall") uninstall(opts);
123
+ else install(opts);
package/package.json CHANGED
@@ -1,6 +1,35 @@
1
1
  {
2
2
  "name": "humanizer-th",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.5.0",
4
+ "description": "Thai-language Agent Skills: translate subtitles, games, apps and websites into natural Thai, write dialogue and voice scripts for AI short dramas, and edit AI-written Thai. One command installs them into Claude Code, Codex, Gemini CLI and Copilot.",
5
+ "bin": {
6
+ "humanizer-th": "bin/cli.js"
7
+ },
8
+ "files": [
9
+ "bin/",
10
+ "skills/",
11
+ "README.en.md",
12
+ "LICENSE"
13
+ ],
14
+ "engines": {
15
+ "node": ">=18"
16
+ },
17
+ "keywords": [
18
+ "agent-skills",
19
+ "claude-code",
20
+ "codex",
21
+ "thai",
22
+ "translation",
23
+ "localization",
24
+ "subtitles",
25
+ "humanizer"
26
+ ],
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "git+https://github.com/inatbalthazar/humanizer-th.git"
30
+ },
31
+ "homepage": "https://github.com/inatbalthazar/humanizer-th#readme",
32
+ "bugs": "https://github.com/inatbalthazar/humanizer-th/issues",
33
+ "license": "MIT",
34
+ "author": "inatbalthazar"
35
+ }