From ae895604d87ada9e03587395806319e54662cb14 Mon Sep 17 00:00:00 2001 From: sudoskys Date: Wed, 25 Dec 2024 00:24:13 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=F0=9F=94=A4=20test(tokenizer):=20update=20?= =?UTF-8?q?test=20text=20for=20consistency?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generate_scene_composition.py | 2974 +++++++++++++++++ 1 file changed, 2974 insertions(+) create mode 100644 src/novelai_python/tool/random_prompt/generate_scene_composition.py diff --git a/src/novelai_python/tool/random_prompt/generate_scene_composition.py b/src/novelai_python/tool/random_prompt/generate_scene_composition.py new file mode 100644 index 0000000..01ee9be --- /dev/null +++ b/src/novelai_python/tool/random_prompt/generate_scene_composition.py @@ -0,0 +1,2974 @@ +import random +from typing import List, Callable + +from pydantic import dataclasses + +cameraAnglesL = [ + ["dutch angle", 12, [], [], []], + ["from above", 12, ["above"], [], []], + ["from behind", 12, ["behind"], [], []], + ["from below", 12, ["below"], [], []], + ["from side", 12, [], [], []], + ["three quarter view", 12, [], [], []], + ["straight-on", 12, ["front"], [], []], +] +framingTypesL = [ + ["portrait", 8, [], [], []], + ["upper body", 12, ["body"], [], []], + ["cowboy shot", 12, ["legs", "body"], [], []], + ["full body", 12, ["feet", "legs", "body"], [], []], +] +subjectFocusL = [ + ["solo focus", 12, [], [], []], + ["ass focus", 12, [], [], ["front"]], + ["foot focus", 12, [], ["feet"], []], + ["hip focus", 12, [], [], []], + ["back focus", 12, [], [], ["front"]], + ["breast focus", 4, [], ["female"], []], + ["armpit focus", 4, [], [], []], + ["eye focus", 12, [], [], []], +] +sceneTypesL = [ + ["landscape", 12, [], [], []], + ["nature", 12, [], [], []], + ["scenery", 12, [], [], []], + ["still life", 12, [], [], []], + ["cityscape", 12, [], [], []], +] +backgroundTypesL = [ + ["white background", 12, [], [], []], + ["grey background", 12, [], [], []], + ["gradient background", 16, [], [], []], + ["blurry background", 12, [], [], []], + ["blue background", 12, [], [], []], + ["pink background", 12, [], [], []], + ["black background", 12, [], [], []], + ["yellow background", 12, [], [], []], + ["red background", 12, [], [], []], + ["two-tone background", 16, [], [], []], + ["brown background", 12, [], [], []], + ["green background", 12, [], [], []], + ["purple background", 12, [], [], []], + ["orange background", 12, [], [], []], + ["floral background", 12, [], [], []], + ["polka dot background", 12, [], [], []], + ["striped background", 12, [], [], []], + ["multicolored background", 16, [], [], []], + ["starry background", 12, [], [], []], + ["simple background, starry background", 12, [], [], []], + ["dark background", 12, [], [], []], + ["simple background, checkered background", 12, [], [], []], + ["aqua background", 12, [], [], []], + ["beige background", 12, [], [], []], + ["heart background", 12, [], [], []], + ["argyle background", 8, [], [], []], + ["halftone background", 8, [], [], []], + ["simple background, sparkle background", 12, [], [], []], + ["simple background, abstract background", 12, [], [], []], + ["abstract background", 12, [], [], []], + ["patterned background", 12, [], [], []], + ["plaid background", 10, [], [], []], + ["simple background, sunburst background", 10, [], [], []], + ["tan background", 12, [], [], []], + ["light blue background", 12, [], [], []], + ["snowflake background", 8, [], [], []], + ["grid background", 12, [], [], []], + ["leaf background", 12, [], [], []], + ["simple background, rainbow background", 12, [], [], []], + ["rainbow background", 12, [], [], []], + ["lavender background", 12, [], [], []], + ["light brown background", 12, [], [], []], + ["bubble background", 12, [], [], []], + ["sepia background", 12, [], [], []], + ["fiery background", 12, [], [], []], + ["silver background", 12, [], [], []], + ["splatter background", 12, [], [], []], + ["sketch background, scenery", 12, [], [], []], + ["scenery", 220, [], [], []], +] +artStylesL = [ + ["ligne claire", 12, [], [], []], + ["realistic", 12, [], [], []], + ["photorealistic", 12, [], [], []], + ["cel shading", 12, [], [], []], + ["sketch", 12, [], [], []], + ["jaggy lines", 12, [], [], []], + ["retro artstyle", 12, [], [], []], + ["toon (style)", 12, [], [], []], + ["surreal", 12, [], [], []], + ["abstract", 12, [], [], []], + ["spot color", 12, [], [], []], + ["graphite (medium)", 12, [], [], []], + ["watercolor (medium)", 12, [], [], []], + ["concept art", 12, [], [], []], + ["flat color", 12, [], [], []], + ["ai-generated", 12, [], [], []], + ["faux traditional media", 12, [], [], []], + ["oekaki", 12, [], [], []], + ["minimalism", 12, [], [], []], + ["impressionism", 12, [], [], []], + ["1970s (style)", 12, [], [], []], + ["1980s (style)", 12, [], [], []], + ["1990s (style)", 12, [], [], []], + ["chibi, chibi only", 12, [], [], []], + ["pc-98 (style)", 12, [], [], []], + ["shikishi", 1, [], [], []], + ["colored pencil (medium)", 12, [], [], []], + ["painterly", 12, [], [], []], + ["millipen (medium)", 12, [], [], []], + ["pen (medium)", 12, [], [], []], + ["tegaki", 12, [], [], []], + ["vector trace", 12, [], [], []], + ["production art", 12, [], [], []], + ["figure, photo (medium)", 12, [], [], []], + ["pixelated", 12, [], [], []], + ["color trace", 12, [], [], []], + ["pastel (medium)", 12, [], [], []], +] +animalCharacteristicsL = [ + ["bat ears, bat wings", 12, [], [], []], + ["bear ears", 12, [], [], []], + ["rabbit girl, rabbit ears", 12, [], ["female"], []], + ["rabbit girl, rabbit ears, floppy ears", 12, [], ["female"], []], + ["cat ears, cat tail", 12, [], [], []], + ["leopard ears, leopard tail", 12, [], [], []], + ["snow leopard ears, snow leopard tail", 12, [], [], []], + ["panther ears, panther tail", 12, [], [], []], + ["jaguar ears, jaguar tail", 12, [], [], []], + ["cow ears, cow horns, cow tail", 12, [], [], []], + ["deer ears, deer antlers", 12, [], [], []], + ["dog ears, dog tail", 12, [], [], []], + ["fox ears, fox tail", 12, [], [], []], + ["horse ears, horse tail", 12, [], [], []], + ["monkey ears, monkey tail", 12, [], [], []], + ["mouse ears, mouse tail", 12, [], [], []], + ["sheep ears, sheep horns", 12, [], [], []], + ["goat ears, goat horns", 12, [], [], []], + ["lion ears, lion tail", 12, [], [], []], + ["squirrel ears, squirrel tail", 12, [], [], []], + ["tiger ears, tiger tail", 12, [], [], []], + ["wolf ears, wolf tail", 12, [], [], []], + ["oni, oni horns", 12, [], [], []], + ["elf, pointy ears", 12, [], [], []], + ["elf, long pointy ears", 12, [], [], []], + ["dark elf, pointy ears", 12, [], [], []], + ["dark elf, long pointy ears", 12, [], [], []], + ["fairy, fairy wings", 12, [], [], []], + ["dragon horns, dragon tail", 12, [], [], []], + ["demon horns, demon tail", 12, [], [], []], + ["cow ears, cow horns", 12, [], [], []], + ["angel", 12, [], [], []], + ["android, robot joints", 12, [], [], []], + ["robot girl, clothed robot", 12, [], ["female"], []], + ["monster girl, mermaid, scales", 12, ["nolegs"], ["female"], []], + ["monster girl, head fins, fish tail", 12, [], ["female"], []], + ["raccoon ears, raccoon tail", 12, [], [], []], + ["monster girl, slime girl", 12, [], ["female"], []], + ["monster girl, lamia", 12, ["nolegs"], ["female"], []], + ["monster girl, harpy, winged arms", 12, ["noarms", "female"], [], []], + ["orc, colored skin", 12, [], [], []], + ["cyclops, one-eyed", 12, [], [], []], + ["centaur", 12, ["nolegs"], [], []], + ["monster", 12, [], [], []], + ["monster girl, plant girl, alraune", 12, [], ["female"], []], + ["minigirl", 12, [], ["female"], []], + ["miniboy", 12, [], ["male"], []], + ["ghost, ghost tail", 12, [], [], []], + ["centauroid", 12, [], [], []], + ["monster girl, scylla, tentacles", 12, ["nolegs"], ["female"], []], + ["weasel tail, weasel ears", 12, [], [], []], + ["otter ears, otter tail", 12, [], [], []], + ["halfling", 12, [], [], []], + ["goblin", 12, [], [], []], + ["chipmunk ears, chipmunk tail", 12, [], [], []], +] +skinTypesL = [ + ["dark skin", 200, [], [], []], + ["very dark skin", 200, [], [], []], + ["pale skin", 200, [], [], []], + ["tan", 200, [], [], []], + ["gradient skin", 12, [], [], []], + ["black skin", 12, [], [], []], + ["blue skin", 12, [], [], []], + ["green skin", 12, [], [], []], + ["grey skin", 12, [], [], []], + ["orange skin", 12, [], [], []], + ["pink skin", 12, [], [], []], + ["purple skin", 12, [], [], []], + ["red skin", 12, [], [], []], + ["white skin", 12, [], [], []], + ["yellow skin", 12, [], [], []], +] +eyeCharacteristicsL = [ + ["heterochromia", 12, [], [], []], + ["multicolored eyes", 12, [], [], []], + ["no eyes", 12, ["noeyes"], [], []], + ["ringed eyes", 12, [], [], []], + ["heart-shaped pupils", 12, [], [], []], + ["star-shaped pupils", 12, [], [], []], + ["diamond-shaped pupils", 12, [], [], []], + ["cross-shaped pupils", 12, [], [], []], + ["x-shaped pupils", 12, [], [], []], + ["horizontal pupils", 12, [], [], []], + ["bags under eyes", 12, [], [], []], + ["glowing eyes", 2, [], [], []], + ["glowing eye", 2, [], [], []], + ["flaming eye", 2, [], [], []], + ["bright pupils", 12, [], [], []], + ["sparkling eyes", 12, [], [], []], + ["star in eye", 12, [], [], []], + ["slit pupils", 12, [], [], []], + ["constricted pupils", 12, [], [], []], +] +eyeExpressionsL = [ + ["crazy eyes", 4, [], [], []], + ["empty eyes", 12, [], [], []], + ["solid circle eyes", 4, ["nocoloreyes"], [], []], + ["solid oval eyes", 4, ["nocoloreyes"], [], []], + ["jitome", 12, [], [], []], + ["tareme", 12, [], [], []], + ["tsurime", 12, [], [], []], + ["sanpaku", 12, [], [], []], + ["long eyelashes", 12, [], [], []], +] +hairLengthsL = [ + ["very short hair", 12, [], [], []], + ["short hair", 12, [], [], []], + ["short hair with long locks", 2, [], [], []], + ["medium hair", 12, [], [], []], + ["long hair", 12, ["longhair"], [], []], + ["very long hair", 4, ["longhair"], ["female"], []], + ["absurdly long hair", 4, ["longhair"], ["female"], []], + ["big hair", 8, ["longhair"], ["female"], []], +] +braidedHairstylesL = [ + ["braid", 12, [], [], []], + ["braided bangs", 12, [], ["female"], []], + ["front braid", 12, [], ["female"], []], + ["side braid", 12, [], ["female"], []], + ["french braid", 12, [], ["female"], []], + ["crown braid", 12, [], ["female"], []], + ["single braid", 12, [], [], []], + ["multiple braids", 12, [], ["female"], []], + ["braided ponytail", 12, [], [], []], + ["hair bun", 12, [], ["female"], []], + ["braided bun", 12, [], [], []], + ["single hair bun", 12, [], [], []], + ["double bun", 12, [], ["female"], []], + ["hair rings", 12, [], ["female"], []], + ["half updo, short ponytai", 12, [], [], []], + ["half updo, hair bun", 12, [], [], []], + ["half updo, bow", 12, [], [], []], + ["one side up", 12, [], ["female"], []], + ["two side up", 12, [], ["female"], []], + ["cone hair bun", 12, [], ["female"], []], + ["low-braided long hair", 12, [], ["longhair"], []], + ["low-tied long hair", 12, [], ["longhair"], []], + ["ponytail", 12, [], [], []], + ["folded ponytail", 12, [], [], []], + ["high ponytail", 12, [], [], []], + ["short ponytail", 12, [], [], []], + ["side ponytail", 12, [], ["female"], []], + ["wide ponytail", 12, [], [], []], + ["twintails", 12, [], ["female"], []], + ["low twintails", 12, [], ["female"], []], + ["short twintails", 12, [], ["female"], []], + ["uneven twintails", 12, [], ["female"], []], + ["drill hair, twin drills", 12, [], ["female"], []], + ["sidecut", 12, [], [], []], + ["asymmetrical hair", 12, [], [], []], + ["hime cut", 12, [], ["female", "longhair"], []], + ["single side bun", 12, [], ["female"], []], + ["afro", 12, [], [], []], + ["beehive hairdo", 12, [], ["female"], []], + ["pompadour", 12, [], [], []], + ["bow-shaped hair", 12, [], ["female"], []], + ["dreadlocks", 12, [], [], []], + ["doughnut hair bun", 12, [], ["female"], []], + ["wolf cut", 12, [], [], []], + ["undercut", 12, [], [], ["longhair"]], + ["pixie cut", 12, [], [], ["longhair"]], + ["bob cut", 12, [], [], ["longhair"]], + ["inverted bob", 12, [], [], ["longhair"]], + ["bowl cut", 12, [], [], ["longhair"]], + ["topknot", 12, [], [], []], + ["single hair ring", 12, [], ["female"], []], + ["mohawk", 12, [], [], []], + ["low twin braids", 12, [], ["female"], []], + ["hair horns", 12, [], [], []], + ["center-flap bangs", 12, [], [], []], + ["buzz cut", 12, [], [], []], +] +uniqueHairstylesL = [ + ["drill hair", 12, [], ["female", "longhair"], []], + ["hair flaps", 12, [], [], []], + ["messy hair", 12, [], [], []], + ["ringlets", 12, [], ["female"], []], + ["spiked hair", 12, [], [], []], + ["straight hair", 12, [], [], []], + ["wavy hair", 12, [], [], []], + ["blunt ends", 12, [], [], []], + ["flipped hair", 12, [], [], []], + ["lone nape hair", 12, [], [], []], + ["parted hair", 12, [], [], []], + ["fluffy hair", 12, [], [], []], + ["curly hair", 12, [], [], []], +] +bangsStylesL = [ + ["arched bangs", 12, [], [], []], + ["asymmetrical bangs", 12, [], [], []], + ["bangs pinned back", 12, [], [], []], + ["blunt bangs", 12, [], [], []], + ["crossed bangs", 12, [], [], []], + ["hair over eyes", 12, [], [], []], + ["hair over one eye", 12, [], [], []], + ["long bangs", 12, [], [], []], + ["parted bangs", 12, [], [], []], + ["short bangs", 12, [], [], []], + ["swept bangs", 12, [], [], []], + ["hair between eyes", 12, [], [], []], + ["hair intakes", 12, [], ["female"], []], + ["single hair intake", 12, [], ["female"], []], + ["sidelocks", 12, [], [], []], + ["asymmetrical sidelocks", 12, [], [], []], + ["drill sidelocks", 12, [], ["female"], []], + ["single sidelock", 12, [], [], []], + ["hair pulled back", 12, [], [], []], + ["hair slicked back", 12, [], [], []], + ["ahoge", 8, [], [], []], + ["ahoge, huge ahoge", 4, [], [], []], + ["ahoge, heart ahoge", 4, [], [], []], + ["antenna hair", 12, [], [], []], + ["cowlick", 12, [], [], []], + ["diagonal bangs", 12, [], [], []], + ["curtained hair", 12, [], [], []], + ["long hair between eyes", 12, [], [], []], + ["hair behind ear", 12, [], ["female"], []], + ["double-parted bangs", 12, [], [], []], + ["low-tied sidelocks", 12, [], [], []], + ["side part", 12, [], [], []], +] +breastSizesL = [ + ["flat chest", 6, [], [], []], + ["small breasts", 14, ["breasts"], [], []], + ["medium breasts", 14, ["breasts"], [], []], + ["large breasts", 4, ["breasts"], [], []], + ["huge breasts", 2, ["breasts"], [], []], + ["gigantic breasts", 1, ["breasts"], [], []], + ["sagging breasts", 1, ["breasts"], [], []], +] +bodyFeaturesL = [ + ["forehead", 12, [], [], []], + ["collarbone", 12, [], [], []], + ["neck", 12, [], [], []], + ["narrow waist", 12, [], [], []], + ["wide hips", 12, [], ["female"], []], + ["shiny skin", 12, [], [], []], + ["thighs", 12, [], [], []], + ["thick thighs", 12, [], ["female"], []], + ["thigh gap", 12, [], ["female"], []], + ["third eye", 1, [], [], []], + ["thick eyebrows", 12, [], [], []], + ["teeth", 12, [], [], []], + ["stomach", 12, [], [], []], + ["plump", 12, [], [], []], + ["scar", 4, [], [], []], + ["petite", 12, [], [], []], + ["muscular", 12, [], [], []], + ["mature female", 12, [], ["female"], []], + ["mature male", 12, [], ["male"], []], + ["huge ass", 2, [], [], ["front"]], + ["flat ass", 2, [], [], ["front"]], + ["mole under eye", 4, [], [], []], + ["mole under mouth", 4, [], [], []], + ["mole on thigh", 4, [], ["legs"], []], + ["freckles", 12, [], [], []], + ["curvy", 12, [], ["female"], []], + ["androgynous", 12, [], [], []], + ["abs", 12, [], [], []], + ["old woman", 12, [], ["female"], []], + ["old man", 12, [], ["male"], []], + ["toned", 12, [], [], []], + ["fat", 2, [], [], []], + ["biceps", 12, [], [], []], + ["knees", 12, [], [], []], + ["skinny", 12, [], [], []], + ["hip bones", 12, [], [], []], + ["thick arms", 12, [], [], []], + ["tall", 12, [], [], []], + ["short", 12, [], [], []], + ["tomboy", 12, [], ["female"], []], + ["otoko no ko", 12, [], ["male"], []], + ["sideburns", 12, [], ["male"], []], + ["long sideburns", 12, [], ["male"], []], + ["handsome lady", 12, [], ["female"], []], + ["hairy", 12, [], ["male"], []], + ["bishounen", 12, [], ["male"], []], + ["big belly", 1, [], [], []], + ["bara", 12, [], ["male"], []], + ["sideburns stubble", 12, [], ["male"], []], + ["veiny arms", 12, [], [], []], + ["shortstack", 12, [], ["female"], []], + ["thick lips", 12, [], [], []], + ["stoic beauty", 12, [], ["female"], []], + ["ugly man", 12, [], ["male"], []], + ["ugly woman", 12, [], ["female"], []], +] +hatsAndHeadwearL = [ + ["hat, baseball cap", 12, ["headcovering"], [], []], + ["hat, cabbie hat", 12, ["headcovering"], [], []], + ["hat, deerstalker", 12, ["headcovering"], [], []], + ["hat, peaked cap", 12, ["headcovering"], [], []], + ["hat, shako cap", 12, ["headcovering"], [], []], + ["hat, bicorne", 12, ["headcovering"], [], []], + ["hat, bowler hat", 12, ["headcovering"], [], []], + ["hat, cowboy hat", 12, ["headcovering"], [], []], + ["hat, straw hat", 12, ["headcovering"], [], []], + ["hat, fedora", 12, ["headcovering"], [], []], + ["hat, flat cap", 12, ["headcovering"], [], []], + ["hat, pirate hat", 12, ["headcovering"], [], []], + ["hat, sun hat", 12, ["headcovering"], [], []], + ["hat, top hat", 12, ["headcovering"], [], []], + ["hat, tricorne", 12, ["headcovering"], [], []], + ["hat, witch hat", 12, ["headcovering"], [], []], + ["hat, wizard hat, conical hat", 12, ["headcovering"], [], []], + ["hat, military hat, dixie cup hat", 12, ["headcovering"], [], []], + ["hat, chef hat", 12, ["headcovering"], [], []], + ["hat, beret", 12, ["headcovering"], [], []], + ["hat, beanie", 12, ["headcovering"], [], []], + ["coif", 12, ["headcovering"], [], []], + ["hat, fur hat", 12, ["headcovering"], [], []], + ["hat, nightcap", 12, ["headcovering"], [], []], + ["hat, nurse cap", 12, ["headcovering"], [], []], + ["hat, party hat", 12, ["headcovering"], [], []], + ["hat, sailor hat", 12, ["headcovering"], [], []], + ["hat, santa hat", 12, ["headcovering"], [], []], + ["hat, animal hat", 12, ["headcovering"], [], []], + ["crown", 12, ["headcovering"], [], []], + ["tiara", 12, ["headcovering"], ["female"], []], + ["aviator cap, goggles", 12, ["headcovering"], [], []], + ["bandana", 12, ["headcovering"], [], []], + ["bonnet", 12, ["headcovering"], ["female"], []], + ["headscarf", 12, ["headcovering"], [], []], + ["hat, jester cap", 12, ["headcovering"], [], []], + ["hat, frilled hat", 12, ["headcovering"], [], []], + ["hat, military hat", 12, ["headcovering"], [], []], + ["hat, police hat", 12, ["headcovering"], [], []], + ["visor cap", 12, ["headcovering"], [], []], + ["hat, garrison cap", 12, ["headcovering"], [], []], + ["head wreath", 12, ["headcovering"], [], []], + ["flower wreath", 12, ["headcovering"], [], []], + ["on head, animal on head, bird on head", 3, ["headcovering"], [], []], + ["on head, animal on head, cat on head", 3, ["headcovering"], [], []], + ["on head, animal on head, dog on head", 3, ["headcovering"], [], []], + ["on head, animal on head, panda on head", 3, ["headcovering"], [], []], + ["on head, animal on head, rabbit on head", 3, ["headcovering"], [], []], + ["on head, animal on head, capybara on head", 1, ["headcovering"], [], []], + ["hat, tokin hat", 12, ["headcovering"], [], []], + ["super crown", 1, ["headcovering"], [], []], + ["rabbit hood", 12, ["headcovering"], [], []], + ["qingdai guanmao", 12, ["headcovering"], [], []], + ["horned helmet", 12, ["headcovering"], [], []], + ["turban", 12, ["headcovering"], [], []], + ["space helmet", 4, [], [], []], + ["tenugui", 12, ["headcovering"], [], []], + ["pom pom beanie", 12, ["headcovering"], [], []], +] +hairAccessoriesL = [ + ["hair ribbon", 12, [], ["female"], []], + ["hair bow", 12, [], ["female"], []], + ["hairband", 12, [], [], []], + ["headband", 12, [], [], []], + ["headdress", 12, [], ["female"], []], + ["veil", 12, [], ["female"], []], + ["hooded cloak", 12, [], [], []], + ["triangular headpiece", 12, [], [], []], + ["towel on head", 12, [], [], []], + ["lolita hairband", 12, [], ["female"], []], + ["horned headwear", 12, [], [], []], + ["bun cover", 12, [], ["female"], []], + ["hairpods", 12, [], [], []], + ["hachimaki", 12, [], [], []], + ["rabbit ear hairband", 4, [], ["female"], []], + ["cat ear hairband", 12, [], [], []], +] +hatDecorationsL = [ + ["hat bow", 12, [], [], []], + ["hat flower", 12, [], [], []], + ["hat ornament", 12, [], [], []], + ["hat ribbon", 12, [], [], []], + ["hat with ears", 12, [], [], []], + ["winged hat", 8, [], [], []], + ["ears through headwear", 1, [], [], []], +] +dressesAndAttireL = [ + ["dress, cocktail dress", 12, [], ["female"], []], + ["german clothes, dirndl", 5, [], ["female"], []], + ["dress, evening gown", 5, [], ["female"], []], + ["funeral dress", 5, [], ["female"], []], + ["gown", 5, ["strapped"], ["female"], []], + ["nightgown", 5, ["strapped"], ["female"], []], + ["pencil dress", 5, ["strapped"], ["female"], []], + ["sailor dress", 5, [], ["female"], []], + ["santa dress", 5, [], ["female"], []], + ["sundress", 5, [], ["female"], []], + ["sweater dress", 5, [], ["female"], []], + ["tube dress", 5, [], ["female"], []], + ["wedding dress", 5, [], ["female"], []], + ["fur-trimmed dress", 5, [], ["female"], []], + ["armored dress", 5, [], ["female"], []], + ["backless dress", 5, [], ["female"], []], + ["collared dress", 5, [], ["female"], []], + ["frilled dress", 5, ["buttons"], ["female"], []], + ["halter dress", 5, [], ["female"], []], + ["latex dress", 5, [], ["female"], []], + ["layered dress", 5, [], ["female"], []], + ["long dress", 5, [], ["female"], []], + ["off-shoulder dress", 5, [], ["female"], []], + ["pleated dress", 5, [], ["female"], []], + ["ribbed dress", 5, [], ["female"], []], + ["ribbon-trimmed dress", 5, [], ["female"], []], + ["short dress", 5, ["strapped"], ["female"], []], + ["see-through dress", 5, [], ["female"], []], + ["sleeveless dress", 5, [], ["female"], []], + ["strapless dress", 5, [], ["female"], []], + ["china dress", 5, [], ["female"], []], + ["camisole", 12, ["strapped"], ["female"], []], + ["babydoll", 12, ["strapped"], ["female"], []], + ["chemise", 12, ["strapped"], ["female"], []], + ["nightgown", 12, ["strapped"], ["female"], []], + ["pinafore dress", 12, [], ["female"], []], + ["see-through dress", 12, [], ["female"], []], + ["glitter dress", 12, ["strapped"], ["female"], []], + ["crinoline", 12, [], ["female"], []], + ["microdress", 12, [], ["female"], []], + ["highleg dress", 12, [], ["female"], []], + ["hobble dress", 12, [], ["female"], []], +] +socksAndStockingsL = [ + ["socks", 12, [], ["feel"], []], + ["kneehighs", 12, [], ["female", "feet"], []], + ["over-kneehighs", 12, ["legwear"], ["female", "legs"], []], + ["thighhighs", 16, ["legwear"], ["female", "legs"], []], + ["pantyhose", 8, [], ["female", "legs"], []], + ["thighband pantyhose", 8, [], ["female", "legs"], []], + ["leggings", 24, ["legwear"], ["female", "legs"], []], + ["leg warmers", 12, [], ["legs"], []], + ["loose socks", 12, [], ["feet"], []], + ["bobby socks", 12, [], ["feet", "female"], []], + ["frilled socks", 12, [], ["feet", "female"], []], +] +legwearStylesL = [ + ["fishnet legwear", 12, [], ["legwear"], []], + ["bow legwear", 12, [], ["legwear"], []], + ["ribbed legwear", 12, [], ["legwear"], []], + ["seamed legwear", 12, [], ["legwear"], []], + ["see-through legwear", 12, [], ["legwear"], []], + ["shiny legwear", 12, [], ["legwear"], []], + ["fur-trimmed legwear", 12, [], ["legwear"], []], + ["lace-trimmed legwear", 12, [], ["legwear"], []], + ["uneven legwear", 12, [], ["legwear"], []], + ["mismatched legwear", 12, [], ["legwear"], []], +] +topsAndShirtsL = [ + ["blouse", 12, ["buttons"], [], []], + ["frilled shirt", 12, ["shirt"], [], []], + ["sleeveless shirt", 12, ["shirt"], [], []], + ["bustier", 12, [], ["breasts"], []], + ["crop top", 12, ["strapped"], [], []], + ["cardigan", 12, [], [], []], + ["cardigan vest", 12, [], [], []], + ["coat", 12, [], [], []], + ["duffel coat", 12, [], [], []], + ["fur coat", 12, [], [], []], + ["fur-trimmed coat", 12, [], [], []], + ["long coat", 12, [], [], []], + ["overcoat", 12, [], [], []], + ["raincoat", 12, [], [], []], + ["trench coat", 12, [], [], []], + ["winter coat", 12, [], [], []], + ["compression shirt", 12, ["shirt"], [], []], + ["halterneck", 12, [], ["female"], []], + ["criss-cross halter", 12, [], ["female"], []], + ["hoodie", 12, [], [], []], + ["jacket", 12, ["zipper"], [], []], + ["blazer", 12, [], [], []], + ["cropped jacket", 12, [], [], []], + ["letterman jacket", 12, [], [], []], + ["safari jacket", 12, [], [], []], + ["suit jacket", 12, [], [], []], + ["leather jacket", 12, [], [], []], + ["poncho", 12, [], [], []], + ["raglan sleeves", 12, [], [], []], + ["shirt", 12, ["shirt"], [], []], + ["collared shirt", 12, ["buttons", "shirt"], [], []], + ["dress shirt", 12, ["shirt"], [], []], + ["off-shoulder shirt", 12, ["shirt"], [], []], + ["sleeveless shirt", 12, ["shirt"], [], []], + ["striped shirt", 12, ["shirt"], [], []], + ["t-shirt", 12, ["shirt"], [], []], + ["shrug (clothing)", 12, [], ["female"], []], + ["surcoat", 12, [], [], []], + ["sweater", 12, [], [], []], + ["turtleneck", 12, [], [], []], + ["sleeveless turtleneck", 12, [], [], []], + ["ribbed sweater", 12, [], [], []], + ["aran sweater", 12, [], [], []], + ["argyle sweater", 12, [], [], []], + ["virgin killer sweater", 12, [], ["female"], []], + ["open-chest sweater", 12, [], ["female"], []], + ["tabard", 12, [], [], []], + ["tailcoat", 12, [], [], []], + ["tank top", 12, [], [], []], + ["tube top", 12, [], ["female"], []], + ["bandeau", 12, [], ["female", "breasts"], []], + ["underbust", 12, [], ["female", "breasts"], []], + ["vest", 12, [], [], []], + ["sweater vest", 12, [], [], []], + ["waistcoat", 12, [], [], []], + ["chest sarashi", 12, [], [], []], + ["budget sarashi", 12, [], ["female", "breasts"], []], + ["tunic", 12, ["buttons"], [], []], + ["front-tie top", 12, [], ["female"], []], + ["breast curtains", 12, [], ["female", "breasts"], []], + ["pasties", 1, [], ["female"], []], + ["heart pasties", 1, [], ["female"], []], + ["cross pasties", 1, [], ["female"], []], + ["star pasties", 1, [], ["female"], []], + ["track jacket", 12, [], [], []], + ["strapless shirt", 12, [], ["female"], []], + ["bomber jacket", 12, [], [], []], + ["hawaiian shirt", 12, [], [], []], + ["tangzhuang", 12, [], [], []], + ["sleeveless hoodie", 12, [], [], []], + ["camouflage jacket", 12, [], [], []], + ["denim jacket", 12, [], [], []], + ["see-through jacket", 12, [], [], []], + ["duster coat", 12, [], [], []], +] +pantsAndBottomsL = [ + ["bloomers", 12, [], ["female"], []], + ["buruma", 12, [], ["female"], []], + ["chaps", 12, [], [], []], + ["pants", 12, [], [], []], + ["tight pants", 12, [], [], []], + ["baggy pants", 12, [], [], []], + ["bell-bottoms", 12, [], [], []], + ["capri pants", 12, [], [], []], + ["detached pants", 12, [], [], []], + ["jeans", 12, [], [], []], + ["lowleg pants", 12, [], [], []], + ["pants rolled up", 12, [], [], []], + ["yoga pants", 12, [], [], []], + ["pelvic curtain", 12, [], [], []], + ["petticoat", 12, [], ["female"], []], + ["shorts", 12, [], [], []], + ["bike shorts", 12, [], [], []], + ["denim shorts", 12, [], [], []], + ["dolphin shorts", 12, [], ["female"], []], + ["gym shorts", 12, [], [], []], + ["lowleg shorts", 12, [], [], []], + ["micro shorts", 12, [], ["female"], []], + ["short shorts", 12, [], [], []], + ["suspender shorts", 12, [], [], []], + ["shorts under skirt", 12, ["skirt"], ["female"], []], + ["skirt", 12, ["skirt"], ["female"], []], + ["bubble skirt", 12, ["skirt"], ["female"], []], + ["high-waist skirt", 12, ["skirt"], ["female"], []], + ["long skirt", 12, ["skirt"], ["female"], []], + ["lowleg skirt", 12, ["skirt"], ["female"], []], + ["microskirt", 12, ["skirt"], ["female"], []], + ["miniskirt", 12, ["skirt"], ["female"], []], + ["overall skirt", 12, ["skirt"], ["female"], []], + ["plaid skirt", 12, ["skirt"], ["female"], []], + ["pleated skirt", 12, ["skirt"], ["female"], []], + ["suspender skirt", 12, ["skirt"], ["female"], []], + ["showgirl skirt", 12, ["skirt"], ["female"], []], + ["sweatpants", 12, [], [], []], + ["track pants", 12, [], [], []], + ["loincloth", 12, [], [], []], + ["high-waist shorts", 12, [], [], []], + ["high-waist pants", 12, [], [], []], + ["camouflage pants", 12, [], [], []], + ["boxer briefs", 12, [], [], []], + ["dress pants", 12, [], [], []], +] +bootsAndFootwearL = [ + ["boots", 12, [], ["feet"], []], + ["ankle boots", 12, [], ["feet"], []], + ["armored boots", 12, [], ["feet"], []], + ["cowboy boots", 12, [], ["feet"], []], + ["knee boots", 12, [], ["feet"], []], + ["high heel boots", 12, [], ["feet", "female"], []], + ["lace-up boots", 12, [], ["feet"], []], + ["rubber boots", 12, [], ["feet"], []], + ["thigh boots", 12, [], ["feet"], []], + ["cross-laced footwear", 12, [], ["feet"], []], + ["dress shoes", 12, [], ["feet"], []], + ["flats", 12, [], ["feet"], []], + ["high heels", 12, [], ["feet", "female"], []], + ["stiletto heels", 12, [], ["feet", "female"], []], + ["loafers", 12, [], ["feet"], []], + ["mary janes", 12, [], ["feet"], []], + ["platform footwear", 12, [], ["feet"], []], + ["pointy footwear", 4, [], ["feet"], []], + ["pumps", 12, [], ["feet", "female"], []], + ["sandals", 12, [], ["feet"], []], + ["flip-flops", 12, [], ["feet"], []], + ["geta", 12, [], ["feet"], []], + ["gladiator sandals", 12, [], ["feet"], []], + ["okobo", 12, [], ["feet"], []], + ["zouri", 12, [], ["feet"], []], + ["slippers", 12, [], ["feet"], []], + ["animal slippers", 12, [], ["feet"], []], + ["ballet slippers", 12, [], ["feet", "female"], []], + ["crocs", 12, [], ["feet"], []], + ["uwabaki", 12, [], ["feet"], []], + ["sneakers", 12, [], ["feet"], []], + ["high tops", 12, [], ["feet"], []], + ["converse", 12, [], ["feet"], []], + ["toeless footwear", 12, [], ["feet"], []], + ["wedge heels", 12, [], ["feet", "female"], []], + ["tabi", 12, [], ["feet"], []], +] +armorsAndUniformsL = [ + ["armor", 12, [], [], []], + ["full armor", 12, [], [], []], + ["power armor", 12, [], [], []], + ["armored dress", 12, [], ["female"], []], + ["bikini armor", 12, [], ["female"], []], + ["band uniform", 12, [], [], []], + ["cassock", 12, [], [], []], + ["cheerleader", 12, [], ["female"], []], + ["ghost costume", 12, [], [], []], + ["business suit", 12, [], [], []], + ["pant suit", 12, ["shirt"], [], []], + ["skirt suit", 12, ["shirt", "skirt"], [], []], + ["tuxedo", 12, [], [], []], + ["gym uniform", 12, [], [], []], + ["habit", 12, [], ["female"], []], + ["harem outfit", 12, [], [], []], + ["hazmat suit", 12, [], [], []], + ["animal costume", 12, [], [], []], + ["maid", 8, ["skirt"], ["female"], []], + ["maid, victorian maid", 8, [], ["female"], []], + ["maid, wa maid", 8, [], ["female"], []], + ["unconventional maid, maid leotard", 4, [], ["female"], []], + ["unconventional maid, maid one-piece swimsuit", 4, [], ["female"], []], + ["miko", 12, [], ["female"], []], + ["military uniform", 12, [], [], []], + ["overalls", 12, [], [], []], + ["pajamas", 12, [], [], []], + ["pilot suit", 12, [], [], []], + ["sailor", 12, [], [], []], + ["santa costume", 12, [], [], []], + ["school uniform", 12, ["shirt"], [], []], + ["serafuku", 12, ["shirt"], ["female"], []], + ["track suit", 12, [], [], []], + ["tutu", 12, [], ["female"], []], + ["waitress", 12, [], ["female"], []], + ["cowboy western", 12, ["shirt"], [], []], + ["magical girl", 12, [], ["female"], []], + ["lab coat", 12, [], [], []], + ["idol, idol clothes", 12, [], [], []], + ["police", 12, [], [], []], + ["race queen", 12, [], ["female"], []], + ["bride", 12, [], ["female"], []], + ["knight", 12, [], [], []], + ["soccer uniform", 12, ["shirt"], [], []], + ["employee uniform", 12, ["shirt"], [], []], + ["dancer", 12, [], [], []], + ["spacesuit", 12, [], [], []], + ["gyaru", 12, [], ["female"], []], + ["kogal", 12, [], ["female"], []], + ["soldier", 12, [], [], []], + ["pirate costume", 12, [], [], []], + ["princess", 12, [], ["female"], []], + ["prince", 12, [], ["male"], []], + ["japanese clothes, samurai", 12, [], [], []], + ["priest", 12, [], ["male"], []], + ["priestess", 12, [], ["female"], []], + ["nun, traditional nun", 12, [], ["female"], []], + ["fundoshi", 12, [], ["male"], []], + ["fundoshi, shirt, front-tie top, ", 12, [], ["female"], []], + ["hakama", 12, [], [], []], + ["hakama short skirt", 12, [], [], []], + ["hakama pants", 12, [], [], []], + ["japanese clothes, kimono", 12, [], [], []], + ["japanese clothes, kimono, haori", 12, [], [], []], + ["japanese clothes, short kimono", 12, [], [], []], + ["japanese clothes, kimono, yukata", 12, [], [], []], + ["japanese clothes, kimono, furisode", 12, [], [], []], + ["japanese clothes, kimono, tasuki", 12, [], [], []], + ["playboy bunny", 12, [], ["female"], []], + ["reverse bunnysuit", 4, [], ["female"], []], + ["translucent bunnysuit", 12, [], ["female"], []], + ["cat lingerie", 6, [], ["female"], []], + ["dongtan dress", 12, [], ["female"], []], + ["heattech leotard", 12, [], ["female"], []], + ["hot limit", 12, [], [], []], + ["modakawa dress", 12, [], ["female"], []], + ["virgin destroyer sweater", 12, [], ["female"], []], + ["virgin killer outfit", 12, [], ["female"], []], + ["anna miller", 12, [], ["female"], []], + ["gakuran", 12, [], [], []], + ["kindergarten uniform", 12, [], [], []], + ["baseball uniform", 12, ["shirt"], [], []], + ["basketball uniform", 12, ["shirt"], [], []], + ["american football uniform", 12, ["shirt"], [], []], + ["tennis uniform", 12, ["shirt"], [], []], + ["track uniform", 12, ["shirt"], [], []], + ["scout uniform", 12, ["shirt"], [], []], + ["kigurumi", 12, [], [], []], + ["jersey maid", 12, [], ["female"], []], + ["tennis dress", 12, [], ["female"], []], + ["winter clothes", 12, [], [], []], + ["winter uniform", 12, [], [], []], + ["superhero costume", 12, [], [], []], + ["sportswear", 12, [], [], []], + ["sleepwear", 12, [], [], []], + ["office lady", 12, [], ["female"], []], + ["kariginu", 12, [], [], []], + ["jirai kei", 12, [], [], []], + ["jiangshi", 12, [], [], []], + ["ancient egyptian clothes", 12, [], [], []], + ["dougi", 12, [], [], []], + ["arabian clothes", 12, [], [], []], + ["greco-roman clothes", 12, [], [], []], + ["ainu clothes", 12, [], [], []], + ["spandex", 12, [], [], []], + ["wrestling outfit", 12, [], [], []], + ["ancient greek clothes", 12, [], [], []], + ["biker clothes", 12, [], [], []], + ["mummy costume", 12, [], [], []], + ["kappougi", 12, [], [], []], + ["japanese clothes, happi", 12, [], [], []], + ["tribal", 12, [], [], []], + ["loungewear", 12, [], [], []], + ["korean clothes, hanbok", 12, [], [], []], + ["onesie", 12, [], [], []], + ["native american", 12, [], [], []], + ["body armor", 12, [], [], []], + ["wa lolita, yukata, frills", 12, [], ["female"], []], + ["mizu happi", 12, [], [], []], + ["scale armor", 12, [], [], []], + ["amesuku gyaru", 12, [], ["female"], []], + ["butler", 12, [], ["male"], []], + ["female butler", 12, [], ["female"], []], + ["wolf costume", 12, [], [], []], + ["aristocratic clothes", 12, [], [], []], + ["housewife", 12, [], ["female"], []], + ["sukeban, delinquent, sarashi, long skirt", 12, [], ["female"], []], + ["dinosaur costume", 12, [], [], []], +] +zipperedOutfitsL = [ + ["bikesuit", 12, ["zipper"], [], []], + ["racing suit", 12, ["zipper"], [], []], + ["bodysuit", 12, ["zipper"], [], []], + ["jumpsuit", 12, ["zipper"], [], []], + ["short jumpsuit", 12, ["zipper"], [], []], + ["leotard", 12, [], ["female"], []], + ["strapless leotard", 12, ["female"], [], []], + ["thong leotard", 12, [], ["female"], []], + ["robe", 12, [], [], []], + ["unitard", 12, [], [], []], + ["sleeveless turtleneck leotard", 12, [], ["female"], []], + ["turtleneck leotard", 12, [], ["female"], []], + ["frilled leotard", 12, [], ["female"], []], + ["ribbed bodysuit", 12, [], [], []], + ["ribbed leotard", 12, [], ["female"], []], +] +swimwearL = [ + ["swimsuit", 12, [], [], []], + ["one-piece swimsuit", 12, [], ["female"], []], + ["casual one-piece swimsuit", 12, [], ["female"], []], + ["competition swimsuit", 12, [], ["female"], []], + ["slingshot swimsuit", 12, [], ["female"], []], + ["square bikini", 12, ["strapped"], ["female"], []], + ["school swimsuit", 12, [], ["female"], []], + ["bikini", 12, [], ["female"], []], + ["string bikini", 12, ["strapped"], ["female"], []], + ["micro bikini", 12, ["strapped"], ["female"], []], + ["lowleg bikini", 12, ["strapped"], ["female"], []], + ["thong bikini", 12, ["strapped"], ["female"], []], + ["sports bikini", 12, ["strapped"], ["female"], []], + ["swim briefs", 12, [], ["male"], []], + ["rash guard", 12, [], [], []], + ["wetsuit", 12, [], [], []], + ["front-tie bikini top", 12, ["strapped"], ["female"], []], + ["o-ring bikini", 12, ["strapped"], ["female"], []], + ["strapless bikini", 12, [], ["female"], []], + ["maid bikini", 12, ["strapped"], ["female"], []], + ["swim trunks", 12, [], ["male"], []], + ["swim trunks, bikini top only", 12, ["strapped"], ["female"], []], + ["gris swimsuit", 12, [], ["female"], []], + ["front zipper swimsuit", 12, ["zipper"], ["female"], []], + ["dress swimsuit", 12, [], ["female"], []], +] +accessoriesAndOuterwearL = [ + ["apron", 12, [], [], []], + ["cape", 12, [], [], []], + ["hooded cape", 12, [], [], []], + ["capelet", 12, [], [], []], + ["hooded capelet", 12, [], [], []], + ["hood", 12, [], [], []], + ["bodystocking", 12, [], ["female"], []], + ["ascot", 12, [], [], []], + ["bowtie", 12, [], [], []], + ["choker", 12, [], [], []], + ["collar", 12, [], [], []], + ["epaulettes", 12, [], [], []], + ["lapels", 12, [], [], []], + ["neck ruff", 12, [], [], []], + ["neckerchief", 12, [], [], []], + ["necklace", 12, [], [], []], + ["necktie", 12, [], [], []], + ["neck ribbon", 12, [], [], []], + ["scarf", 12, [], [], []], + ["shawl", 12, [], [], []], + ["anklet", 12, [], [], []], + ["arm belt", 12, [], [], []], + ["armband", 12, [], [], []], + ["armlet", 12, [], [], []], + ["bracelet", 12, [], [], []], + ["bangle", 12, [], [], []], + ["spiked bracelet", 12, [], [], []], + ["bridal gauntlets", 12, [], ["female"], []], + ["detached sleeves", 12, [], [], []], + ["arm warmers", 12, [], [], []], + ["gloves", 12, [], [], []], + ["fingerless gloves", 12, [], [], []], + ["elbow gloves", 12, [], [], []], + ["half gloves", 12, [], [], []], + ["single glove", 12, [], [], []], + ["single elbow glove", 12, [], [], []], + ["mittens", 12, [], [], []], + ["leg belt", 12, [], [], []], + ["ring", 12, [], [], []], + ["thighlet", 12, [], [], ["nolegs"]], + ["wide sleeves", 12, [], [], []], + ["wristband", 12, [], [], []], + ["wrist cuffs", 12, [], [], []], + ["wrist scrunchie", 12, [], [], []], + ["badge", 12, [], [], []], + ["belt", 12, [], [], []], + ["brooch", 12, [], [], []], + ["buttons", 12, [], [], []], + ["collar chain", 12, [], [], []], + ["corsage", 12, [], [], []], + ["cuff links", 12, [], [], []], + ["pentacle", 12, [], [], []], + ["sarong", 12, [], ["female"], []], + ["sash", 12, [], [], []], + ["suspenders", 12, [], [], []], + ["tassel", 12, [], [], []], + ["clothing cutout", 12, [], [], []], + ["flower trim", 12, [], [], []], + ["frills", 12, [], [], []], + ["gold trim", 12, [], [], []], + ["lace trim", 12, [], [], []], + ["ribbon trim", 12, [], [], []], + ["see-through", 12, [], [], []], + ["silver trim", 12, [], [], []], + ["torn clothes", 12, [], [], []], + ["earrings", 12, [], [], []], + ["hoop earrings", 12, [], [], []], + ["stud earrings", 12, [], [], []], + ["sphere earrings", 12, [], [], []], + ["single earring", 12, [], [], []], + ["earclip", 12, [], [], []], + ["glasses", 12, [], [], []], + ["monocle", 12, [], [], []], + ["hair ornament", 12, [], ["female"], []], + ["hair beads", 12, [], ["female"], []], + ["hair bobbles", 12, [], ["female"], []], + ["hairclip", 12, [], ["female"], []], + ["hairpin", 12, [], ["female"], []], + ["hair scrunchie", 12, [], ["female"], []], + ["hair stick", 12, [], ["female"], []], + ["hair flower", 12, [], ["female"], []], + ["hair bell", 12, [], ["female"], []], + ["mask", 12, [], [], []], + ["surgical mask", 12, [], [], []], + ["sleeves pushed up", 12, [], [], []], + ["sleeves rolled up", 12, [], [], []], + ["short sleeves", 12, [], [], []], + ["long sleeves", 12, [], [], []], + ["very long sleeves", 12, [], [], []], + ["short over long sleeves", 12, [], [], []], + ["sleeves past wrists", 12, [], ["body"], []], + ["sleeves past fingers", 12, [], ["body"], []], + ["sleeves past elbows", 12, [], ["body"], []], + ["puffy sleeves", 12, [], [], []], + ["sleeveless", 12, [], [], []], + ["goggles", 12, [], [], []], + ["sunglasses", 12, [], [], []], + ["coke-bottle glasses", 12, [], [], ["eyes"]], + ["opaque glasses", 12, 12, [], [], ["eyes"]], + ["safety glasses", 12, [], [], []], + ["ski goggles", 12, [], [], []], + ["bespectacled", 12, [], [], []], + ["ear piercing", 12, [], [], []], + ["eyebrow piercing", 12, [], [], []], + ["lip piercing", 12, [], [], []], + ["nose piercing", 12, [], [], []], + ["tongue piercing", 12, [], [], []], + ["navel piercing", 12, [], [], []], + ["zipper", 12, [], [], []], + ["zettai ryouiki", 12, [], ["body"], []], + ["wristwatch", 12, [], [], []], + ["x hair ornament", 12, [], ["female"], []], + ["wing collar", 12, [], [], []], + ["whisker markings", 12, [], [], []], + ["wet", 12, [], [], []], + ["wand", 12, [], [], []], + ["waist apron", 12, [], [], []], + ["veins", 12, [], [], []], + ["vambraces", 12, [], [], []], + ["valentine", 12, [], [], []], + ["underboob", 12, [], ["breasts"], []], + ["umbrella", 12, [], [], []], + ["parasol", 12, [], [], []], + ["under-rim eyewear", 12, [], [], []], + ["unbuttoned", 12, [], ["buttons"], []], + ["tray", 12, [], [], []], + ["toenail polish", 12, [], ["female", "feet", "barefoot"], []], + ["tentacles", 12, [], [], []], + ["tattoo", 12, [], [], []], + ["tanlines", 12, [], [], []], + ["swimsuit under clothes", 12, [], ["female"], []], + ["sweat", 12, [], [], []], + ["striped", 12, [], [], []], + ["strap slip", 12, [], ["strapped"], []], + ["strap gap", 12, [], ["strapped", "breasts"], []], + ["star print", 12, [], [], []], + ["spikes", 12, [], [], []], + ["sideboob", 12, [], ["breasts"], []], + ["side slit", 12, [], [], []], + ["shoulder armor", 12, [], [], []], + ["shoulder bag", 12, [], [], []], + ["shoulder cutout", 12, [], [], []], + ["shoulder tattoo", 12, [], [], []], + ["shirt tucked in", 12, [], ["shirt"], []], + ["shiny clothes", 12, [], [], []], + ["sharp teeth", 12, [], [], []], + ["sharp fingernails", 12, [], [], []], + ["saliva", 12, [], [], []], + ["pouch", 12, [], [], []], + ["polka dot", 12, [], [], []], + ["pom pom (clothes)", 12, [], [], []], + ["pocket", 12, [], [], []], + ["revealing clothes", 12, [], [], []], + ["ribbon", 12, [], [], []], + ["ribbon choker", 12, [], [], []], + ["randoseru", 12, [], [], []], + ["semi-rimless eyewear", 12, [], [], []], + ["scrunchie", 12, [], [], []], + ["school bag", 12, [], [], []], + ["plaid", 12, [], [], []], + ["pendant", 12, [], [], []], + ["pauldrons", 12, [], [], []], + ["partially unbuttoned", 12, [], ["buttons"], []], + ["paw gloves", 12, [], [], []], + ["open clothes", 12, [], [], []], + ["off shoulder", 12, [], [], []], + ["o-ring top", 12, [], [], []], + ["neck bell", 12, [], [], []], + ["navel cutout", 12, [], [], []], + ["mustache", 12, [], ["male"], []], + ["wings", 12, [], [], []], + ["low wings", 12, [], [], []], + ["lipstick", 21, [], [], []], + ["leg ribbon", 12, [], ["legs"], []], + ["leash", 12, [], [], []], + ["lace", 12, [], [], []], + ["knee pads", 12, [], ["legs"], []], + ["kemonomimi mode", 12, [], [], []], + ["juliet sleeves", 12, [], [], []], + ["joints", 12, [], [], []], + ["jewelry", 12, [], [], []], + ["jacket on shoulders", 12, [], [], []], + ["impossible clothes", 12, [], [], []], + ["ice wings", 12, [], [], []], + ["horns", 12, [], [], []], + ["curled horns", 12, [], [], []], + ["small horns", 12, [], [], []], + ["cone horns", 12, [], [], []], + ["uneven horns", 12, [], [], []], + ["highleg", 12, [], [], []], + ["high collar", 12, [], [], []], + ["helmet", 12, ["headcovering"], [], ["headcovering"]], + ["mouth mask", 12, [], [], []], + ["midriff peek", 12, [], [], []], + ["midriff", 12, [], [], []], + ["mechanical arms", 12, [], [], []], + ["mask on head", 12, ["headcovering"], [], ["headcovering"]], + ["makeup", 12, [], ["female"], []], + ["long fingernails", 12, [], [], []], + ["halo", 12, [], [], []], + ["hair tubes", 12, [], ["female"], []], + ["gauntlets", 12, [], [], []], + ["garter straps", 12, [], ["legs"], []], + ["fur trim", 12, [], [], []], + ["floating hair", 12, [], [], []], + ["fangs", 12, [], [], []], + ["fang out", 12, [], [], []], + ["facial mark", 12, [], [], []], + ["facial hair", 12, [], ["male"], []], + ["eyeshadow", 12, [], [], []], + ["eyes visible through hair", 12, [], [], []], + ["eyepatch", 12, [], [], []], + ["eyeliner", 12, [], [], []], + ["eyelashes", 12, [], [], []], + ["eyebrows", 12, [], [], []], + ["eyewear on head", 12, [], [], []], + ["earmuffs", 12, [], [], []], + ["covered navel", 12, [], [], []], + ["corset", 12, [], ["female", "breasts"], []], + ["contemporary", 12, [], [], []], + ["colored eyelashes", 12, [], [], []], + ["cleavage cutout", 12, [], ["breasts"], []], + ["cleavage", 12, [], ["breasts"], []], + ["claws", 12, [], [], []], + ["center opening", 12, [], [], []], + ["center frills", 12, [], [], []], + ["breasts apart", 12, [], ["breasts"], []], + ["breastplate", 12, [], [], []], + ["breast pocket", 12, [], [], []], + ["bracer", 12, [], [], []], + ["blood on clothes", 6, [], [], []], + ["blood on face", 6, [], [], []], + ["blindfold", 12, [], [], []], + ["bare shoulders", 12, [], [], []], + ["bare arms", 12, [], [], []], + ["bare legs", 12, [], ["legs"], []], + ["bandaid on face", 12, [], [], []], + ["bandaid", 12, [], [], []], + ["bandages", 12, [], [], []], + ["bandaged leg", 12, [], ["legs"], []], + ["bandaged arm", 12, [], [], []], + ["backpack", 12, [], [], []], + ["backless outfit", 12, [], [], []], + ["back bow", 12, [], [], []], + ["ass visible through thighs", 12, [], ["legs"], []], + ["armpits", 12, [], [], []], + ["armpit crease", 12, [], [], []], + ["armpit peed", 12, [], [], []], + ["arm tattoo", 12, [], [], []], + ["animal print", 12, [], [], []], + ["clothes around waist", 12, [], [], []], + ["headphones around neck", 12, [], [], []], + ["oversized clothes", 12, [], [], []], + ["manly", 12, [], [], []], + ["greaves", 12, [], [], []], + ["one-eyed", 12, [], [], []], + ["fur-trimmed sleeves", 12, [], [], []], + ["polka dot bow", 12, [], [], []], + ["harness", 3, [], [], []], + ["forehead jewel", 12, [], [], []], + ["forehead mark", 12, [], [], []], + ["single bare shoulder", 12, [], [], []], + ["spiked collar", 12, [], [], []], + ["striped necktie", 12, [], [], []], + ["arm guards", 12, [], [], []], + ["undershirt", 12, [], [], []], + ["latex", 12, [], [], []], + ["bandaid on leg", 12, [], [], []], + ["bead necklace", 12, [], [], []], + ["dirty", 12, [], [], []], + ["giantess", 12, [], ["female"], []], + ["cyborg", 12, [], [], []], + ["bruise", 12, [], [], []], + ["extra arms", 12, [], [], []], + ["taut shirt", 12, [], [], []], + ["chest jewel", 12, [], [], []], + ["v-neck", 12, [], [], []], + ["plaid scarf", 12, [], [], []], + ["prosthesis", 12, [], [], []], + ["single mechanical arm", 12, [], [], []], + ["blood on hands", 12, [], [], []], + ["bandaid on nose", 12, [], [], []], + ["robot joints", 12, [], [], []], + ["zombie", 12, [], [], []], + ["tail ribbon", 12, [], [], []], + ["tomboy", 12, [], ["female"], []], + ["panty peek", 12, [], [], []], + ["leg tattoo", 12, [], [], []], + ["lanyard", 12, [], [], []], + ["bra visible through clothes", 12, [], [], []], + ["amputee", 12, [], [], []], + ["bra strap", 12, ["shirt"], ["female", "breasts"], []], + ["money", 12, [], [], []], + ["revolver", 12, [], [], []], + ["pearl necklace", 12, [], [], []], + ["coat on shoulders", 12, [], [], []], + ["chest harness", 4, [], [], []], + ["slime (substance)", 12, [], [], []], + ["partially unzipped", 12, [], ["zipper"], []], + ["bodypaint", 12, [], [], []], + ["metal collar", 12, [], [], []], + ["loose necktie", 12, [], [], []], + ["clover", 12, [], [], []], + ["body markings", 12, [], [], []], + ["mechanical wings", 12, [], [], []], + ["leaf print", 12, [], [], []], + ["pentagram", 12, [], [], []], + ["neon trim", 12, [], [], []], + ["prosthetic arm", 12, [], [], []], + ["bandage over one eye", 12, [], [], []], + ["mascara", 12, [], [], []], + ["cat ear headphones", 12, [], [], []], + ["cuts", 12, [], [], []], + ["jacket around waist", 12, [], ["legs"], []], + ["bleeding", 12, [], [], []], + ["rectangular eyewear", 12, [], [], []], + ["chain necklace", 12, [], [], []], + ["paw shoes", 12, [], [], []], + ["feather trim", 12, [], [], []], + ["gold chain", 12, [], [], []], + ["mechanical parts", 12, [], [], []], + ["mechanical legs", 12, [], [], ["nolegs"]], + ["eye mask", 12, [], [], []], + ["scratches", 12, [], [], []], + ["cross scar", 12, [], [], []], + ["tusks", 12, [], [], []], + ["dragon print", 12, [], [], []], + ["sun symbol", 12, [], [], []], + ["uneven sleeves", 12, [], [], []], + ["energy wings", 12, [], [], []], + ["cat print", 12, [], [], []], + ["sweatband", 12, [], [], []], + ["sweater around waist", 12, [], ["legs"], []], + ["glowing sword", 12, [], [], []], + ["fanny pack", 12, [], ["legs"], []], + ["blood stain", 12, [], [], []], + ["single pauldron", 12, [], [], []], + ["energy ball", 12, [], [], []], + ["scepter", 12, [], [], []], + ["cherry blossom print", 12, [], [], []], + ["insect wings", 12, [], [], []], + ["constellation print", 12, [], [], []], + ["utility belt", 12, [], [], []], + ["prosthetic leg", 12, [], [], ["nolegs"]], + ["very sweaty", 12, [], [], []], + ["scales", 12, [], [], []], + ["fake animal ears", 12, [], [], []], + ["elbow pads", 12, [], [], []], + ["plunging neckline", 12, [], [], []], + ["waist cape", 12, [], [], []], + ["waist bow", 12, [], ["female"], []], + ["vertical stripes", 12, [], [], []], + ["v-neck", 12, [], [], []], + ["undersized clothes", 12, [], [], []], + ["towel around neck", 12, [], [], []], + ["taut clothes", 12, [], [], []], + ["tassel hair ornament", 12, [], ["female"], []], + ["talisman", 12, [], [], []], + ["tail, tail wagging", 12, [], [], []], + ["tail, tail raised", 12, [], [], []], + ["tail, tail bow", 12, [], [], []], + ["striped clothes", 12, [], [], []], + ["stitches", 12, [], [], []], + ["steaming body", 12, [], [], []], + ["skin fang", 12, [], [], []], + ["skin fangs", 12, [], [], []], + ["skin tight", 12, [], [], []], + ["skin-covered horns", 12, [], [], []], + ["skindentation", 12, [], ["female"], []], + ["single sleeve", 12, [], [], []], + ["single horn", 12, [], [], []], + ["sideless outfit", 12, [], ["female"], []], + ["side cutout", 12, [], [], []], + ["short necktie", 12, [], [], []], + ["short eyebrows", 12, [], [], []], + ["round teeth", 12, [], [], []], + ["reindeer antlers", 12, [], [], []], + ["rabbit hair ornament", 12, [], [], []], + ["popped collar", 12, [], [], []], + ["pinstripe pattern", 12, [], [], []], + ["pince-nez", 12, [], [], []], + ["pendant choker", 12, [], [], []], + ["neck ring", 12, [], [], []], + ["multiple wings", 12, [], [], []], + ["multiple horns", 12, [], [], []], + ["mind control", 12, [], [], []], + ["shoulder spikes", 12, [], [], []], + ["shoulder pads", 12, [], [], []], + ["shoulder blades", 12, [], [], ["front"]], + ["median furrow", 12, [], [], ["front"]], + ["medical eyepatch", 12, [], [], []], + ["mechabare", 12, [], [], []], + ["material growth", 12, [], [], []], + ["mandarin collar", 12, [], [], []], + ["magatama", 12, [], [], []], + ["layered clothes", 12, [], [], []], + ["layered sleeves", 12, [], [], []], + ["large tail", 12, [], [], []], + ["notched ear", 12, [], [], []], + ["notched lapels", 12, [], [], []], + ["jingle bell", 12, [], [], []], + ["injury", 12, [], [], []], + ["high collar", 12, [], [], []], + ["hagoromo", 12, [], [], []], + ["gothic lolita", 12, [], ["female"], []], + ["gas mask", 12, [], [], []], + ["framed breasts", 12, [], ["breasts"], []], + ["flame-tipped tail", 12, [], [], []], + ["fake horns", 12, [], [], []], + ["fake animal ears", 12, [], [], []], + ["dot nose", 12, [], [], []], + ["detached wings", 12, [], [], []], + ["cowbell", 12, [], [], []], + ["colored extremities", 12, [], [], []], + ["colored eyelashes", 12, [], [], []], + ["bursting breasts", 12, [], ["breasts"], []], + ["buckle", 12, [], [], []], + ["body fur", 12, [], [], []], + ["body blush", 12, [], [], []], + ["beard stubble", 12, [], ["male"], []], + ["beard", 12, [], ["male"], []], + ["thick beard", 12, [], ["male"], []], + ["very long beard", 12, [], ["male"], []], + ["goatee stubble", 12, [], ["male"], []], + ["bare hips", 12, [], [], []], + ["star choker", 12, [], [], []], + ["nape", 12, [], [], []], + ["teardrop facial mark", 12, [], [], []], + ["mechanical tail", 12, [], [], []], + ["single off shoulder", 12, [], [], []], + ["hands in opposite sleeves", 12, [], [], []], + ["gorget", 12, [], [], []], + ["hikimayu", 12, [], [], []], + ["pearl (gemstone)", 12, [], [], []], + ["collared cape", 12, [], [], []], + ["fiery hair", 12, [], [], []], + ["stitched face", 12, [], [], []], + ["burning", 12, [], [], []], + ["star necklace", 12, [], [], []], + ["patchwork skin", 12, [], [], []], + ["mouth veil", 12, [], [], []], + ["stole", 12, [], [], []], + ["star facial mark", 12, [], [], []], + ["bow choker", 12, [], ["female"], []], + ["buck teeth", 12, [], [], []], + ["prehensile hair", 12, [], [], []], + ["diving mask", 12, [], [], []], + ["loose hair strand", 12, [], [], []], + ["neck fur", 12, [], [], []], + ["fake antlers", 12, [], [], []], + ["loose bowtie", 12, [], [], []], + ["broken halo", 12, [], [], []], + ["very long fingernails", 12, [], [], []], + ["forked tongue", 12, [], [], []], + ["digitigrade", 12, [], [], []], + ["spiked tail", 12, [], [], []], + ["large wings", 12, [], [], []], + ["dark halo", 12, [], [], []], + ["mechanical ears", 12, [], [], []], + ["bruise on face", 12, [], [], []], + ["white halo", 12, [], [], []], + ["sweaty clothes", 12, [], [], []], + ["transparent wings", 12, [], [], []], + ["magatama earrings", 12, [], [], []], + ["spiked halo", 12, [], [], []], + ["crystal hair", 12, [], [], []], + ["artificial eye", 12, [], [], []], + ["fake mustache", 12, [], [], []], + ["pointy nose", 12, [], [], []], + ["button eyes", 12, ["eyes"], [], ["eyes", "noeyes"]], + ["bolo tie", 12, [], [], []], + ["fiery horns", 12, [], [], []], + ["sparkle print", 12, [], [], []], + ["liquid hair", 12, [], [], []], + ["frilled ascot", 12, [], [], []], + ["baggy clothes", 12, [], [], []], + ["aegyo sal", 12, [], ["female"], []], + ["glowing wings", 12, [], [], []], + ["glowing horns", 12, [], [], []], + ["diamond (gemstone)", 12, [], [], []], + ["paint splatter on face", 12, [], [], []], + ["long nose", 12, [], [], []], + ["studded choker", 12, [], [], []], + ["webbed hands", 12, [], [], []], + ["shiny hair", 12, [], [], []], + ["glitter", 12, [], [], []], + ["warrior", 12, [], [], []], + ["sparkling aura", 12, [], [], []], + ["fiery tail", 12, [], [], []], + ["gingham", 12, [], [], []], + ["lazy eye", 12, [], [], []], + ["scorpion tail", 12, [], [], []], + ["dinosaur tail", 12, [], [], []], + ["lei, flower necklace", 12, [], [], []], + ["loving aura", 12, [], [], []], + ["skeletal hand", 6, [], [], []], +] +facialExpressionsL = [ + ["wince", 12, [], [], []], + ["wide-eyed", 12, [], [], []], + ["tears", 12, [], [], []], + ["triangle mouth", 12, [], [], []], + ["trembling", 12, [], [], []], + ["tongue out", 12, [], [], []], + ["tearing up", 12, [], [], []], + ["sweatdrop", 12, [], [], []], + ["surprised", 12, [], [], []], + ["spoken heart", 12, [], [], []], + ["spoken question mark", 12, [], [], []], + ["spoken ellipsis", 12, [], [], []], + ["smug", 12, [], [], []], + ["smirk", 12, [], [], []], + ["smile", 12, [], [], []], + ["serious", 12, [], [], []], + ["shaded face", 12, [], [], []], + ["pout", 12, [], [], []], + ["parted lips", 12, [], [], []], + ["o_o", 12, [], [], []], + ["notice lines", 12, [], [], []], + ["nose blush", 12, [], [], []], + ["naughty face", 12, [], [], []], + ["light smile", 12, [], [], []], + ["light blush", 12, [], [], []], + ["licking lips", 12, [], [], []], + ["laughing", 12, [], [], []], + ["heavy breathing", 12, [], [], []], + ["happy", 12, [], [], []], + ["half-closed eyes", 12, [], [], []], + ["grin", 12, [], [], []], + ["frown", 12, [], [], []], + ["flying sweatdrops", 12, [], [], []], + ["expressionless", 12, [], [], []], + ["evil smile", 12, [], [], []], + ["embarrassed", 12, [], [], []], + ["drunk", 12, [], [], []], + ["crying with eyes open", 12, [], [], []], + ["crying", 12, [], [], []], + ["closed eyes", 12, ["eyes"], [], ["eyes", "noeyes"]], + ["clenched teeth", 12, [], [], []], + ["chestnut mouth", 12, [], [], []], + ["blush stickers", 12, [], [], []], + ["blush", 12, [], [], []], + ["angry", 12, [], [], []], + ["anger vein", 12, [], [], []], + ["ahegao", 1, [], [], []], + ["^_^", 12, [], [], []], + ["@_@", 12, [], [], []], + ["?", 12, [], [], []], + [">:)", 12, [], [], []], + ["=_=", 12, ["eyes"], [], ["eyes", "noeyes"]], + [";d", 12, [], [], []], + [";)", 12, [], [], []], + [":t", 12, [], [], []], + [":q", 12, [], [], []], + [":p", 12, [], [], []], + [":o", 12, [], [], []], + [":d", 12, [], [], []], + [":>", 12, [], [], []], + [":<", 12, [], [], []], + [":3", 12, [], [], []], + ["...", 12, [], [], []], + ["+_+", 12, [], [], []], + ["+++", 12, [], [], []], + ["!?", 12, [], [], []], + ["!", 12, [], [], []], + ["annoyed", 12, [], [], []], + ["spoken exclamation mark", 12, [], [], []], + ["sad", 12, [], [], []], + [":/", 12, [], [], []], + ["!!", 12, [], [], []], + ["nervous", 12, [], [], []], + ["0_0", 12, ["eyes"], [], ["eyes", "noeyes"]], + [";o", 12, [], [], []], + ["seductive smile", 12, [], [], []], + ["torogao", 1, [], [], []], + ["d:", 12, [], [], []], + ["sleepy", 12, [], [], []], + ["ear blush", 12, [], [], []], + ["nervous sweating", 12, [], [], []], + ["puff of air", 12, [], [], []], + ["spoken musical note", 12, [], [], []], + ["glaring", 12, [], [], []], + [";p", 12, [], [], []], + ["shy", 12, [], [], []], + ["streaming tears", 12, [], [], []], + ["spoken blush", 12, [], [], []], + [">:(", 12, [], [], []], + ["evil grin", 12, [], [], []], + ["nervous smile", 12, [], [], []], + [";q", 12, [], [], []], + ["spoken squiggle", 12, [], [], []], + ["spoken interrobang", 12, [], [], []], + ["thinking", 12, [], [], []], + ["puckered lips", 12, [], [], []], + ["screaming", 12, [], [], []], + ["spoken anger vein", 12, [], [], []], + ["dot mouth", 12, [], [], []], + ["grimace", 12, [], [], []], + [";3", 12, [], [], []], + ["confused", 12, [], [], []], + ["worried", 12, [], [], []], + ["u_u", 12, ["eyes"], [], ["eyes", "noeyes"]], + ["raised eyebrows", 12, [], [], []], + ["uneven eyes", 12, [], [], []], + ["turn pale", 12, [], [], []], + ["squeans", 12, [], [], []], + ["split mouth", 12, [], [], []], + ["sideways glance", 12, [], [], []], + ["scowl", 12, [], [], []], + ["head tilt", 12, [], [], []], + ["furrowed brow", 12, [], [], []], + ["drooling", 12, [], [], []], + ["averting eyes", 12, [], [], []], + ["^_^", 12, ["eyes"], [], ["eyes", "noeyes"]], + [">_<", 12, ["eyes"], [], ["eyes", "noeyes"]], + ["x_x", 12, ["eyes"], [], ["eyes", "noeyes"]], + [">:)", 12, [], [], []], + [">:(", 12, [], [], []], + [";q", 12, [], [], []], + [";d", 12, [], [], []], + [";)", 12, [], [], []], + ["> o", 12, [], [], []], + ["snot", 4, [], [], []], + ["upturned eyes", 12, [], [], []], + ["unusually open eyes", 12, [], [], []], + ["crazy smile", 12, [], [], []], + ["happy tears", 12, [], [], []], + ["o3o", 12, [], [], []], + ["flustered", 12, [], [], []], + ["nose bubble", 12, [], [], []], + ["false smile", 12, [], [], []], + ["disgust", 12, [], [], []], + ["excited", 12, [], [], []], + ["._.", 12, ["eyes"], [], ["eyes", "noeyes"]], + ["puffy cheeks", 12, [], [], []], + ["blank stare", 12, [], [], []], + ["determined", 12, [], [], []], + ["pouty lips", 12, [], [], []], + ["gesugao", 12, [], [], []], + ["panicking", 12, [], [], []], + ["forced smile", 12, [], [], []], + [";(", 12, [], [], []], + [":c", 12, [], [], []], + ["sad smile", 12, [], [], []], + ["happy aura", 12, [], [], []], +] +yearlyThemesL = [ + ["year 2005", 12, [], [], []], + ["year 2006", 12, [], [], []], + ["year 2007", 12, [], [], []], + ["year 2008", 12, [], [], []], + ["year 2009", 12, [], [], []], + ["year 2010", 12, [], [], []], + ["year 2011", 12, [], [], []], + ["year 2012", 12, [], [], []], + ["year 2013", 12, [], [], []], + ["year 2014", 12, [], [], []], + ["year 2015", 12, [], [], []], + ["year 2016", 12, [], [], []], + ["year 2017", 12, [], [], []], + ["year 2018", 12, [], [], []], + ["year 2019", 12, [], [], []], + ["year 2020", 12, [], [], []], + ["year 2021", 12, [], [], []], + ["year 2022", 12, [], [], []], + ["year 2023", 12, [], [], []], + ["year 2024", 12, [], [], []], +] +sceneElementsL = [ + ["wooden floor", 12, ["floor"], [], ["below"]], + ["window", 12, [], [], []], + ["water drop", 12, [], [], []], + ["water", 12, [], [], []], + ["wall", 12, [], [], []], + ["underwater", 12, [], [], []], + ["torii", 12, ["location"], [], ["location"]], + ["tatami", 12, ["floor"], [], ["below"]], + ["steam", 12, [], [], []], + ["starry sky", 12, [], [], ["above"]], + ["stairs", 12, [], [], []], + ["space", 12, ["location"], [], ["location"]], + ["snow", 12, [], [], []], + ["snowing", 12, [], [], []], + ["smoke", 12, [], [], []], + ["sky", 12, [], [], ["above"]], + ["shadow", 12, [], [], []], + ["shade", 12, [], [], []], + ["sand", 12, [], [], []], + ["road", 12, ["location"], [], ["location"]], + ["reflection", 12, [], [], []], + ["rain", 12, [], [], []], + ["railing", 12, [], [], []], + ["pool", 12, [], [], []], + ["palm tree", 12, [], [], []], + ["outdoors", 12, ["location"], [], ["location"]], + ["onsen", 12, ["location"], [], ["location"]], + ["ocean", 12, "location", [], ["location"]], + ["night sky", 12, [], [], ["above"]], + ["night", 12, [], [], []], + ["nature", 12, [], [], []], + ["moon", 12, [], [], []], + ["mountain", 12, [], [], []], + ["indoors", 12, ["location"], [], ["location"]], + ["horizon", 12, [], [], []], + ["grass", 12, [], [], []], + ["full moon", 12, [], [], []], + ["frog", 12, [], [], []], + ["forest", 12, ["location"], [], ["location"]], + ["field", 12, ["location"], [], ["location"]], + ["fence", 12, [], [], []], + ["desk", 12, [], [], []], + ["day", 12, [], [], []], + ["curtains", 12, [], [], []], + ["couch", 12, ["location"], [], ["location"]], + ["cloudy sky", 12, [], [], ["above"]], + ["cloud", 12, [], [], []], + ["classroom", 12, ["location"], [], ["location"]], + ["cityscape", 12, ["location"], [], ["location"]], + ["city", 12, ["location"], [], ["location"]], + ["bush", 12, [], [], []], + ["building", 12, ["location"], [], ["location"]], + ["bookshelf", 12, [], [], []], + ["bedroom", 12, ["location"], [], ["location"]], + ["bed", 12, [], [], []], + ["beach", 12, ["location"], [], ["location"]], + ["bath", 12, ["location"], [], ["location"]], + ["vines", 12, [], [], []], + ["bamboo", 12, [], [], []], + ["house", 12, ["location"], [], ["location"]], + ["ruins", 12, ["location"], [], ["location"]], + ["crescent moon", 12, [], [], []], + ["sliding doors", 12, [], [], []], + ["brick wall", 12, [], [], []], + ["east asian architecture", 12, [], [], []], + ["futon", 12, [], [], []], + ["bridge", 12, [], [], []], + ["planet", 12, [], [], []], + ["shelf", 12, [], [], []], + ["bare tree", 12, [], [], []], + ["street", 12, ["location"], [], ["location"]], + ["river", 12, ["location"], [], ["location"]], + ["castle", 12, ["location"], [], ["location"]], + ["flower field", 12, ["location"], [], ["location"]], + ["skyscraper", 12, ["location"], [], ["location"]], + ["utility pole", 12, [], [], []], + ["train interior", 12, ["location"], [], ["location"]], + ["evening", 12, [], [], []], + ["mountainous horizon", 12, [], [], []], + ["waves", 12, [], [], []], + ["crowd", 12, [], [], []], + ["kitchen", 12, ["location"], [], ["location"]], + ["tower", 12, ["location"], [], ["location"]], + ["waterfall", 12, ["location"], [], ["location"]], + ["library", 12, ["location"], [], ["location"]], + ["puddle", 12, [], [], []], + ["shop", 12, ["location"], [], ["location"]], + ["lake", 12, ["location"], [], ["location"]], + ["fog", 12, [], [], []], + ["shrine", 12, ["location"], [], ["location"]], + ["red moon", 12, [], [], []], + ["rooftop", 12, ["location"], [], ["location"]], + ["shore", 12, ["location"], [], ["location"]], + ["floor", 12, [], [], ["below"]], + ["contrail", 12, [], [], []], + ["shooting star", 12, [], [], []], + ["ceiling", 12, [], [], ["above"]], + ["city lights", 12, [], [], []], + ["bamboo forest", 12, ["location"], [], ["location"]], + ["hallway", 12, ["location"], [], ["location"]], + ["moonlight", 12, [], [], []], + ["locker room", 12, ["location"], [], ["location"]], + ["dusk", 12, [], [], []], + ["tombstone", 12, [], [], []], + ["hill", 12, [], [], []], + ["sunrise", 12, [], [], []], + ["restaurant", 12, ["location"], [], ["location"]], + ["moss", 12, [], [], []], + ["church", 12, ["location"], [], ["location"]], + ["town", 12, ["location"], [], ["location"]], + ["cave", 12, ["location"], [], ["location"]], + ["festival", 12, ["location"], [], ["location"]], + ["veranda", 12, ["location"], [], ["location"]], + ["reflective floor", 12, [], [], ["below"]], + ["alley", 12, ["location"], [], ["location"]], + ["pond", 12, ["location"], [], ["location"]], + ["tree", 12, [], [], []], + ["overgrown", 12, [], [], []], + ["industrial pipe", 12, [], [], []], + ["shallow water", 12, [], [], []], + ["column", 12, [], [], []], + ["tree stump", 12, [], [], []], + ["sunflower field", 12, ["location"], [], ["location"]], + ["wading pool", 12, [], [], []], + ["jungle", 12, ["location"], [], ["location"]], + ["meadow", 12, ["location"], [], ["location"]], + ["wheat field", 12, ["location"], [], ["location"]], + ["dungeon", 12, ["location"], [], ["location"]], +] +objectsAndStuffedAnimalsL = [ + ["fruit, food, strawberry", 12, [], [], []], + ["stuffed animal, teddy bear", 12, [], [], []], + ["stuffed animal, stuffed rabbit", 4, [], [], []], + ["stuffed animal, stuffed shark", 4, [], [], []], + ["stuffed animal, stuffed fish", 4, [], [], []], + ["stuffed animal, stuffed frog", 4, [], [], []], + ["stuffed animal, stuffed panda", 4, [], [], []], + ["stuffed animal, stuffed octopus", 4, [], [], []], + ["stuffed animal, stuffed lion", 4, [], [], []], + ["stuffed animal, stuffed sheep", 4, [], [], []], + ["teacup", 12, [], [], []], + ["teapot", 12, [], [], []], + ["spoon", 12, [], [], []], + ["smartphone", 12, [], [], []], + ["skull", 12, [], [], []], + ["shield", 12, [], [], []], + ["sheath", 12, [], [], []], + ["school desk", 12, [], [], []], + ["weapon, scythe, holding scythe", 12, [], [], []], + ["sack, holding sack", 12, [], [], []], + ["flower, rose", 12, [], [], []], + ["rope", 12, [], [], []], + ["rock", 12, [], [], []], + ["rifle", 12, [], [], []], + ["pumpkin", 12, [], [], []], + ["potted plant", 12, [], [], []], + ["food, popsicle, popsicle in mouth", 6, [], [], []], + ["food, popsicle, holding popsicle", 6, [], [], []], + ["food, popsicle, popsicle in mouth, watermelon bar", 6, [], [], []], + ["food, popsicle, holding popsicle, watermelon bar", 6, [], [], []], + ["weapon, polearm, holding weapon", 12, [], [], []], + ["pocky", 12, [], [], []], + ["plate", 12, [], [], []], + ["plant", 12, [], [], []], + ["pen, holding pen", 12, [], [], []], + ["phone, smartphone, holding phone", 12, [], [], []], + ["fruit, peach", 12, [], [], []], + ["open book", 12, [], [], []], + ["ofuda", 12, [], [], []], + ["cup, mug, beer mug", 12, [], [], []], + ["cup, mug, coffee mug", 12, [], [], []], + ["mecha", 12, [], [], []], + ["machinery", 12, [], [], []], + ["candy, lollipop", 12, [], [], []], + ["leaf", 12, [], [], []], + ["lantern", 4, [], [], []], + ["lantern, wooden lantern", 4, [], [], []], + ["lantern, paper lantern", 4, [], [], []], + ["lamp", 12, [], [], []], + ["knife, kitchen knife", 12, [], [], []], + ["weapon, katana", 12, [], [], []], + ["weapon, spear", 12, [], [], []], + ["jack-o'-lantern", 12, [], [], []], + ["innertube", 12, [], [], []], + ["innertube, doughnut innertube", 12, [], [], []], + ["id card, lanyard", 12, [], [], []], + ["ice cream, soft serve", 12, [], [], []], + ["flower, hibiscus", 12, [], [], []], + ["flower, daisy", 12, [], [], []], + ["flower, iris (flower)", 12, [], [], []], + ["flower, lilac", 12, [], [], []], + ["flower, chrysanthemum", 12, [], [], []], + ["flower, carnation", 12, [], [], []], + ["flower, camellia", 12, [], [], []], + ["flower, crocus (flower)", 12, [], [], []], + ["flower, lily of the valley", 12, [], [], []], + ["flower, poppy (flower)", 12, [], [], []], + ["flower, nemophila (flower)", 12, [], [], []], + ["flower, snowbell (flower)", 12, [], [], []], + ["flower, orchid", 12, [], [], []], + ["flower, spider lily", 12, [], [], []], + ["flower, strawberry blossoms", 12, [], [], []], + ["flower, sunflower", 12, [], [], []], + ["flower, violet (flower)", 12, [], [], []], + ["flower, lily (flower)", 12, [], [], []], + ["flower, lotus", 12, [], [], []], + ["flower, plum blossoms", 12, [], [], []], + ["flower, black rose", 12, [], [], []], + ["flower, tulip", 12, [], [], []], + ["flower, water lily flower", 12, [], [], []], + ["flower, wisteria", 12, [], [], []], + ["flower, cosmos (flower)", 12, [], [], []], + ["flower, nemophila (flower)", 12, [], [], []], + ["headset", 12, [], [], []], + ["headphones", 12, [], [], []], + ["weapon, gun, handgun", 12, [], [], []], + ["bag, handbag", 12, [], [], []], + ["bag, shoulder bag", 12, [], [], []], + ["hand fan, folding fan", 12, [], [], []], + ["instrument, guitar", 12, [], [], []], + ["gift, gift bag", 12, [], [], []], + ["gift, gift box", 12, [], [], []], + ["ghost", 12, [], [], []], + ["gem", 12, [], [], []], + ["fruit", 12, [], [], []], + ["fork, holding fork", 12, [], [], []], + ["food", 12, [], [], []], + ["animal, fish", 12, [], [], []], + ["doll, holding doll", 12, [], [], []], + ["cup, disposable cup", 12, [], [], []], + ["weapon, dagger", 12, [], [], []], + ["cup", 12, [], [], []], + ["cross", 12, [], [], []], + ["controller", 12, [], [], []], + ["computer, monitor, keyboard (computer)", 12, [], [], []], + ["cigarette", 12, [], [], []], + ["chopsticks", 12, [], [], []], + ["chocolate", 12, [], [], []], + ["chair", 12, [], [], []], + ["chain", 12, [], [], []], + ["carrot", 12, [], [], []], + ["cannon", 12, [], [], []], + ["candy", 12, [], [], []], + ["candle", 12, [], [], []], + ["can", 12, [], [], []], + ["camera", 12, [], [], []], + ["food, cake", 12, [], [], []], + ["bug, butterfly", 12, [], [], []], + ["bucket", 12, [], [], []], + ["broom", 12, [], [], []], + ["branch", 12, [], [], []], + ["box", 12, [], [], []], + ["bowl", 12, [], [], []], + ["bouquet", 12, [], [], []], + ["bottle", 12, [], [], []], + ["book", 12, [], [], []], + ["blanket", 12, [], [], []], + ["bird", 12, [], [], []], + ["bench", 12, [], [], []], + ["bell", 12, [], [], []], + ["bed sheet", 12, [], [], []], + ["beads", 12, [], [], []], + ["beachball", 12, [], [], []], + ["basket", 12, [], [], []], + ["balloon", 12, [], [], []], + ["ball", 12, [], [], []], + ["weapon, axe", 12, [], [], []], + ["weapon, gun, assault rifle", 12, [], [], []], + ["fruit, apple", 12, [], [], []], + ["sake, sake bottle", 12, [], [], []], + ["paintbrush", 12, [], [], []], + ["tea", 12, [], [], []], + ["black cat", 12, [], [], []], + ["maple leaf", 12, [], [], []], + ["mushroom", 12, [], [], []], + ["television", 12, [], [], []], + ["handcuffs", 12, [], [], []], + ["food, doughnut", 12, [], [], []], + ["water bottle", 12, [], [], []], + ["food, bread, bagel", 12, [], [], []], + ["food, bread, baguette", 12, [], [], []], + ["flower, pink rose", 12, [], [], []], + ["handheld game console", 12, [], [], []], + ["weapon, huge weapon", 12, [], [], []], + ["stool", 12, [], [], []], + ["smoking pipe", 12, [], [], []], + ["food, cookie", 12, [], [], []], + ["chalkboard", 12, [], [], []], + ["coin", 12, [], [], []], + ["syringe", 12, [], [], []], + ["christmas tree", 12, [], [], []], + ["rice", 12, [], [], []], + ["bathtub", 12, [], [], []], + ["beer, beer bottle", 12, [], [], []], + ["lamppost", 12, [], [], []], + ["egg", 12, [], [], []], + ["fruit, cherry", 12, [], [], []], + ["cushion", 12, [], [], []], + ["shell", 12, [], [], []], + ["sake, sakazuki", 12, [], [], []], + ["food, burger", 12, [], [], []], + ["clipboard", 12, [], [], []], + ["skeleton", 12, [], [], []], + ["instrument, electric guitar", 12, [], [], []], + ["box, cardboard box", 12, [], [], []], + ["pillar", 12, [], [], []], + ["book stack", 12, [], [], []], + ["wine", 12, [], [], []], + ["mouse (animal)", 12, [], [], []], + ["computer, laptop", 12, [], [], []], + ["table, kotatsu", 12, [], [], []], + ["bag, shopping bag", 12, [], [], []], + ["whip", 12, [], [], []], + ["riding crop", 12, [], [], []], + ["dango", 12, [], [], []], + ["fruit, grapes", 12, [], [], []], + ["water gun", 12, [], [], []], + ["vase", 12, [], [], []], + ["whistle", 12, [], [], []], + ["microphone stand, microphone", 12, [], [], []], + ["notebook", 12, [], [], []], + ["flower, hydrangea", 12, [], [], []], + ["suitcase", 12, [], [], []], + ["bone", 12, [], [], []], + ["ice cream, ice cream cone", 12, [], [], []], + ["heart-shaped chocolate", 12, [], [], []], + ["weapon, lance", 12, [], [], []], + ["cane", 12, [], [], []], + ["ladle", 12, [], [], []], + ["orange (fruit)", 12, [], [], []], + ["spring onion", 12, [], [], []], + ["statue", 12, [], [], []], + ["locker", 12, [], [], []], + ["gears", 12, [], [], []], + ["crab", 12, [], [], []], + ["wine bottle", 12, [], [], []], + ["gourd", 12, [], [], []], + ["starfish", 12, [], [], []], + ["gun, weapon, machine gun", 12, [], [], []], + ["weapon, trident", 12, [], [], []], + ["lock", 12, [], [], []], + ["crow", 12, [], [], []], + ["boat", 12, [], [], []], + ["road sign", 12, [], [], []], + ["stick", 12, [], [], []], + ["armchair", 12, [], [], []], + ["frilled pillow", 12, [], [], []], + ["tissue box", 12, [], [], []], + ["jar", 12, [], [], []], + ["mandarin orange", 12, [], [], []], + ["office chair", 12, [], [], []], + ["pot", 12, [], [], []], + ["pole", 12, [], [], []], + ["food print", 12, [], [], []], + ["test tube", 12, [], [], []], + ["spider web", 12, [], [], []], + ["weapon, rapier", 12, [], [], []], + ["envelope", 12, [], [], []], + ["fruit, banana", 12, [], [], []], + ["fruit, lemon", 12, [], [], []], + ["weapon, gun, shotgun", 12, [], [], []], + ["weapon, energy sword", 12, [], [], []], + ["staff, holding staff", 12, [], [], []], + ["mage staff", 12, [], [], []], + ["food, pizza", 12, [], [], []], + ["digital media player, earphones", 12, [], [], []], + ["fruit, tomato", 12, [], [], []], + ["rubber duck", 12, [], [], []], + ["food, candy apple", 12, [], [], []], + ["food, baozi", 12, [], [], []], + ["lily pad", 12, [], [], []], + ["pancake", 12, [], [], []], + ["soda can", 12, [], [], []], + ["vegetable", 12, [], [], []], + ["trash can", 12, [], [], []], + ["frying pan", 12, [], [], []], + ["clover, four-leaf clover", 12, [], [], []], + ["electric fan", 12, [], [], []], + ["puppet", 12, [], [], []], + ["food, noodles, ramen", 12, [], [], []], + ["food, bento", 12, [], [], []], + ["food, candy, candy cane", 12, [], [], []], + ["shell, seashell", 12, [], [], []], + ["plastic bag", 12, [], [], []], + ["instrument, bass guitar", 12, [], [], []], + ["flower pot", 12, [], [], []], + ["food, pudding", 12, [], [], []], + ["flask, erlenmeyer flask", 12, [], [], []], + ["flask, round-bottom flask", 12, [], [], []], + ["ball, soccer ball", 12, [], [], []], + ["bag, duffel bag", 12, [], [], []], + ["cigar", 12, [], [], []], + ["towel, beach towel", 12, [], [], []], + ["food, shaved ice", 12, [], [], []], + ["mallet, holding mallet", 12, [], [], []], + ["glowstick", 12, [], [], []], + ["disposable cup, disposable coffee cup", 12, [], [], []], + ["drumsticks", 12, [], [], []], + ["jellyfish", 12, [], [], []], + ["ball, volleyball", 12, [], [], []], + ["food, sweets", 12, [], [], []], + ["candy, lollipop, swirl lollipop", 12, [], [], []], + ["food, pastry", 12, [], [], []], + ["food, omelet", 12, [], [], []], + ["food, curry", 12, [], [], []], + ["bottle, milk bottle", 12, [], [], []], + ["food, dessert", 12, [], [], []], + ["bag, satchel", 12, [], [], []], + ["holding torch, torch", 12, [], [], []], + ["umbrella, transparent umbrella", 12, [], [], []], + ["holding surfboard, surfboard", 12, [], [], []], + ["beads, prayer beads", 12, [], [], []], + ["food, potato chips", 12, [], [], []], + ["racket, tennis racket, holding racket", 12, [], [], []], + ["turtle", 12, [], [], []], + ["briefcase", 12, [], [], []], + ["ball, baseball (object)", 12, [], [], []], + ["bucket, wooden bucket", 12, [], [], []], + ["food, crepe", 12, [], [], []], + ["barrel", 12, [], [], []], + ["ramune", 12, [], [], []], + ["cat teaser", 12, [], [], []], + ["baseball mitt", 12, [], [], []], + ["lamp, desk lamp", 12, [], [], []], + ["parfait", 12, [], [], []], + ["food, macaron", 12, [], [], []], + ["calligraphy brush", 12, [], [], []], + ["paddle", 12, [], [], []], + ["drink can", 12, [], [], []], + ["shower head", 12, [], [], []], + ["tokkuri", 12, [], [], []], + ["yunomi", 12, [], [], []], + ["light bulb", 12, [], [], []], + ["omurice", 12, [], [], []], + ["mimikaki", 12, [], [], []], + ["used tissue", 12, [], [], []], + ["ginkgo leaf", 12, [], [], []], + ["love letter", 12, [], [], []], + ["tanabata", 12, [], [], []], + ["weapon, halberd", 12, [], [], []], + ["weapon, naginata", 12, [], [], []], + ["cucumber", 12, [], [], []], + ["button eyes", 12, [], [], []], + ["club (weapon), kanabou", 12, [], [], []], + ["makizushi, sushi, food", 12, [], [], []], + ["teruterubouzu", 12, [], [], []], + ["radish", 12, [], [], []], + ["roasted sweet potato", 12, [], [], []], + ["ikayaki", 12, [], [], []], +] +bodyPosesAndActionsL = [ + ["waving", 12, [], [], []], + ["sitting, wariza", 12, [], ["body"], []], + ["walking", 12, [], ["body"], []], + ["wading", 12, [], ["body"], []], + ["w", 12, [], [], []], + ["top-down bottom-up", 12, [], ["body"], []], + ["thought bubble", 12, [], [], []], + ["talking", 12, [], [], []], + ["stretching", 12, [], [], []], + ["straddling", 12, [], ["body"], []], + ["standing, standing on one leg", 12, [], ["body"], []], + ["standing", 12, [], ["body"], []], + ["spread legs", 12, [], ["body"], []], + ["outstretched arms, spread arms", 12, [], [], []], + ["skirt hold", 12, [], [], []], + ["sitting", 12, [], ["body"], []], + ["sitting, crossed legs", 12, [], ["body"], []], + ["sitting, seiza", 12, [], ["body"], []], + ["sitting, yokozuwari", 12, [], ["body"], []], + ["clothes lift, shirt lift", 12, [], [], []], + ["selfie", 12, [], [], []], + ["salute", 12, [], [], []], + ["riding", 12, [], ["body"], []], + ["restrained", 12, [], [], []], + ["reading, book, holding book, open book", 12, [], [], []], + ["reaching, reaching towards viewer", 12, [], [], []], + ["collar tug", 12, [], [], []], + ["pose", 12, [], [], []], + ["peace sign", 12, [], [], []], + ["paw pose", 12, [], [], []], + ["rabbit pose", 12, [], [], []], + ["horns pose", 12, [], [], []], + ["claw pose", 12, [], [], []], + ["bras d'honneur", 12, [], [], []], + ["contrapposto", 12, [], [], []], + ["ghost pose", 12, [], [], []], + ["ojou-sama pose", 12, [], [], []], + ["victory pose", 12, [], [], []], + ["villain pose", 12, [], [], []], + ["peace sign, gyaru v", 12, [], [], []], + ["peace sign, v over eye", 12, [], [], []], + ["peace sign, v over mouth", 12, [], [], []], + ["peace sign, double peace", 12, [], [], []], + ["peace sign, inward v", 12, [], [], []], + ["own hands clasped, own hands together", 12, [], [], []], + ["outstretched hand", 12, [], [], []], + ["outstretched arms", 12, [], [], []], + ["open hand", 12, [], [], []], + ["lying, on back", 12, [], ["body"], []], + ["sitting, on bed", 12, [], ["body"], []], + ["sitting, on chair", 12, [], ["body"], []], + ["sitting, on couch", 12, [], ["body"], []], + ["sitting, on floor", 12, [], ["body"], []], + ["on one knee, kneeling", 12, [], ["body"], []], + ["lying, on side", 12, [], ["body"], []], + ["lying, on stomach", 12, [], ["body"], []], + ["reclining", 12, [], ["body"], []], + ["looking up", 12, [], [], []], + ["looking to the side", 12, [], [], []], + ["looking down", 12, [], [], []], + ["looking back", 12, [], [], []], + ["looking away", 12, [], [], []], + ["looking at viewer", 12, [], [], []], + ["looking ahead", 12, [], [], []], + ["looking afar", 12, [], [], []], + ["looking at another", 12, [], [], []], + ["licking, licking object", 12, [], [], []], + ["licking, licking finger", 12, [], [], []], + ["sitting, legs up", 12, [], ["body"], []], + ["sitting, knees to chest", 12, [], ["body"], []], + ["legs together", 12, [], ["body"], []], + ["legs apart", 12, [], ["body"], []], + ["leg up, leg lift", 12, [], ["body"], []], + ["leg up, stepping", 12, [], ["body"], []], + ["leaning forward", 12, [], [], []], + ["leaning back", 12, [], [], []], + ["knees together feet apart", 12, [], ["body"], []], + ["kneeling", 12, [], ["body"], []], + ["jumping", 12, [], ["body"], []], + ["sitting, indian style", 12, [], ["body"], []], + ["index finger raised", 12, [], [], []], + ["sitting, knees to chest, hugging own legs", 12, [], [], []], + ["hugging object", 12, [], [], []], + ["heart hands, heart", 12, [], [], []], + ["headpat", 12, [], [], []], + ["hands up", 12, [], [], []], + ["hands on own hips", 12, [], [], []], + ["hands on own face", 12, [], [], []], + ["hands on own chest", 12, [], [], []], + ["hands in pockets", 12, [], [], []], + ["hand up", 12, [], [], []], + ["hand to own mouth", 12, [], [], []], + ["hand on own hip", 12, [], [], []], + ["hand on own head", 12, [], [], []], + ["hand on own chin", 12, [], [], []], + ["hand on own chest", 12, [], [], []], + ["hand on own cheek", 12, [], [], []], + ["hand in pocket", 12, [], ["body"], []], + ["hand between legs", 12, [], ["body"], []], + ["finger to mouth", 12, [], [], []], + ["fighting stance", 12, [], [], []], + ["facing viewer", 12, [], [], []], + ["facing away", 12, [], [], []], + ["eating, food", 12, [], [], []], + ["drinking", 12, [], [], []], + ["dancing", 12, [], [], []], + ["crossed legs", 12, [], ["body"], []], + ["crossed arms", 12, [], [], []], + ["covering mouth", 12, [], [], []], + ["covering breasts", 12, [], ["breasts"], []], + ["clenched hands", 12, [], [], []], + ["clenched hand", 12, [], [], []], + ["carrying object", 12, [], [], []], + ["breasts squeezed together", 12, [], ["breasts"], []], + ["bent over, leaning forward", 12, [], [], []], + ["arms up", 12, [], [], []], + ["arms behind head", 12, [], [], []], + ["arms behind back", 12, [], [], []], + ["arms at sides", 12, [], [], []], + ["arm up", 12, [], [], []], + ["arm support", 12, [], [], []], + ["grabbing own arm", 12, [], [], []], + ["one arm behind head", 12, [], [], []], + ["one arm behind back", 12, [], [], []], + ["one arm at side", 12, [], [], []], + ["arched back", 12, [], [], []], + ["all fours", 12, [], [], []], + ["against wall", 12, [], [], []], + ["adjusting hair", 12, [], [], []], + ["adjusting eyewear", 12, [], [], []], + ["arm under breasts", 12, [], ["breasts"], []], + ["tucking hair", 12, [], [], []], + ["lying, on ground", 12, [], [], []], + ["pigeon-toed", 12, [], ["body"], []], + ["thumbs up", 12, [], [], []], + ["thumbs down", 12, [], [], []], + ["kicking", 12, [], ["body"], []], + ["invisible chair", 12, [], [], []], + ["hand on own thigh", 12, [], [], []], + ["tiptoes", 12, [], ["feet"], []], + ["singing", 12, [], [], []], + ["falling, tripping", 12, [], [], []], + ["hand on own knee", 12, [], [], []], + ["gift, holding, holding gift, incoming gift", 12, [], [], []], + ["music, instrument, playing instrument", 12, [], [], []], + ["holding, stuffed toy, holding stuffed toy", 12, [], [], []], + ["pointing at viewer", 12, [], [], []], + ["broom, broom riding", 12, [], [], []], + ["leaning to the side", 12, [], [], []], + ["tying hair", 12, [], [], []], + ["shouting", 12, [], [], []], + ["hugging object, pillow, pillow hug", 12, [], [], []], + ["punching", 12, [], [], []], + ["yawning", 12, [], [], []], + ["\\m/", 12, [], [], []], + ["hand on own stomach", 12, [], ["body"], []], + ["hands on own cheeks", 12, [], [], []], + ["hand on own ass", 12, [], ["body"], ["front"]], + ["weapon, gun, firing", 12, [], [], []], + ["strap pull", 12, [], ["strapped"], []], + ["shushing", 12, [], [], []], + ["breast suppress", 12, [], ["breasts"], []], + ["peeking, peeking out, door", 12, [], [], []], + ["squatting", 12, [], [], []], + ["squatting, slav squatting", 12, [], [], []], + ["open hands", 12, [], [], []], + ["waking up", 12, [], [], []], + ["hands on own knees", 12, [], [], []], + ["breast lift", 12, [], ["breasts"], []], + ["hands in hair", 12, [], [], []], + ["pointing, pointing at self", 12, [], [], []], + ["pointing, pointing at self with one hand", 12, [], [], []], + ["pointing, pointing up", 12, [], [], []], + ["pointing, pointing to the side", 12, [], [], []], + ["pointing, pointing down", 12, [], [], []], + ["index finger raised", 12, [], [], []], + ["against glass", 12, [], [], []], + ["holding own arm", 12, [], [], []], + ["elbow rest, leaning", 12, [], [], []], + ["steepled fingers", 12, [], [], []], + ["hand on own arm", 12, [], [], []], + ["staring", 12, [], [], []], + ["index fingers together", 12, [], [], []], + ["arms under breasts", 12, [], ["breasts"], []], + ["clothes grab", 12, [], [], []], + ["running", 12, [], [], []], + ["finger to cheek", 12, [], [], []], + ["covering own eyes", 12, [], [], []], + ["come hither, beckoning", 12, [], [], []], + ["rubbing eyes", 12, [], [], []], + ["praying", 12, [], [], []], + ["zombie pose", 12, [], [], []], + ["holding sign with an X on it", 12, [], [], []], + ["holding sign a symbol on it", 12, [], [], []], + ["phone, holding phone, looking at phone", 12, [], [], []], + ["ok sign", 12, [], [], []], + ["playing with own hair", 12, [], [], []], + ["sitting, hands on lap", 12, [], [], []], + ["finger to own chin", 12, [], [], []], + ["hands on own thighs", 12, [], ["body"], []], + ["wiping tears", 12, [], [], []], + ["sleeping", 12, [], [], []], + ["cupping hands", 12, [], [], []], + ["double finger gun", 12, [], [], []], + ["fidgeting", 12, [], [], []], + ["finger counting", 12, [], [], []], + ["fist in hand", 12, [], [], []], + ["heart arms", 12, [], [], []], + ["x fingers", 12, [], [], []], + ["akanbe, eyelid pull, tongue out", 12, [], [], []], + ["middle finger", 12, [], [], []], + ["finger gun", 12, [], [], []], + ["fox shadow puppet", 12, [], [], []], + ["middle w", 12, [], [], []], + ["money gesture", 12, [], [], []], + ["raised fist", 12, [], [], []], + ["stroking own chin", 12, [], [], []], + ["shrugging", 12, [], [], []], + ["turning head", 12, [], [], []], + ["the pose", 12, [], [], []], + ["standing split", 12, [], [], []], + ["smoking", 12, [], [], []], + ["plantar flexion", 12, [], ["feet"], []], + ["lifting own clothes", 12, [], [], []], + ["head rest", 12, [], [], []], + ["skirt tug", 12, [], ["skirt"], []], + ["spread fingers", 12, [], [], []], + ["shading eyes", 12, [], [], []], + ["hands on own head", 12, [], [], []], + ["spilling", 12, [], [], []], + ["incoming attack", 12, [], [], []], + ["kabedon", 12, [], [], []], + ["knees apart feet together", 12, [], ["legs"], []], + ["curtain grab", 12, [], [], []], + ["pole dancing", 12, [], [], []], + ["cheek poking", 12, [], [], []], + ["teasing", 12, [], [], []], + ["stuck", 12, [], [], []], + ["curled fingers", 12, [], [], []], + ["against tree", 12, [], [], []], + ["sparkler", 6, [], [], []], + ["curtsey", 12, [], ["female"], []], + ["holding own tail", 6, [], [], []], + ["head down", 12, [], [], []], + ["wiping face", 12, [], [], []], + ["wiping sweat", 12, [], [], []], + ["fallen down", 12, [], [], []], + ["party popper, holding party popper", 12, [], [], []], + ["chewing", 12, [], [], []], + ["sigh", 12, [], [], []], + ["ass support", 12, [], [], []], + ["raised fist", 12, [], [], []], + ["mouth pull", 12, [], [], []], + ["toast in mouth", 12, [], [], []], + ["incoming hug", 12, [], [], []], + ["self hug", 12, [], [], []], + ["clapping", 12, [], [], []], + ["fetal position", 12, [], [], []], + ["dynamic pose", 12, [], [], []], + ["elbow on table", 12, [], [], []], + ["cheek rest", 12, [], [], []], + ["holding baby", 2, [], [], []], +] +effectsAndPatternsL = [ + ["sparkle", 12, [], [], []], + ["snowflakes", 12, [], [], []], + ["petals", 12, [], [], []], + ["paw print", 12, [], [], []], + ["musical note", 12, [], [], []], + ["motion lines", 12, [], [], []], + ["magic", 12, [], [], []], + ["light rays", 12, [], [], []], + ["light particles", 12, [], [], []], + ["lens flare", 12, [], [], []], + ["ice", 12, [], [], []], + ["glowing", 12, [], [], []], + ["glint", 12, [], [], []], + ["fire", 12, [], [], []], + ["fantasy", 12, [], [], []], + ["falling petals", 12, [], [], []], + ["emphasis lines", 12, [], [], []], + ["electricity", 12, [], [], []], + ["eighth note", 12, [], [], []], + ["depth of field", 12, [], [], []], + ["crystal", 12, [], [], []], + ["crescent", 12, [], [], []], + ["confetti", 12, [], [], []], + ["chromatic aberration", 12, [], [], []], + ["christmas", 12, [], [], []], + ["chibi", 12, [], [], []], + ["cherry blossoms", 12, [], [], []], + ["bubble", 12, [], [], []], + ["blurry background", 12, [], [], []], + ["blurry foreground", 12, [], [], []], + ["autumn leaves", 12, [], [], []], + ["air bubble", 12, [], [], []], + ["aura", 12, [], [], []], + ["halftone", 12, [], [], []], + ["explosion", 12, [], [], []], + ["summer", 12, [], [], []], + ["sunbeam", 12, [], [], []], + ["magic circle", 12, [], [], []], + ["fireworks", 12, [], [], []], + ["winter", 12, [], [], []], + ["partially colored", 12, [], [], []], + ["ripples", 12, [], [], []], + ["rainbow", 12, [], [], []], + ["sepia", 12, [], [], []], + ["blood splatter", 12, [], [], []], + ["autumn", 12, [], [], []], + ["spring (season)", 12, [], [], []], + ["rose petals", 12, [], [], []], + ["danmaku", 12, [], [], []], + ["shiny", 12, [], [], []], + ["lightning", 12, [], [], []], + ["blue fire", 12, [], [], []], + ["falling leaves", 12, [], [], []], + ["muted color", 12, [], [], []], + ["soap bubbles", 12, [], [], []], + ["horror (theme)", 12, [], [], []], + ["colorful", 12, [], [], []], + ["viewfinder", 12, [], [], []], + ["constellation", 12, [], [], []], + ["ancient egyptian", 12, [], [], []], + ["surreal", 12, [], [], []], + ["darkness", 12, [], [], []], + ["dark", 12, [], [], []], + ["paint splatter", 12, [], [], []], + ["lolita fashion", 12, [], [], []], + ["bloom", 12, [], [], []], + ["abstract", 12, [], [], []], + ["embers", 12, [], [], []], + ["corruption, dark persona", 12, [], [], []], + ["stage lights", 12, [], [], []], + ["fashion", 12, [], [], []], + ["trick or treat", 12, [], [], []], + ["fluffy", 12, [], [], []], + ["symmetry", 12, [], [], []], + ["reflective water, reflection", 12, [], [], []], + ["glitch", 12, [], [], []], + ["border", 12, [], [], []], + ["framed", 12, [], [], []], + ["character image", 12, [], [], []], + ["3d", 12, [], [], []], + ["lineart", 12, [], [], []], + ["no lineart", 12, [], [], []], + ["outline", 12, [], [], []], + ["pixel art", 12, [], [], []], + ["oekaki", 12, [], [], []], + ["anime screencap", 12, [], [], []], + ["anime screenshot", 12, [], [], []], + ["game screenshot", 12, [], [], []], + ["game cg", 12, [], [], []], + ["fake screenshot", 12, [], [], []], + ["drop shadow", 12, [], [], []], + ["gradient", 12, [], [], []], + ["film grain", 12, [], [], []], + ["caustics", 12, [], [], []], + ["bokeh", 12, [], [], []], + ["backlighting", 12, [], [], []], + ["dithering", 12, [], [], []], + ["monochrome", 12, [], [], []], + ["multiple monochrome", 12, [], [], []], + ["silhouette", 12, [], [], []], + ["vignetting", 12, [], [], []], + ["art deco", 12, [], [], []], + ["art nouveau", 12, [], [], []], + ["science fiction", 12, [], [], []], + ["steampunk", 12, [], [], []], + ["cyberpunk", 12, [], [], []], + ["western", 12, [], [], []], + ["sunlight", 12, [], [], []], + ["wind", 12, [], [], []], + ["squiggle", 12, [], [], []], + ["limited palette", 12, [], [], []], + ["overgrown", 12, [], [], []], + ["halloween", 12, [], [], []], + ["grass", 12, [], [], []], + ["blood", 12, [], [], []], + ["tokusatsu", 12, [], [], []], + ["thorns", 12, [], [], []], + ["stained glass", 12, [], [], []], + ["silk", 12, [], [], []], + ["sidelighting", 12, [], [], []], + ["reference sheet", 12, [], [], []], + ["outside border", 12, [], [], []], + ["hatching (texture)", 12, [], [], []], + ["goth fashion", 12, [], [], []], + ["foreshortening", 12, [], [], []], + ["fisheye", 12, [], [], []], + ["dappled sunlight", 12, [], [], []], + ["color guide", 12, [], [], []], + ["wedding", 12, [], [], []], + ["melting", 12, [], [], []], + ["tree shade", 12, [], [], []], + ["liquid", 12, [], [], []], + ["unhappy adorable", 12, [], [], []], + ["disgustingly adorable", 12, [], [], []], + ["sideways", 12, [], [], []], + ["pink blood", 12, [], [], []], + ["window shadow", 12, [], [], []], + ["i am the king", 12, [], [], []], + ["pyrokinesis", 12, [], [], []], + ["pastel colors", 12, [], [], []], + ["exquisite clothes", 12, [], [], []], + ["electrokinesis", 12, [], [], []], + ["neon lights", 12, [], [], []], + ["fine fabric emphasis", 12, [], [], []], + ["pale color", 12, [], [], []], + ["spring (season)", 12, [], [], []], + ["round image", 12, [], [], []], + ["partially underwater shot", 12, [], [], []], + ["key visual", 12, [], [], []], + ["fireflies", 12, [], [], []], + ["purple fire", 12, [], [], []], + ["hydrokinesis", 12, [], [], []], + ["psychic", 12, [], [], []], + ["linear hatching", 12, [], [], []], + ["faux figurine", 12, [], [], []], + ["dust cloud", 12, [], [], []], + ["blending", 12, [], [], []], + ["petals on liquid", 12, [], [], []], + ["huge moon", 12, [], [], []], + ["telekinesis", 12, [], [], []], + ["dark aura", 12, [], [], []], + ["cursor", 2, [], [], []], + ["soft and comfy", 12, [], [], []], + ["post-apocalypse", 12, [], [], []], + ["galaxy", 12, [], [], []], + ["plant roots", 12, [], [], []], + ["dissolving", 12, [], [], []], + ["nebula", 12, [], [], []], + ["drawn ears, drawn tail, drawn whiskers", 12, [], [], []], + ["drawn horns, drawn wings]", 12, [], [], []], + ["offering hand", 12, [], [], []], + ["green fire", 12, [], [], []], + ["digital dissolve", 12, [], [], []], + ["aliasing", 12, [], [], []], + ["neon palette", 12, [], [], []], + ["spiral", 12, [], [], []], + ["gigantamax", 12, [], [], []], + ["gleam", 12, [], [], []], + ["hemokinesis", 12, [], [], []], +] +eyeColorsL = [ + ["aqua eyes", 12, ["eyes"], [], []], + ["black eyes", 12, ["eyes"], [], []], + ["blue eyes", 12, ["eyes"], [], []], + ["brown eyes", 12, ["eyes"], [], []], + ["green eyes", 12, ["eyes"], [], []], + ["grey eyes", 12, ["eyes"], [], []], + ["orange eyes", 12, ["eyes"], [], []], + ["purple eyes", 12, ["eyes"], [], []], + ["pink eyes", 12, ["eyes"], [], []], + ["red eyes", 12, ["eyes"], [], []], + ["white eyes", 12, ["eyes"], [], []], + ["yellow eyes", 12, ["eyes"], [], []], + ["amber eyes", 12, ["eyes"], [], []], +] +hairColorsL = [ + ["aqua hair", 12, [], [], []], + ["black hair", 12, [], [], []], + ["blonde hair", 12, [], [], []], + ["platinum blonde hair", 12, [], [], []], + ["blue hair", 12, [], [], []], + ["light blue hair", 12, [], [], []], + ["dark blue hair", 12, [], [], []], + ["brown hair", 12, [], [], []], + ["light brown hair", 12, [], [], []], + ["green hair", 12, [], [], []], + ["dark green hair", 12, [], [], []], + ["light green hair", 12, [], [], []], + ["grey hair", 12, [], [], []], + ["orange hair", 12, [], [], []], + ["pink hair", 12, [], [], []], + ["purple hair", 12, [], [], []], + ["light purple hair", 12, [], [], []], + ["red hair", 12, [], [], []], + ["white hair", 12, [], [], []], +] +hairStylesAndPatternsL = [ + ["multicolored hair", 12, [], [], []], + ["colored inner hair", 12, [], [], []], + ["gradient hair", 12, [], [], []], + ["rainbow hair", 12, [], [], []], + ["split-color hair", 4, [], [], []], + ["streaked hair", 12, [], [], []], + ["two-tone hair", 12, [], [], []], + ["colored tips", 12, [], [], []], + ["glowing hair", 4, [], [], []], +] +colorsL = [ + ["aqua", 12, [], [], []], + ["black", 12, [], [], []], + ["blue", 12, [], [], []], + ["brown", 12, [], [], []], + ["grey", 12, [], [], []], + ["orange", 12, [], [], []], + ["pink", 12, [], [], []], + ["purple", 12, [], [], []], + ["red", 12, [], [], []], + ["white", 12, [], [], []], + ["yellow", 12, [], [], []], + ["beige", 12, [], [], []], + ["two-toned", 12, [], [], []], + ["multicolored", 12, [], [], []], + ["silver", 4, [], [], []], + ["gold", 4, [], [], []], + ["rainbow", 2, [], [], []], +] + +type WeightedOption = List[str, int, list, list, list] +type WeightedSimpleOption = List[int] +type WeightedOptions = List[WeightedOption] +type WeightedSimpleOptions = List[WeightedSimpleOption] + + +@dataclasses.dataclass +class Conditions: + tags: List[str] + + def add(self, v: str): + if v not in self.tags: + self.tags.append(v) + + def __contains__(self, item): + return item in self.tags + + def copy(self): + tags = list(set(self.tags)) + return Conditions(tags.copy()) + + +def random_range(a, b): + if a == b: + return a + if a > b: + a, b = b, a + return random.randint(a, b) + + +def select_weighted_option( + options: WeightedOptions | WeightedSimpleOptions, + conditions: Conditions, + callback: Callable[[List[str]], None] +) -> str | int: + """ + 选择一个加权选项 + :param options: 权重 + :param conditions: 条件 + :param callback: 回调 + :return: 选项 + """ + # 如果 conditions 的元素存在于最后两个数组中,则不会被选中 + def get_fourth_array(item: WeightedOption) -> List[str]: + if len(item) < 4: + return [] + return item[3] + + def get_fifth_array(item: WeightedOption) -> List[str]: + if len(item) < 5: + return [] + return item[4] + + filtered_options = [] + for option in options: + fourth = get_fourth_array(option) + fifth = get_fifth_array(option) + # 必须排除的条件 + if len(fifth) != 0: + for exclusion in fifth: + if exclusion in conditions: + continue + # 必须包含的条件 + if len(fourth) != 0: + for requirement in fourth: + if requirement not in conditions: + continue + filtered_options.append(option) + + # 增加随机性 + random.shuffle(filtered_options) + + # 计算总权重 + def get_weight(item: str | int) -> int: + return len(item) if isinstance(item, str) else item + + total_weight = sum(get_weight(option[1]) for option in filtered_options) + + # 随机选择 + random_value = random_range(0, total_weight) + cumulative_weight = 0 + # 逐个判断 + for option in filtered_options: + cumulative_weight += get_weight(option[1]) + if random_value <= cumulative_weight: + required = [] + if len(option) >= 4: + required = option[3] + callback(required) + return option[0] + return "" + + +def generate_appearance(tags: Conditions, gender: str, additional_tags: str, character_limit: int): + """ + 为人物生成外貌描述 + :param tags: 已有标签 + :param gender: 性别 + :param additional_tags: 额外标签 + :param character_limit: 人物数量 + :return: 外貌描述 + """ + selected_attributes = [] + uni_tags = tags.copy() + + def append_tags(required: List[str]): + for tag in required: + uni_tags.add(tag) + + def weighted_op(options: WeightedOptions | WeightedSimpleOptions, conditions: Conditions): + return select_weighted_option(options, conditions, append_tags) + + if random.random() < 0.1: + selected_attributes.append(weighted_op(animalCharacteristicsL, uni_tags)) + if random.random() < 0.4: + selected_attributes.append(weighted_op(skinTypesL, uni_tags)) + if random.random() < 0.05: + selected_attributes.append(weighted_op(eyeCharacteristicsL, uni_tags)) + if "no eyes" not in uni_tags: + if random.random() < 0.2: + selected_attributes.append(weighted_op(eyeExpressionsL, uni_tags)) + if random.random() < 0.8 and "nocoloreyes" not in uni_tags: + selected_attributes.append(weighted_op(eyeColorsL, uni_tags)) + # Hair Length + if random.random() < 0.8: + selected_attributes.append(weighted_op(hairLengthsL, uni_tags)) + + # Hair Style + if random.random() < 0.7: + selected_attributes.append(weighted_op(braidedHairstylesL, uni_tags)) + + # Hair Color + if random.random() < 0.7: + selected_attributes.append(weighted_op(hairColorsL, uni_tags)) + + # Hair Style and Pattern + if random.random() < 0.1: + selected_attributes.append(weighted_op(hairStylesAndPatternsL, uni_tags)) + selected_attributes.append(weighted_op(hairColorsL, uni_tags)) + + # Hair Accessories + if random.random() < 0.3: + selected_attributes.append(weighted_op(uniqueHairstylesL, uni_tags)) + + # Hair Accessories + if random.random() < 0.4: + selected_attributes.append(weighted_op(bangsStylesL, uni_tags)) + if gender.startswith("f") and random.random() < 0.8: + selected_attributes.append(weighted_op(breastSizesL, uni_tags)) + + if character_limit == 1: + body_feature_num = weighted_op( + [ + [0, 10], + [1, 30], + [2, 15], + [3, 5], + ], + uni_tags + ) + elif character_limit == 2: + body_feature_num = weighted_op( + [ + [0, 20], + [1, 40], + [2, 10], + ], + uni_tags + ) + else: + body_feature_num = weighted_op( + [ + [0, 30], + [1, 30], + ], + uni_tags + ) + + for _ in range(body_feature_num): + selected_attributes.append(weighted_op(bodyFeaturesL, uni_tags)) + + if random.random() < 0.2: + selected_attributes.append(weighted_op(hatsAndHeadwearL, uni_tags)) + if random.random() < 0.2: + selected_attributes.append(weighted_op(hatDecorationsL, uni_tags)) + elif random.random() < 0.3: + selected_attributes.append(weighted_op(hairAccessoriesL, uni_tags)) + + outfit_type = weighted_op( + [ + ["uniform", 25], + ["swimsuit", 5], + ["bodysuit", 5], + ["normal clothes", 40], + ], + uni_tags + ) + + if outfit_type == "uniform": + selected_attributes.append(weighted_op(armorsAndUniformsL, uni_tags)) + elif outfit_type == "swimsuit": + selected_attributes.append(weighted_op(swimwearL, uni_tags)) + elif outfit_type == "bodysuit": + selected_attributes.append(weighted_op(zipperedOutfitsL, uni_tags)) + elif outfit_type == "normal clothes": + # 生产袜子 + if gender.startswith("f") and random.random() < 0.5: + selected_attributes.append(weighted_op(socksAndStockingsL, uni_tags)) + if random.random() < 0.2: + selected_attributes.append(weighted_op(legwearStylesL, uni_tags)) + # 生产套装 + if gender.startswith("f") and random.random() < 0.2: + use_color = random.random() < 0.5 + color = weighted_op(colorsL, uni_tags) + attire = weighted_op(dressesAndAttireL, uni_tags) + selected_attributes.append(f"{color} {attire}" if use_color and attire else attire) + else: + # 生产上衣 + if random.random() < 0.85: + use_color = random.random() < 0.5 + color = weighted_op(colorsL, uni_tags) + top = weighted_op(topsAndShirtsL, uni_tags) + selected_attributes.append(f"{color} {top}" if use_color and top else top) + # 生产下衣 + if "legs" in uni_tags: + if random.random() < 0.85: + use_color = random.random() < 0.5 + color = weighted_op(colorsL, uni_tags) + bottom = weighted_op(pantsAndBottomsL, uni_tags) + selected_attributes.append(f"{color} {bottom}" if use_color and bottom else bottom) + # 生产鞋子 + if "feet" in uni_tags and random.random() < 0.6: + use_color = random.random() < 0.5 + color = weighted_op(colorsL, uni_tags) + footwear = weighted_op(bootsAndFootwearL, uni_tags) + selected_attributes.append(f"{color} {footwear}" if use_color and footwear else footwear) + + # 生产面部 + if random.random() < 0.6: + selected_attributes.append(weighted_op(facialExpressionsL, uni_tags)) + + # 生产动作 + if random.random() < 0.4: + selected_attributes.append(weighted_op(bodyPosesAndActionsL, uni_tags)) + + # 根据人物数量生产配饰 + if character_limit == 1: + accessory_iterations = weighted_op( + [ + [0, 10], + [1, 30], + [2, 15], + [3, 5], + ], + uni_tags + ) + elif character_limit == 2: + accessory_iterations = weighted_op( + [ + [0, 20], + [1, 40], + [2, 10], + ], + uni_tags + ) + else: + accessory_iterations = weighted_op( + [ + [0, 30], + [1, 30], + ], + uni_tags + ) + + for _ in range(accessory_iterations): + selected_attributes.append(weighted_op(accessoriesAndOuterwearL, uni_tags)) + + return [attribute for attribute in selected_attributes if attribute != ""] + + +def generate_scene_composition(): + scene_tags = [] + condition_set = Conditions(tags=[]) + character_details = [] + + def append_tags(required: List[str]): + for tag in required: + condition_set.add(tag) + + def weighted_op(options: WeightedOptions | WeightedSimpleOptions, conditions: Conditions): + return select_weighted_option(options, conditions, append_tags) + + character_count = weighted_op( + [ + [1, 70], + [2, 20], + [3, 7], + [0, 5], + ], + condition_set + ) + + if character_count == 0: + scene_tags.append("no humans") + if random.random() < 0.5: + scene_tags.append(weighted_op(artStylesL, condition_set)) + scene_tags.append(weighted_op(sceneTypesL, condition_set)) + + scene_element_count = weighted_op( + [ + [2, 15], + [3, 50], + [4, 15], + [5, 5], + ], + condition_set + ) + + for _ in range(scene_element_count): + scene_tags.append(weighted_op(sceneElementsL, condition_set)) + + object_count = weighted_op( + [ + [0, 15], + [1, 10], + [2, 20], + [3, 20], + [4, 20], + [5, 15], + ], + condition_set + ) + object_count -= character_count + object_count = max(0, object_count) + + for _ in range(object_count): + scene_tags.append(weighted_op(objectsAndStuffedAnimalsL, condition_set)) + + return [", ".join(filter(None, scene_tags))] + + if random.random() < 0.5: + scene_tags.append(weighted_op(artStylesL, condition_set)) + + male_count = 0 + female_count = 0 + other_count = 0 + + for _ in range(character_count): + gender = weighted_op( + [ + ["m", 30], + ["f", 60], + ["o", 0], + ], + condition_set + ) + if gender == "m": + male_count += 1 + elif gender == "f": + female_count += 1 + elif gender == "o": + other_count += 1 + + if female_count >= 1: + scene_tags.insert(0, f"{female_count}girl{'s' if female_count > 1 else ''}") + if male_count >= 1: + scene_tags.insert(0, f"{male_count}boy{'s' if male_count > 1 else ''}") + if other_count >= 1: + scene_tags.insert(0, f"{other_count}other{'s' if other_count > 1 else ''}") + + if random.random() < 0.8: + background_type = weighted_op(backgroundTypesL, condition_set) + scene_tags.append(background_type) + if background_type == "scenery" and random.random() < 0.5: + scenery_elements_count = random.randint(1, 3) + for _ in range(scenery_elements_count): + # Add scenery elements + scene_tags.append(weighted_op(sceneElementsL, condition_set)) + + # 添加镜头角度 + if random.random() < 0.3: + scene_tags.append(weighted_op(cameraAnglesL, condition_set)) + + # 添加镜头构图 + framing_type = weighted_op(framingTypesL, condition_set) if random.random() < 0.7 else None + if framing_type: + scene_tags.append(framing_type) + + # 为女性生成外貌描述 + for _ in range(female_count): + female_appearance = ["girl"] + generate_appearance(condition_set, "f", framing_type, character_count) + character_details.append(female_appearance) + + # 为男性生成外貌描述 + for _ in range(male_count): + male_appearance = ["boy"] + generate_appearance(condition_set, "m", framing_type, character_count) + character_details.append(male_appearance) + + # 为其他生成外貌描述 + for _ in range(other_count): + other_appearance = ["other"] + generate_appearance(condition_set, "o", framing_type, character_count) + character_details.append(other_appearance) + + # 添加场景元素 + if random.random() < 0.2: + object_count = random.randint(0, 4) + if character_count == 2: + object_count = random.randint(0, 3) + for _ in range(object_count): + scene_tags.append(weighted_op(objectsAndStuffedAnimalsL, condition_set)) + + # 添加特效 + if random.random() < 0.25: + effects_count = random.randint(1, 3) + for _ in range(effects_count): + scene_tags.append(weighted_op(effectsAndPatternsL, condition_set)) + + # 添加年份主题 + if random.random() < 0.2: + scene_tags.append(weighted_op(yearlyThemesL, condition_set)) + + # 添加物体焦点 + if random.random() < 0.1: + scene_tags.append(weighted_op(subjectFocusL, condition_set)) + + # 去重 + scene_tags = list(filter(None, set(scene_tags))) + return [ + ", ".join(scene_tags), + *[", ".join(details) for details in character_details] + ] + + +if __name__ == "__main__": + print(generate_scene_composition()) From 4ef156465772e395d337f928ae4a0ab8a0499a84 Mon Sep 17 00:00:00 2001 From: sudoskys Date: Wed, 25 Dec 2024 14:55:18 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=F0=9F=9A=80=20feat:=20implement=20image=20?= =?UTF-8?q?metadata=20extraction=20and=20verification?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add functionality to extract metadata from images using LSB and PNGInfo. - Implement methods to verify if images are generated by NovelAI. - Add support for handling additional metadata formats and validation. - Refactor existing code for improved error handling and validation. --- README.md | 9 +- pdm.lock | 26 +- playground/banner-raw.png | Bin 30661 -> 35357 bytes playground/image_metadata/apply_lsb.py | 21 - .../image_metadata/apply_lsb_to_image.py | 29 + ...ead_lsb.py => image_lsb_data_extractor.py} | 5 +- playground/image_metadata/read_image.py | 29 - playground/image_metadata/read_image_info.py | 33 + .../image_metadata/read_image_nai_tag.py | 35 + playground/image_metadata/read_nai_tag.py | 27 - playground/image_metadata/sample-0316-out.png | Bin 67086 -> 66970 bytes .../{verify.py => verify_is_nai_generated.py} | 6 +- playground/other/augment-image.py | 61 - playground/other/queue_select.py | 27 - playground/paint_mask/__init__.py | 11 +- playground/random_prompt.py | 26 +- ...nizer_demo.py => ignore.tokenizer_demo.py} | 0 playground/tokenizer/usage.py | 4 +- .../{t5.py => use_tokenizer_directly.py} | 0 pyproject.toml | 3 +- .../sdk/ai/generate/__init__.py | 3 +- src/novelai_python/sdk/ai/generate/_schema.py | 2 +- .../sdk/ai/generate_image/__init__.py | 3 +- .../tool/image_metadata/__init__.py | 271 +- .../tool/image_metadata/_type.py | 21 - .../tool/image_metadata/lsb_extractor.py | 54 +- .../tool/random_prompt/__init__.py | 428 +- .../generate_scene_composition.py | 139 +- .../tool/random_prompt/generate_scene_tags.py | 2276 +++++ .../tool/random_prompt/generate_tags.py | 2517 ++++++ src/novelai_python/tool/random_prompt/tag.py | 7542 ----------------- .../tool/random_prompt/tag_character.py | 270 - .../tool/random_prompt/tag_nsfw.py | 984 --- tests/test_random_prompt.py | 75 +- 34 files changed, 5330 insertions(+), 9607 deletions(-) delete mode 100644 playground/image_metadata/apply_lsb.py create mode 100644 playground/image_metadata/apply_lsb_to_image.py rename playground/image_metadata/{read_lsb.py => image_lsb_data_extractor.py} (68%) delete mode 100644 playground/image_metadata/read_image.py create mode 100644 playground/image_metadata/read_image_info.py create mode 100644 playground/image_metadata/read_image_nai_tag.py delete mode 100644 playground/image_metadata/read_nai_tag.py rename playground/image_metadata/{verify.py => verify_is_nai_generated.py} (58%) delete mode 100644 playground/other/augment-image.py delete mode 100644 playground/other/queue_select.py rename playground/tokenizer/{tokenizer_demo.py => ignore.tokenizer_demo.py} (100%) rename playground/tokenizer/{t5.py => use_tokenizer_directly.py} (100%) delete mode 100644 src/novelai_python/tool/image_metadata/_type.py create mode 100644 src/novelai_python/tool/random_prompt/generate_scene_tags.py create mode 100644 src/novelai_python/tool/random_prompt/generate_tags.py delete mode 100644 src/novelai_python/tool/random_prompt/tag.py delete mode 100644 src/novelai_python/tool/random_prompt/tag_character.py delete mode 100644 src/novelai_python/tool/random_prompt/tag_nsfw.py diff --git a/README.md b/README.md index 28251fc..df53d1c 100755 --- a/README.md +++ b/README.md @@ -7,7 +7,8 @@ ✨ NovelAI api python sdk with Pydantic, modern and user-friendly. -The goal of this repository is to use Pydantic to build legitimate requests to access the NovelAI API service. +The goal of this repository is to use Pydantic to build legitimate requests to access +the [NovelAI API service](https://api.novelai.net/docs). > Python >= 3.9 is required. @@ -22,6 +23,10 @@ The goal of this repository is to use Pydantic to build legitimate requests to a pip -U install novelai-python ``` +For security reasons, storing user credentials in plaintext is strongly discouraged. + +All API users must adhere to the NovelAI Terms of Service: https://novelai.net/terms. + **More examples can be found in the [playground](https://github.com/LlmKira/novelai-python/tree/main/playground) directory, read code as documentation.** @@ -203,8 +208,6 @@ https://dghs-imgutils.deepghs.org/main/api_doc/operate/censor.html ## 🙏 Acknowledgements -[BackEnd](https://api.novelai.net/docs) - [novelai-api](https://github.com/Aedial/novelai-api) [NovelAI-API](https://github.com/HanaokaYuzu/NovelAI-API) diff --git a/pdm.lock b/pdm.lock index 4efffbe..cbda47b 100755 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev", "testing"] strategy = ["cross_platform", "inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:ab8cd395ee85fe76f8f6baf90c8597097b176ae23b182230de866c1c7daa9273" +content_hash = "sha256:e9d025463ac3e47319eabdd8448b6ecc51a9abefcdaf8c13dc4e2e3ad9af34e6" [[metadata.targets]] requires_python = ">=3.9" @@ -678,8 +678,7 @@ name = "importlib-resources" version = "6.1.3" requires_python = ">=3.8" summary = "Read resources from Python packages" -groups = ["default"] -marker = "python_version < \"3.10\"" +groups = ["default", "dev"] dependencies = [ "zipp>=3.1.0; python_version < \"3.10\"", ] @@ -1715,6 +1714,25 @@ files = [ {file = "virtualenv-20.25.1.tar.gz", hash = "sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197"}, ] +[[package]] +name = "wasmtime" +version = "28.0.0" +requires_python = ">=3.9" +summary = "A WebAssembly runtime powered by Wasmtime" +groups = ["dev"] +dependencies = [ + "importlib-resources>=5.10", +] +files = [ + {file = "wasmtime-28.0.0-py3-none-any.whl", hash = "sha256:34da39dac8bf80a0e150920a0cd36a33a8397796250b72ccf21560e0ae3f0953"}, + {file = "wasmtime-28.0.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:6309664eac06b562e80f35f875228e7359e7361f10da5cb81da0545c5c8f9b00"}, + {file = "wasmtime-28.0.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:85959652ba04d07b0b5d33d41c3146d556f38fc9153ea696d2eee2d22af54739"}, + {file = "wasmtime-28.0.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:e2656429c13f408f8cb42b60dc49b96103525ca5e746e948c2cbd6052a86b047"}, + {file = "wasmtime-28.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:99f4b16ab33cd3877fa00ca80ecd7aebf44bbb3ac8101b064fe46fdfe09e737b"}, + {file = "wasmtime-28.0.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:34f91f27d2e4147f05a334b22fb2de74bbeaaf81653cf7d424cd26983a7c292e"}, + {file = "wasmtime-28.0.0-py3-none-win_amd64.whl", hash = "sha256:74996ca26e5726615dd8d5bd91b855d16373033687e8fe6bc60d5be222da33eb"}, +] + [[package]] name = "watchfiles" version = "0.21.0" @@ -1913,7 +1931,7 @@ name = "zipp" version = "3.17.0" requires_python = ">=3.8" summary = "Backport of pathlib-compatible object wrapper for zip files" -groups = ["default"] +groups = ["default", "dev"] marker = "python_version < \"3.10\"" files = [ {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, diff --git a/playground/banner-raw.png b/playground/banner-raw.png index 705e400ed50227592a538862d629aec7e5b10039..e0a8c2d95f31773ac246c167064b1b9512351291 100644 GIT binary patch delta 34993 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 APyhe` delta 30371 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.5.0", + "wasmtime>=28.0.0", ] diff --git a/src/novelai_python/sdk/ai/generate/__init__.py b/src/novelai_python/sdk/ai/generate/__init__.py index b497f46..73aecdd 100644 --- a/src/novelai_python/sdk/ai/generate/__init__.py +++ b/src/novelai_python/sdk/ai/generate/__init__.py @@ -341,7 +341,8 @@ async def request(self, override_headers: Optional[dict] = None ) -> LLMResp: """ - 生成图片 + Generate text using NovelAI's large language models. According to our Terms of Service, all generation requests must be initiated by a human action. Automating text or image generation to create excessive load on our systems is not allowed. + :param override_headers: :param session: session :return: LLMStreamResp diff --git a/src/novelai_python/sdk/ai/generate/_schema.py b/src/novelai_python/sdk/ai/generate/_schema.py index c5ffdae..48cfd52 100644 --- a/src/novelai_python/sdk/ai/generate/_schema.py +++ b/src/novelai_python/sdk/ai/generate/_schema.py @@ -115,7 +115,7 @@ class LLMGenerationParams(BaseModel): repetition_penalty_slope: Optional[Union[float, int]] = Field(default=None, ge=0, allow_inf_nan=False) eos_token_id: int = None - bad_words_ids: List[List[int]] = None + bad_words_ids: Optional[List[List[int]]] = None logit_bias_groups: Optional[List[LogitBiasGroup]] = Field(default_factory=list) repetition_penalty_frequency: Optional[Union[float, int]] = Field(default=None, allow_inf_nan=False) diff --git a/src/novelai_python/sdk/ai/generate_image/__init__.py b/src/novelai_python/sdk/ai/generate_image/__init__.py index e3a2dfe..f8183eb 100755 --- a/src/novelai_python/sdk/ai/generate_image/__init__.py +++ b/src/novelai_python/sdk/ai/generate_image/__init__.py @@ -891,7 +891,8 @@ async def request(self, override_headers: Optional[dict] = None, ) -> ImageGenerateResp: """ - 生成图片 + Generate images using NovelAI's diffusion models. According to our Terms of Service, all generation requests must be initiated by a human action. Automating text or image generation to create excessive load on our systems is not allowed. + :param override_headers: the headers to override :param session: session :return: diff --git a/src/novelai_python/tool/image_metadata/__init__.py b/src/novelai_python/tool/image_metadata/__init__.py index 351a8d0..19e39d8 100644 --- a/src/novelai_python/tool/image_metadata/__init__.py +++ b/src/novelai_python/tool/image_metadata/__init__.py @@ -13,94 +13,109 @@ from pydantic import BaseModel, ConfigDict from novelai_python.sdk.ai._enum import PROMOTION, Model -from ._type import IMAGE_INPUT_TYPE, get_image_bytes from .bch_utils import fec_decode from .lsb_extractor import ImageLsbDataExtractor from .lsb_injector import inject_data +class BrokenMetaDataError(Exception): + pass + + +class BrokenCommentError(Exception): + pass + + +class CommentModel(BaseModel): + prompt: Optional[str] = None + steps: Optional[int] = None + height: Optional[int] = None + width: Optional[int] = None + scale: Optional[float] = None + uncond_scale: Optional[float] = None + cfg_rescale: Optional[float] = None + seed: Optional[int] = None + n_samples: Optional[int] = None + hide_debug_overlay: Optional[bool] = None + noise_schedule: Optional[str] = None + legacy_v3_extend: Optional[bool] = None + reference_information_extracted: Optional[float] = None + reference_strength: Optional[float] = None + reference_strength_multiple: Optional[List[float]] = None + reference_information_extracted_multiple: Optional[List[float]] = None + sampler: Optional[str] = None + controlnet_strength: Optional[float] = None + controlnet_model: Optional[Union[None, str]] = None + dynamic_thresholding: Optional[bool] = None + dynamic_thresholding_percentile: Optional[float] = None + dynamic_thresholding_mimic_scale: Optional[float] = None + sm: Optional[bool] = None + sm_dyn: Optional[bool] = None + skip_cfg_below_sigma: Optional[float] = None + lora_unet_weights: Optional[Union[None, str]] = None + lora_clip_weights: Optional[Union[None, str]] = None + uc: Optional[str] = None + request_type: Optional[str] = None + signed_hash: Optional[str] = None + skip_cfg_above_sigma: Optional[float] = None + deliberate_euler_ancestral_bug: Optional[bool] = None + prefer_brownian: Optional[bool] = None + cfg_sched_eligibility: Optional[str] = None + explike_fine_detail: Optional[bool] = None + minimize_sigma_inf: Optional[bool] = None + uncond_per_vibe: Optional[bool] = None + wonky_vibe_correlation: Optional[bool] = None + version: Optional[int] = None + + extra_passthrough_testing: Optional[dict] = None + """More test infomation""" + v4_prompt: Optional[dict] = None + v4_negative_prompt: Optional[dict] = None + + model_config = ConfigDict(extra="allow") + + @property + def generate_method(self): + return self.request_type or "Unknown" + + @property + def negative_prompt(self): + return self.uc + + @property + def vibe_transfer_strength(self) -> List[float]: + """ + Get the vibe transfer strength totally + """ + if self.reference_strength_multiple: + return self.reference_strength_multiple + reference_strength = [] if self.reference_strength is None else [self.reference_strength] + return reference_strength + + @property + def vibe_transfer_information(self) -> List[float]: + """ + Get the vibe transfer information totally + """ + if self.reference_information_extracted_multiple: + return self.reference_information_extracted_multiple + reference_information = [] if self.reference_information_extracted is None else [ + self.reference_information_extracted] + return reference_information + + class ImageMetadata(BaseModel): """ ImageMetadata is a class that represents the metadata of a NovelAI generated image. """ - class CommentModel(BaseModel): - prompt: Optional[str] = None - steps: Optional[int] = None - height: Optional[int] = None - width: Optional[int] = None - scale: Optional[float] = None - uncond_scale: Optional[float] = None - cfg_rescale: Optional[float] = None - seed: Optional[int] = None - n_samples: Optional[int] = None - hide_debug_overlay: Optional[bool] = None - noise_schedule: Optional[str] = None - legacy_v3_extend: Optional[bool] = None - reference_information_extracted: Optional[float] = None - reference_strength: Optional[float] = None - reference_strength_multiple: Optional[List[float]] = None - reference_information_extracted_multiple: Optional[List[float]] = None - sampler: Optional[str] = None - controlnet_strength: Optional[float] = None - controlnet_model: Optional[Union[None, str]] = None - dynamic_thresholding: Optional[bool] = None - dynamic_thresholding_percentile: Optional[float] = None - dynamic_thresholding_mimic_scale: Optional[float] = None - sm: Optional[bool] = None - sm_dyn: Optional[bool] = None - skip_cfg_below_sigma: Optional[float] = None - lora_unet_weights: Optional[Union[None, str]] = None - lora_clip_weights: Optional[Union[None, str]] = None - uc: Optional[str] = None - request_type: Optional[str] = None - signed_hash: Optional[str] = None - skip_cfg_above_sigma: Optional[float] = None - deliberate_euler_ancestral_bug: Optional[bool] = None - prefer_brownian: Optional[bool] = None - cfg_sched_eligibility: Optional[str] = None - explike_fine_detail: Optional[bool] = None - minimize_sigma_inf: Optional[bool] = None - uncond_per_vibe: Optional[bool] = None - wonky_vibe_correlation: Optional[bool] = None - version: Optional[int] = None - - model_config = ConfigDict(extra="allow") - - @property - def generate_method(self): - return self.request_type or "Unknown" - - @property - def negative_prompt(self): - return self.uc - - @property - def vibe_transfer_strength(self) -> List[float]: - """ - Get the vibe transfer strength totally - """ - if self.reference_strength_multiple: - return self.reference_strength_multiple - reference_strength = [] if self.reference_strength is None else [self.reference_strength] - return reference_strength - - @property - def vibe_transfer_information(self) -> List[float]: - """ - Get the vibe transfer information totally - """ - if self.reference_information_extracted_multiple: - return self.reference_information_extracted_multiple - reference_information = [] if self.reference_information_extracted is None else [ - self.reference_information_extracted] - return reference_information - - Title: str = "AI generated image" - Software: str = "NovelAI" - Source: str = None - Description: str - Comment: CommentModel + Generation_time: Optional[float] = None + Comment: Optional[CommentModel] = None + Title: Optional[str] = None + Description: Optional[str] = None + Software: Optional[str] = None + Source: Optional[str] = None + dpi: Optional[Tuple[float, float]] = None model_config = ConfigDict(extra="allow") @@ -113,14 +128,13 @@ def used_model(self) -> Union[Model, None]: return PROMOTION.get(self.Source, None) @staticmethod - def reset_alpha(image: IMAGE_INPUT_TYPE) -> BytesIO: + def reset_alpha(image: Image.Image) -> BytesIO: """ Remove LSB from the image, set the alpha channel to 254 :param image: Type: Union[str, bytes, Path, BytesIO] :return: BytesIO """ - image_data = get_image_bytes(image) - image = Image.open(image_data).convert('RGBA') + image = image.convert('RGBA') data = np.array(image) data[..., 3] = 254 new_image = Image.fromarray(data, 'RGBA') @@ -128,7 +142,7 @@ def reset_alpha(image: IMAGE_INPUT_TYPE) -> BytesIO: new_image.save(_new_img_io, format="PNG") return _new_img_io - def apply_to_image(self, image: IMAGE_INPUT_TYPE, *, inject_lsb: bool = True) -> BytesIO: + def apply_to_image(self, image: Image.Image, *, inject_lsb: bool = True) -> BytesIO: """ Write metadata to origin_image If you set inject_lsb to True, the image will be injected with metadata using LSB. @@ -138,10 +152,9 @@ def apply_to_image(self, image: IMAGE_INPUT_TYPE, *, inject_lsb: bool = True) -> :param inject_lsb: Inject metadata using LSB :return: BytesIO """ - image_data = get_image_bytes(image) - origin_image = Image.open(image_data) + origin_image = image metadata = PngInfo() - for k, v in self.model_dump(mode="json").items(): + for k, v in self.model_dump(mode="json", exclude_none=True).items(): if isinstance(v, dict): v = json.dumps(v) metadata.add_text(k, v) @@ -155,7 +168,7 @@ def apply_to_image(self, image: IMAGE_INPUT_TYPE, *, inject_lsb: bool = True) -> return be_copy_image @classmethod - def _extract_metadata_from_lsb(cls, image: IMAGE_INPUT_TYPE): + def _extract_metadata_from_lsb(cls, image: Image.Image): """ Extract metadata using LSB extraction method. :param image: IMAGE_INPUT_TYPE @@ -168,38 +181,50 @@ def _extract_metadata_from_lsb(cls, image: IMAGE_INPUT_TYPE): return None @classmethod - def _extract_metadata_from_comments(cls, image: IMAGE_INPUT_TYPE): + def _extract_metadata_from_comments(cls, image: Image.Image): """ Extract metadata from image comments and other info. :param image: Union[str, bytes, Path, BytesIO] """ - with Image.open(image) as img: - title = img.info.get("Title", None) - description = img.info.get("Description", None) - comment = img.info.get("Comment", "{}") - try: - comment_dict = json.loads(comment) - except Exception as e: - logger.trace(f"Error loading comment: {e}") - comment_dict = {} + generate_map = image.info + comment = generate_map.get("Comment", "{}") try: - comment_dict.setdefault("prompt", description) - comment_model = cls.CommentModel.model_validate(comment_dict) - return cls(Title=title, Description=description, Comment=comment_model) + comment_dict = json.loads(comment) except Exception as e: - logger.debug(f"Error loading comment: {e}") - return None + raise BrokenMetaDataError( + f"ImageMetadata: non-standard comment json cant be loaded, given image maybe be modified!" + ) from e + comment_dict["prompt"] = comment_dict.get("prompt", "") + try: + comment_model = CommentModel.model_validate(comment_dict) + except Exception as e: + raise BrokenCommentError( + f"ImageMetadata: comment model validate failed, given image maybe be modified." + "If you are sure that the image is from novelai.net, please issue this problem to " + "https://github.com/LlmKira/novelai-python/issues." + ) from e + try: + return cls.model_validate( + { + **generate_map, + "Comment": comment_model.model_dump(mode="python"), + } + ) + except Exception as e: + raise BrokenMetaDataError( + f"ImageMetadata: some error occurred when validate the model, are the image from novelai.net?" + ) from e @classmethod - def load_image(cls, image: IMAGE_INPUT_TYPE): + def load_image(cls, image: Image.Image): """ Load image and extract metadata using LSB/Metadata :param image: str, bytes, Path, BytesIO :return: ImageMetadata :raises ValueError: Data extraction failed """ - image_data = get_image_bytes(image) - metadata = cls._extract_metadata_from_lsb(image_data) + + metadata = cls._extract_metadata_from_lsb(image) if metadata: return metadata metadata = cls._extract_metadata_from_comments(image) @@ -207,12 +232,37 @@ def load_image(cls, image: IMAGE_INPUT_TYPE): return metadata raise ValueError("No metadata found") + @classmethod + def load_from_watermark(cls, image: Image.Image): + """ + Load image and extract metadata using LSB/Metadata + :param image: str, bytes, Path, BytesIO + :return: ImageMetadata + :raises ValueError: Data extraction failed + """ + metadata = cls._extract_metadata_from_lsb(image) + if metadata: + return metadata + raise ValueError("No metadata found") + + @classmethod + def load_from_pnginfo(cls, image: Image.Image): + """ + Load image and extract metadata using LSB/Metadata + :param image: str, bytes, Path, BytesIO + :return: ImageMetadata + :raises ValueError: Data extraction failed + """ + metadata = cls._extract_metadata_from_comments(image) + if metadata: + return metadata + raise ValueError("No metadata found") + class ImageVerifier: @staticmethod def verify_latents(image: Image.Image, signed_hash: bytes, verify_key: VerifyKey): - image.load() sig = None latents = None try: @@ -248,20 +298,19 @@ def verify_latents(image: Image.Image, signed_hash: bytes, verify_key: VerifyKey return False, False, None def verify(self, - image, + image: Image.Image, verify_key_hex: str = "Y2JcQAOhLwzwSDUJPNgL04nS0Tbqm7cSRc4xk0vRMic=" ) -> Tuple[bool, bool]: """ Verify if the image is a NovelAI generated image - :param image: Union[str, bytes, Path, BytesIO] - The input image to verify. + :param image: PIL.Image.Image - The image to verify. :param verify_key_hex: str - The verification key in base64 format. :return: Tuple[bool, bool] - The first bool indicates if the image is verified, the second bool indicates if the image has latents. :raises ValueError: If the required metadata or signed hash is missing. """ - image_obj = Image.open(get_image_bytes(image)) - w, h = image_obj.size - image_array = np.array(image_obj) + w, h = image.size + image_array = np.array(image) try: metadata, fec_data = ImageLsbDataExtractor().extract_data(image, get_fec=True) except Exception as e: @@ -277,7 +326,7 @@ def verify(self, # Build verify key verify_key = VerifyKey(verify_key_hex.encode("utf-8"), encoder=Base64Encoder) # Verify latents - good_latents, have_latents, latents = self.verify_latents(image_obj, signed_hash, verify_key) + good_latents, have_latents, latents = self.verify_latents(image, signed_hash, verify_key) if not good_latents: return False, False rgb = image_array[:, :, :3].tobytes() diff --git a/src/novelai_python/tool/image_metadata/_type.py b/src/novelai_python/tool/image_metadata/_type.py deleted file mode 100644 index fc9252b..0000000 --- a/src/novelai_python/tool/image_metadata/_type.py +++ /dev/null @@ -1,21 +0,0 @@ -from io import BytesIO -from pathlib import Path -from typing import Union - -IMAGE_INPUT_TYPE = Union[str, bytes, Path, BytesIO] - - -def get_image_bytes(image: IMAGE_INPUT_TYPE) -> BytesIO: - if isinstance(image, (str, Path)): - try: - with open(image, "rb") as f: - return BytesIO(f.read()) - except FileNotFoundError: - raise FileNotFoundError(f"Image not found: {image}") - elif isinstance(image, BytesIO): - image.seek(0) - return image - elif isinstance(image, bytes): - return BytesIO(image) - else: - raise TypeError(f"Invalid image type: {type(image)}, only {IMAGE_INPUT_TYPE} is supported") diff --git a/src/novelai_python/tool/image_metadata/lsb_extractor.py b/src/novelai_python/tool/image_metadata/lsb_extractor.py index be376ed..a917c94 100644 --- a/src/novelai_python/tool/image_metadata/lsb_extractor.py +++ b/src/novelai_python/tool/image_metadata/lsb_extractor.py @@ -1,9 +1,6 @@ # MIT: https://github.com/NovelAI/novelai-image-metadata/blob/main/nai_meta.py import gzip import json -from io import BytesIO -from pathlib import Path -from typing import Union import numpy as np from PIL import Image @@ -19,6 +16,11 @@ def __init__(self, data): self.col = 0 def _extract_next_bit(self): + """ + Extract the next bit from the pixel's least significant bit (LSB). + Returns `True` if a bit was successfully extracted, `False` + if we have reached the end of the data. + """ if self.row < self.rows and self.col < self.cols: bit = self.data[self.row, self.col, self.dim - 1] & 1 self.bits += 1 @@ -28,25 +30,51 @@ def _extract_next_bit(self): if self.row == self.rows: self.row = 0 self.col += 1 + return True + return False def get_one_byte(self): + """ + Extract one byte (8 bits) from the image data using LSB. + Returns the byte if successfully extracted, otherwise `None` if the data ends prematurely. + """ while self.bits < 8: - self._extract_next_bit() + if not self._extract_next_bit(): + # If we run out of data before completing a byte, return None + if self.bits == 0: + return None + + # If we have partial bits, pad remaining bits with 0s and return + self.byte <<= (8 - self.bits) + padded_byte = bytearray([self.byte]) + self.bits = 0 + self.byte = 0 + return padded_byte + byte = bytearray([self.byte]) self.bits = 0 self.byte = 0 return byte def get_next_n_bytes(self, n): + """ + Extract the next `n` bytes sequentially from the image data. + Stops if not enough data is available. + """ bytes_list = bytearray() for _ in range(n): byte = self.get_one_byte() - if not byte: + if byte is None: # Stop if we run out of data break bytes_list.extend(byte) return bytes_list def read_32bit_integer(self): + """ + Attempt to read a 32-bit integer (4 bytes). + Returns the integer value if successfully extracted, otherwise `None` + if insufficient data is available. + """ bytes_list = self.get_next_n_bytes(4) if len(bytes_list) == 4: integer_value = int.from_bytes(bytes_list, byteorder='big') @@ -59,14 +87,14 @@ class ImageLsbDataExtractor(object): def __init__(self): self.magic = "stealth_pngcomp" - def extract_data(self, image: Union[BytesIO, bytes, Path], get_fec: bool = False) -> tuple: - if isinstance(image, (bytes, BytesIO, Path)): - img = Image.open(image) - img.convert("RGBA") - image = np.array(img) - else: - raise TypeError(f"Invalid image type: {type(image)}, only {type(BytesIO)} is supported") - + def extract_data(self, image: Image.Image, get_fec: bool = False) -> tuple: + """ + Get the data from the image + :param image: Pillow Image object + :param get_fec: bool + :return: json_data, fec_data + """ + image = np.array(image.copy().convert("RGBA")) try: if not (image.shape[-1] == 4 and len(image.shape) == 3): raise AssertionError('image format error, maybe image already be modified') diff --git a/src/novelai_python/tool/random_prompt/__init__.py b/src/novelai_python/tool/random_prompt/__init__.py index 751b3f1..bbcd08e 100644 --- a/src/novelai_python/tool/random_prompt/__init__.py +++ b/src/novelai_python/tool/random_prompt/__init__.py @@ -1,367 +1,95 @@ # -*- coding: utf-8 -*- -import random -from typing import List +from typing import List, Literal -from .tag import ( - cameraPerspective, cameraFocus, backgroundTheme, backgroundColor, cameraAngle, artStyle, - animalFeatures, - sinkColor, eyeCharacteristics, eyesExpression, hairLength, backHairStyle, hairFeatures, breastsSize, - bodyFeatures, - headWears, clothesAccessories, years, uppers, - backgroundObjects, - accessories, - effects, eyeColors, athletic as bodysuit, hairColors, hairColorExtra, hatOrnaments, uniform, swimsuits, legwear, - socks, - action, expression, footwears, bottoms, color as colors -) -from .tag_character import rankMoods, rankCharacter, rankIdentity -from .tag_nsfw import nsfw +from novelai_python.tool.random_prompt.generate_scene_composition import generate_scene_composition, \ + generate_appearance, Conditions +from novelai_python.tool.random_prompt.generate_scene_tags import generate_scene_tags, generate_character_traits +from novelai_python.tool.random_prompt.generate_tags import generate_tags, get_holiday_themed_tags class RandomPromptGenerator(object): - def __init__(self, nsfw_enabled): - self.nsfw_enabled = nsfw_enabled + + def __init__(self, **kwargs): + pass @staticmethod - def get_weighted_choice(tags, existing_tags: List[str]): - """ - Get a weighted choice from a list of tags - :param tags: a list of tags - :param existing_tags: a list of existing tags - :return: a tag - """ - valid_tags = [ - tag - for tag in tags - if len(tag) < 3 or not tag[2] or any(sub_tag in existing_tags for sub_tag in tag[2]) - ] - total_weight = sum(tagr[1] for tagr in valid_tags if len(tagr) > 1) - if total_weight == 0: - if isinstance(tags, list): - rd = random.choice(tags) - elif isinstance(tags, str): - rd = tags - else: - raise ValueError('get_weighted_choice: should not reach here') - return rd - random_number = random.randint(1, total_weight) - cumulative_weight = 0 - for tag in valid_tags: - cumulative_weight += tag[1] - if random_number <= cumulative_weight: - if isinstance(tag, str): - raise Exception("tag is string") - return tag[0] - raise ValueError('get_weighted_choice: should not reach here') + def generate_scene_composition() -> List[str]: + return generate_scene_composition() - def character_features(self, gender, camera_angle, nsfw_enabled, num_characters, enable_skin_color=True): - """ - Add character features to the prompt - :param enable_skin_color: enable skin - :param gender: 'm', 'f', 'o' - :param camera_angle: the camera angle of the prompt - :param nsfw_enabled: True or False - :param num_characters: the num of characters in the prompt - :return: a list of character features - """ + @staticmethod + def generate_scene_tags() -> list: + return generate_scene_tags() + + @staticmethod + def generate_common_tags(nsfw: bool = False) -> str: + return generate_tags(nsfw) - features = [] - if random.random() < 0.1: - features.append(self.get_weighted_choice(animalFeatures, features)) - unique_features = {'mermaid', 'centaur', 'lamia'} - has_unique_feature = any(feature in features for feature in unique_features) - if random.random() < 0.1 and enable_skin_color: - features.append(self.get_weighted_choice(sinkColor, features)) - if random.random() < 0.7: - features.append(self.get_weighted_choice(eyeColors, features)) - if random.random() < 0.1: - features.append(self.get_weighted_choice(eyeCharacteristics, features)) - if random.random() < 0.6: - features.append(self.get_weighted_choice(eyesExpression, features)) - if random.random() < 0.2: - features.append(self.get_weighted_choice(hairLength, features)) - if random.random() < 0.2: - features.append(self.get_weighted_choice(backHairStyle, features)) - if random.random() < 0.1: - features.append(self.get_weighted_choice(hairColors, features)) - if random.random() < 0.1: - features.append(self.get_weighted_choice(hairColorExtra, features)) - features.append(self.get_weighted_choice(hairColors, features)) - if random.random() < 0.12: - features.append(self.get_weighted_choice(hairFeatures, features)) - if gender.startswith('f') and random.random() < 0.8: - features.append(self.get_weighted_choice(breastsSize, features)) - num_body_features = 0 - if num_characters == 1: - num_body_features = self.get_weighted_choice([[0, 10], [1, 30], [2, 15], [3, 5]], features) - elif num_characters == 2: - num_body_features = self.get_weighted_choice([[0, 20], [1, 40], [2, 10]], features) - else: - num_body_features = self.get_weighted_choice([[0, 30], [1, 30]], features) - for _ in range(num_body_features): - features.append(self.get_weighted_choice(bodyFeatures, features)) - if random.random() < 0.3: - features.append(self.get_weighted_choice(headWears, features)) - if random.random() < 0.5: - features.append(self.get_weighted_choice(hatOrnaments, features)) - clothing_type = self.get_weighted_choice(['uniform', 'swimsuit', 'bodysuit', 'normal clothes'], features) - if nsfw_enabled and random.random() < 0.9: - undressing_choice = self.get_weighted_choice(nsfw["undressing"], features) - if undressing_choice: - features.append(undressing_choice) - else: - underwear_choice = self.get_weighted_choice(nsfw["underwear"], features) - features.append(underwear_choice) - if random.random() < 0.5: - clothing_type = None - if random.random() < 0.5: - features.append(self.get_weighted_choice(nsfw["naked"], features)) - clothing_type = None - if clothing_type == 'uniform': - features.append(self.get_weighted_choice(uniform, features)) - elif clothing_type == 'swimsuit': - features.append(self.get_weighted_choice(swimsuits, features)) - elif clothing_type == 'bodysuit': - features.append(self.get_weighted_choice(bodysuit, features)) - elif clothing_type == 'normal clothes': - if gender.startswith('f') and random.random() < 0.5: - features.append(self.get_weighted_choice(socks, features)) - if random.random() < 0.3: - features.append(self.get_weighted_choice(legwear, features)) - if random.random() < 0.75: - color = self.get_weighted_choice(colors, features) - upper_clothing = self.get_weighted_choice(uppers, features) - features.append(f'{color} {upper_clothing}') - if not has_unique_feature: - if random.random() < 0.85: - color = self.get_weighted_choice(colors, features) - bottom_clothing = self.get_weighted_choice(bottoms, features) - features.append(f'{color} {bottom_clothing}') - if random.random() < 0.7: - color = self.get_weighted_choice(colors, features) - footwear = self.get_weighted_choice(footwears, features) - features.append(f'{color} {footwear}') - if random.random() < 0.7: - features.append(self.get_weighted_choice(expression, features)) - if random.random() < (1 if nsfw_enabled and num_characters >= 1 else 0.5): - # 单角色 + nsfw 为 1 - possible_actions = action - if nsfw_enabled: - if random.random() < 0.5: - features.append(self.get_weighted_choice(nsfw["action"], features)) - if random.random() < 0.5: - features.append(self.get_weighted_choice(nsfw["pussyForeplay"], features)) - possible_actions += nsfw["action"] + nsfw["analForeplay"] + nsfw["pussyForeplay"] - if random.random() < 0.5: - possible_actions += nsfw["footForeplay"] - features.append(self.get_weighted_choice(possible_actions, features)) - # 睡眠 - if any('sleeping' in feature for feature in features) \ - or any('zzz' in feature for feature in features) \ - or any('closed eyes' in feature for feature in features): - features = [feature for feature in features if not any(color[0] == feature for color in eyeColors)] - # 衣物 - num_clothing_accessories = 0 - if num_characters == 1: - num_clothing_accessories = self.get_weighted_choice([[0, 10], [1, 30], [2, 15], [3, 5]], features) - elif num_characters == 2: - num_clothing_accessories = self.get_weighted_choice([[0, 20], [1, 40], [2, 10]], features) - else: - num_clothing_accessories = self.get_weighted_choice([[0, 30], [1, 30]], features) - for _ in range(num_clothing_accessories): - features.append( - self.get_weighted_choice(clothesAccessories + (nsfw["nudeExtra"] if nsfw_enabled else []), features)) - if has_unique_feature: - features = [feature for feature in features if 'legwear' not in feature] - return features + @staticmethod + def get_holiday_themed_tags() -> str: + return get_holiday_themed_tags() - def generate(self, - *, - enable_moods: bool = True, - enable_character: bool = False, - enable_identity: bool = True, - ): + @staticmethod + def generate_character( + tags: List[str], + gender: Literal['m', 'f', 'o'], + additional_tags: str = None, + character_limit: int = 1 + ) -> str: """ - Generate a random prompt - :param enable_moods: enable moods - :param enable_character: enable character - :param enable_identity: enable identity - :return: + Generate a character based on the given tags + :param tags: given tags + :param gender: the gender of the character + :param additional_tags: nothing + :param character_limit: num of characters + :return: random character prompt """ - return self.random_prompt( - enable_moods=enable_moods, - enable_character=enable_character, - enable_identity=enable_identity + return generate_appearance( + tags=Conditions(tags=tags), + gender=gender, + additional_tags=additional_tags, + character_limit=character_limit ) - def random_prompt(self, *, - man_w: int = 30, - woman_w: int = 60, - other_w: int = 10, - enable_moods: bool = True, - enable_character: bool = True, - enable_identity: bool = False, - must_appear=None, - ): - if must_appear is None: - must_appear = [] - tags = [] - # 必须出现的标签 - tags.extend(must_appear) - if self.nsfw_enabled: - tags.append('nsfw') - if random.random() < 0.1: - tags.append('explicit') - tags.append('lewd') - irs = self.get_weighted_choice([[1, 70], [2, 20], [3, 7], [0, 5]], tags) - if self.nsfw_enabled: - irs = self.get_weighted_choice([[1, 40], [2, 20], [3, 7]], tags) - if irs == 0: - tags.append('no humans') - if random.random() < 0.3: - tags.append(self.get_weighted_choice(artStyle, tags)) - tags.append(self.get_weighted_choice(backgroundTheme, tags)) - num_objects = self.get_weighted_choice([[2, 15], [3, 50], [4, 15], [5, 5]], tags) - for _ in range(num_objects): - tags.append(self.get_weighted_choice(backgroundObjects, tags)) - num_accessories = self.get_weighted_choice([[0, 15], [1, 10], [2, 20], [3, 20], [4, 20], [5, 15]], tags) - if (num_accessories - irs) < 0: - num_accessories = 0 - for _ in range(num_accessories): - tags.append(self.get_weighted_choice(accessories, tags)) - return ', '.join(tags) - if random.random() < 0.3: - tags.append(self.get_weighted_choice(artStyle, tags)) - c_count = 0 - d_count = 0 - u_count = 0 - for _ in range(irs): - random_gender = self.get_weighted_choice([['m', man_w], ['f', woman_w], ['o', other_w]], tags) - if random_gender == 'm': - d_count += 1 - elif random_gender == 'f': - c_count += 1 - elif random_gender == 'o': - u_count += 1 - if c_count == 1: - tags.insert(0, '1girl') - elif c_count == 2: - tags.insert(0, '2girls') - elif c_count == 3: - tags.insert(0, '3girls') - if d_count == 1: - tags.insert(0, '1boy') - elif d_count == 2: - tags.insert(0, '2boys') - elif d_count == 3: - tags.insert(0, '3boys') - if u_count == 1: - tags.insert(0, '1other') - elif u_count == 2: - tags.insert(0, '2others') - elif u_count == 3: - tags.insert(0, '3others') - if self.nsfw_enabled: - g_count = c_count + u_count - if (c_count >= 2 and d_count == 0) and random.random() < 0.7: - # 2girls - tags.append(self.get_weighted_choice(nsfw["yu"], tags)) - if g_count == 0 and d_count >= 2 and c_count == 0: - tags.append(nsfw["ya"]) - if d_count > 0: - if c_count > 0: - if random.random() < 0.3: - tags.append(self.get_weighted_choice(nsfw["penis"], tags)) - else: - if random.random() < 0.3: - tags.append(self.get_weighted_choice(nsfw["penis"], tags)) - if d_count > 0 and g_count > 0: - if random.random() < 0.7: - tags.append(self.get_weighted_choice(nsfw["analSex"], tags)) - if g_count > 0: - features = [] - if random.random() < 0.2: - features = self.character_features(nsfw['fu'], None, True, irs) - if random.random() < 0.3: - tags.append(self.get_weighted_choice(nsfw["sex"], tags)) - if random.random() < 0.5: - tags.append(self.get_weighted_choice(nsfw["pussy"], tags)) - if random.random() < 0.3: - tags.append(self.get_weighted_choice(nsfw["sexMod"], tags)) - if random.random() < 0.5: - tags.append(self.get_weighted_choice(nsfw["sexActionMode"], tags)) - if random.random() < 0.1: - tags.append(self.get_weighted_choice(nsfw["bdsm"], tags)) - if random.random() < 0.2: - tags.append(self.get_weighted_choice(nsfw["sexAccessories"], tags)) - tags.extend(features) - if random.random() < 0.4 and enable_moods: - # 心情 - tags.append("[" + self.get_weighted_choice(rankMoods, tags) + "]") - if random.random() < 0.4 and enable_identity: - # 身份 - tags.append("[" + self.get_weighted_choice(rankIdentity, tags) + "]") - if random.random() < 0.2 and enable_character: - # 角色 - tags.append("[" + self.get_weighted_choice(rankCharacter, tags) + "]") - if random.random() < 0.1: - bg_color = self.get_weighted_choice(backgroundColor, tags) - tags.append(bg_color) - if bg_color == 'scenery' and random.random() < 0.5: - num_objects = random.randint(1, 3) - for _ in range(num_objects): - tags.append(self.get_weighted_choice(backgroundObjects, tags)) - if random.random() < 0.1: - tags.append(self.get_weighted_choice(cameraPerspective, tags)) - if random.random() < 0.5: - tags.append(self.get_weighted_choice(cameraAngle, tags)) - for _ in range(c_count): - if random.random() < 0.2: - tags.append(self.get_weighted_choice(nsfw["fu"], tags)) - tags.extend(self.character_features('f', cameraAngle, self.nsfw_enabled, irs)) - for _ in range(d_count): - tags.extend(self.character_features('m', cameraAngle, self.nsfw_enabled, irs)) - for _ in range(u_count): - tags.extend(self.character_features('o', cameraAngle, self.nsfw_enabled, irs)) - if random.random() < 0.2: - num_accessories = random.randint(1, 4) - if irs == 2: - num_accessories = random.randint(1, 3) - for _ in range(num_accessories): - tags.append(self.get_weighted_choice(accessories, tags)) - if random.random() < 0.25: - num_effects = random.randint(1, 3) - for _ in range(num_effects): - tags.append(self.get_weighted_choice(effects, tags)) - if random.random() < 0.1: - tags.append(self.get_weighted_choice(years, tags)) - if random.random() < 0.1: - tags.append(self.get_weighted_choice(cameraFocus, tags)) - uni_tag = {} - for tag in tags: - # 判断是否为多个空格 - if tag.isspace(): - continue - uni_tag[tag] = 1 - unique_tags = list(uni_tag.keys()) - tags = [tag if random.random() >= 0.02 else '{' + tag + '}' for tag in unique_tags] - return ', '.join(tags) + @staticmethod + def generate_character_traits( + gender: Literal['m', 'f', 'o'], + portrait_type: Literal[ + "half-length portrait", + "three-quarter length portrait", + "full-length portrait", + ], + level: int + ) -> tuple: + """ + Generate character traits + :param gender: one of 'm', 'f', 'o' + :param portrait_type: one of "half-length portrait", "three-quarter length portrait", "full-length portrait" + :param level: level of generate depth + :return: tags(generated tags), flags(removed categories) + """ + return generate_character_traits( + gender=gender, + portrait_type=portrait_type, + level=level + ) if __name__ == '__main__': - random_prompt_generator = RandomPromptGenerator(nsfw_enabled=True) - print(random_prompt_generator.generate()) - print(random_prompt_generator.get_weighted_choice([[1, 35], [2, 20], [3, 7]], [])) - print(random_prompt_generator.get_weighted_choice([['m', 30], ['f', 50], ['o', 10]], [])) - print(random_prompt_generator.get_weighted_choice([ - [ - "dsfs", - 5 - ], - [ - "sdfsd", - 5 - ] - ], - [] - )) + gen = RandomPromptGenerator() + for i in range(1): + s = RandomPromptGenerator() + print(s.generate_common_tags(nsfw=False)) + print(s.generate_scene_tags()) + print(s.generate_scene_composition()) + print(s.get_holiday_themed_tags()) + print(s.generate_character( + tags=["vampire", "werewolf"], + gender="f", + additional_tags="", + character_limit=1, + )) + print(s.generate_character_traits( + gender="f", + portrait_type="half-length portrait", + level=1 + )) diff --git a/src/novelai_python/tool/random_prompt/generate_scene_composition.py b/src/novelai_python/tool/random_prompt/generate_scene_composition.py index 01ee9be..10e116f 100644 --- a/src/novelai_python/tool/random_prompt/generate_scene_composition.py +++ b/src/novelai_python/tool/random_prompt/generate_scene_composition.py @@ -1,5 +1,5 @@ import random -from typing import List, Callable +from typing import List from pydantic import dataclasses @@ -2547,7 +2547,7 @@ class Conditions: tags: List[str] - def add(self, v: str): + def add(self, v:str): if v not in self.tags: self.tags.append(v) @@ -2570,13 +2570,11 @@ def random_range(a, b): def select_weighted_option( options: WeightedOptions | WeightedSimpleOptions, conditions: Conditions, - callback: Callable[[List[str]], None] ) -> str | int: """ 选择一个加权选项 :param options: 权重 :param conditions: 条件 - :param callback: 回调 :return: 选项 """ # 如果 conditions 的元素存在于最后两个数组中,则不会被选中 @@ -2625,7 +2623,8 @@ def get_weight(item: str | int) -> int: required = [] if len(option) >= 4: required = option[3] - callback(required) + for req in required: + conditions.add(req) return option[0] return "" @@ -2642,53 +2641,46 @@ def generate_appearance(tags: Conditions, gender: str, additional_tags: str, cha selected_attributes = [] uni_tags = tags.copy() - def append_tags(required: List[str]): - for tag in required: - uni_tags.add(tag) - - def weighted_op(options: WeightedOptions | WeightedSimpleOptions, conditions: Conditions): - return select_weighted_option(options, conditions, append_tags) - if random.random() < 0.1: - selected_attributes.append(weighted_op(animalCharacteristicsL, uni_tags)) + selected_attributes.append(select_weighted_option(animalCharacteristicsL, uni_tags)) if random.random() < 0.4: - selected_attributes.append(weighted_op(skinTypesL, uni_tags)) + selected_attributes.append(select_weighted_option(skinTypesL, uni_tags)) if random.random() < 0.05: - selected_attributes.append(weighted_op(eyeCharacteristicsL, uni_tags)) + selected_attributes.append(select_weighted_option(eyeCharacteristicsL, uni_tags)) if "no eyes" not in uni_tags: if random.random() < 0.2: - selected_attributes.append(weighted_op(eyeExpressionsL, uni_tags)) + selected_attributes.append(select_weighted_option(eyeExpressionsL, uni_tags)) if random.random() < 0.8 and "nocoloreyes" not in uni_tags: - selected_attributes.append(weighted_op(eyeColorsL, uni_tags)) + selected_attributes.append(select_weighted_option(eyeColorsL, uni_tags)) # Hair Length if random.random() < 0.8: - selected_attributes.append(weighted_op(hairLengthsL, uni_tags)) + selected_attributes.append(select_weighted_option(hairLengthsL, uni_tags)) # Hair Style if random.random() < 0.7: - selected_attributes.append(weighted_op(braidedHairstylesL, uni_tags)) + selected_attributes.append(select_weighted_option(braidedHairstylesL, uni_tags)) # Hair Color if random.random() < 0.7: - selected_attributes.append(weighted_op(hairColorsL, uni_tags)) + selected_attributes.append(select_weighted_option(hairColorsL, uni_tags)) # Hair Style and Pattern if random.random() < 0.1: - selected_attributes.append(weighted_op(hairStylesAndPatternsL, uni_tags)) - selected_attributes.append(weighted_op(hairColorsL, uni_tags)) + selected_attributes.append(select_weighted_option(hairStylesAndPatternsL, uni_tags)) + selected_attributes.append(select_weighted_option(hairColorsL, uni_tags)) # Hair Accessories if random.random() < 0.3: - selected_attributes.append(weighted_op(uniqueHairstylesL, uni_tags)) + selected_attributes.append(select_weighted_option(uniqueHairstylesL, uni_tags)) # Hair Accessories if random.random() < 0.4: - selected_attributes.append(weighted_op(bangsStylesL, uni_tags)) + selected_attributes.append(select_weighted_option(bangsStylesL, uni_tags)) if gender.startswith("f") and random.random() < 0.8: - selected_attributes.append(weighted_op(breastSizesL, uni_tags)) + selected_attributes.append(select_weighted_option(breastSizesL, uni_tags)) if character_limit == 1: - body_feature_num = weighted_op( + body_feature_num = select_weighted_option( [ [0, 10], [1, 30], @@ -2698,7 +2690,7 @@ def weighted_op(options: WeightedOptions | WeightedSimpleOptions, conditions: Co uni_tags ) elif character_limit == 2: - body_feature_num = weighted_op( + body_feature_num = select_weighted_option( [ [0, 20], [1, 40], @@ -2707,7 +2699,7 @@ def weighted_op(options: WeightedOptions | WeightedSimpleOptions, conditions: Co uni_tags ) else: - body_feature_num = weighted_op( + body_feature_num = select_weighted_option( [ [0, 30], [1, 30], @@ -2716,16 +2708,16 @@ def weighted_op(options: WeightedOptions | WeightedSimpleOptions, conditions: Co ) for _ in range(body_feature_num): - selected_attributes.append(weighted_op(bodyFeaturesL, uni_tags)) + selected_attributes.append(select_weighted_option(bodyFeaturesL, uni_tags)) if random.random() < 0.2: - selected_attributes.append(weighted_op(hatsAndHeadwearL, uni_tags)) + selected_attributes.append(select_weighted_option(hatsAndHeadwearL, uni_tags)) if random.random() < 0.2: - selected_attributes.append(weighted_op(hatDecorationsL, uni_tags)) + selected_attributes.append(select_weighted_option(hatDecorationsL, uni_tags)) elif random.random() < 0.3: - selected_attributes.append(weighted_op(hairAccessoriesL, uni_tags)) + selected_attributes.append(select_weighted_option(hairAccessoriesL, uni_tags)) - outfit_type = weighted_op( + outfit_type = select_weighted_option( [ ["uniform", 25], ["swimsuit", 5], @@ -2736,55 +2728,55 @@ def weighted_op(options: WeightedOptions | WeightedSimpleOptions, conditions: Co ) if outfit_type == "uniform": - selected_attributes.append(weighted_op(armorsAndUniformsL, uni_tags)) + selected_attributes.append(select_weighted_option(armorsAndUniformsL, uni_tags)) elif outfit_type == "swimsuit": - selected_attributes.append(weighted_op(swimwearL, uni_tags)) + selected_attributes.append(select_weighted_option(swimwearL, uni_tags)) elif outfit_type == "bodysuit": - selected_attributes.append(weighted_op(zipperedOutfitsL, uni_tags)) + selected_attributes.append(select_weighted_option(zipperedOutfitsL, uni_tags)) elif outfit_type == "normal clothes": # 生产袜子 if gender.startswith("f") and random.random() < 0.5: - selected_attributes.append(weighted_op(socksAndStockingsL, uni_tags)) + selected_attributes.append(select_weighted_option(socksAndStockingsL, uni_tags)) if random.random() < 0.2: - selected_attributes.append(weighted_op(legwearStylesL, uni_tags)) + selected_attributes.append(select_weighted_option(legwearStylesL, uni_tags)) # 生产套装 if gender.startswith("f") and random.random() < 0.2: use_color = random.random() < 0.5 - color = weighted_op(colorsL, uni_tags) - attire = weighted_op(dressesAndAttireL, uni_tags) + color = select_weighted_option(colorsL, uni_tags) + attire = select_weighted_option(dressesAndAttireL, uni_tags) selected_attributes.append(f"{color} {attire}" if use_color and attire else attire) else: # 生产上衣 if random.random() < 0.85: use_color = random.random() < 0.5 - color = weighted_op(colorsL, uni_tags) - top = weighted_op(topsAndShirtsL, uni_tags) + color = select_weighted_option(colorsL, uni_tags) + top = select_weighted_option(topsAndShirtsL, uni_tags) selected_attributes.append(f"{color} {top}" if use_color and top else top) # 生产下衣 if "legs" in uni_tags: if random.random() < 0.85: use_color = random.random() < 0.5 - color = weighted_op(colorsL, uni_tags) - bottom = weighted_op(pantsAndBottomsL, uni_tags) + color = select_weighted_option(colorsL, uni_tags) + bottom = select_weighted_option(pantsAndBottomsL, uni_tags) selected_attributes.append(f"{color} {bottom}" if use_color and bottom else bottom) # 生产鞋子 if "feet" in uni_tags and random.random() < 0.6: use_color = random.random() < 0.5 - color = weighted_op(colorsL, uni_tags) - footwear = weighted_op(bootsAndFootwearL, uni_tags) + color = select_weighted_option(colorsL, uni_tags) + footwear = select_weighted_option(bootsAndFootwearL, uni_tags) selected_attributes.append(f"{color} {footwear}" if use_color and footwear else footwear) # 生产面部 if random.random() < 0.6: - selected_attributes.append(weighted_op(facialExpressionsL, uni_tags)) + selected_attributes.append(select_weighted_option(facialExpressionsL, uni_tags)) # 生产动作 if random.random() < 0.4: - selected_attributes.append(weighted_op(bodyPosesAndActionsL, uni_tags)) + selected_attributes.append(select_weighted_option(bodyPosesAndActionsL, uni_tags)) # 根据人物数量生产配饰 if character_limit == 1: - accessory_iterations = weighted_op( + accessory_iterations = select_weighted_option( [ [0, 10], [1, 30], @@ -2794,7 +2786,7 @@ def weighted_op(options: WeightedOptions | WeightedSimpleOptions, conditions: Co uni_tags ) elif character_limit == 2: - accessory_iterations = weighted_op( + accessory_iterations = select_weighted_option( [ [0, 20], [1, 40], @@ -2803,7 +2795,7 @@ def weighted_op(options: WeightedOptions | WeightedSimpleOptions, conditions: Co uni_tags ) else: - accessory_iterations = weighted_op( + accessory_iterations = select_weighted_option( [ [0, 30], [1, 30], @@ -2812,7 +2804,7 @@ def weighted_op(options: WeightedOptions | WeightedSimpleOptions, conditions: Co ) for _ in range(accessory_iterations): - selected_attributes.append(weighted_op(accessoriesAndOuterwearL, uni_tags)) + selected_attributes.append(select_weighted_option(accessoriesAndOuterwearL, uni_tags)) return [attribute for attribute in selected_attributes if attribute != ""] @@ -2822,14 +2814,7 @@ def generate_scene_composition(): condition_set = Conditions(tags=[]) character_details = [] - def append_tags(required: List[str]): - for tag in required: - condition_set.add(tag) - - def weighted_op(options: WeightedOptions | WeightedSimpleOptions, conditions: Conditions): - return select_weighted_option(options, conditions, append_tags) - - character_count = weighted_op( + character_count = select_weighted_option( [ [1, 70], [2, 20], @@ -2842,10 +2827,10 @@ def weighted_op(options: WeightedOptions | WeightedSimpleOptions, conditions: Co if character_count == 0: scene_tags.append("no humans") if random.random() < 0.5: - scene_tags.append(weighted_op(artStylesL, condition_set)) - scene_tags.append(weighted_op(sceneTypesL, condition_set)) + scene_tags.append(select_weighted_option(artStylesL, condition_set)) + scene_tags.append(select_weighted_option(sceneTypesL, condition_set)) - scene_element_count = weighted_op( + scene_element_count = select_weighted_option( [ [2, 15], [3, 50], @@ -2856,9 +2841,9 @@ def weighted_op(options: WeightedOptions | WeightedSimpleOptions, conditions: Co ) for _ in range(scene_element_count): - scene_tags.append(weighted_op(sceneElementsL, condition_set)) + scene_tags.append(select_weighted_option(sceneElementsL, condition_set)) - object_count = weighted_op( + object_count = select_weighted_option( [ [0, 15], [1, 10], @@ -2873,19 +2858,19 @@ def weighted_op(options: WeightedOptions | WeightedSimpleOptions, conditions: Co object_count = max(0, object_count) for _ in range(object_count): - scene_tags.append(weighted_op(objectsAndStuffedAnimalsL, condition_set)) + scene_tags.append(select_weighted_option(objectsAndStuffedAnimalsL, condition_set)) return [", ".join(filter(None, scene_tags))] if random.random() < 0.5: - scene_tags.append(weighted_op(artStylesL, condition_set)) + scene_tags.append(select_weighted_option(artStylesL, condition_set)) male_count = 0 female_count = 0 other_count = 0 for _ in range(character_count): - gender = weighted_op( + gender = select_weighted_option( [ ["m", 30], ["f", 60], @@ -2908,20 +2893,20 @@ def weighted_op(options: WeightedOptions | WeightedSimpleOptions, conditions: Co scene_tags.insert(0, f"{other_count}other{'s' if other_count > 1 else ''}") if random.random() < 0.8: - background_type = weighted_op(backgroundTypesL, condition_set) + background_type = select_weighted_option(backgroundTypesL, condition_set) scene_tags.append(background_type) if background_type == "scenery" and random.random() < 0.5: scenery_elements_count = random.randint(1, 3) for _ in range(scenery_elements_count): # Add scenery elements - scene_tags.append(weighted_op(sceneElementsL, condition_set)) + scene_tags.append(select_weighted_option(sceneElementsL, condition_set)) # 添加镜头角度 if random.random() < 0.3: - scene_tags.append(weighted_op(cameraAnglesL, condition_set)) + scene_tags.append(select_weighted_option(cameraAnglesL, condition_set)) # 添加镜头构图 - framing_type = weighted_op(framingTypesL, condition_set) if random.random() < 0.7 else None + framing_type = select_weighted_option(framingTypesL, condition_set) if random.random() < 0.7 else None if framing_type: scene_tags.append(framing_type) @@ -2946,24 +2931,24 @@ def weighted_op(options: WeightedOptions | WeightedSimpleOptions, conditions: Co if character_count == 2: object_count = random.randint(0, 3) for _ in range(object_count): - scene_tags.append(weighted_op(objectsAndStuffedAnimalsL, condition_set)) + scene_tags.append(select_weighted_option(objectsAndStuffedAnimalsL, condition_set)) # 添加特效 if random.random() < 0.25: effects_count = random.randint(1, 3) for _ in range(effects_count): - scene_tags.append(weighted_op(effectsAndPatternsL, condition_set)) + scene_tags.append(select_weighted_option(effectsAndPatternsL, condition_set)) # 添加年份主题 if random.random() < 0.2: - scene_tags.append(weighted_op(yearlyThemesL, condition_set)) + scene_tags.append(select_weighted_option(yearlyThemesL, condition_set)) # 添加物体焦点 if random.random() < 0.1: - scene_tags.append(weighted_op(subjectFocusL, condition_set)) + scene_tags.append(select_weighted_option(subjectFocusL, condition_set)) # 去重 - scene_tags = list(filter(None, set(scene_tags))) + scene_tags = list({tag: True for tag in scene_tags}.keys()) return [ ", ".join(scene_tags), *[", ".join(details) for details in character_details] diff --git a/src/novelai_python/tool/random_prompt/generate_scene_tags.py b/src/novelai_python/tool/random_prompt/generate_scene_tags.py new file mode 100644 index 0000000..6500e7b --- /dev/null +++ b/src/novelai_python/tool/random_prompt/generate_scene_tags.py @@ -0,0 +1,2276 @@ +import random +from typing import Any, List, Optional + +viewF = [ + ["front view", 6], + ["side view", 6], + ["three-quarter view", 6], + ["high-angle view", 6], + ["bird's-eye view", 2], + ["low-angle view", 6], + ["worm's-eye view", 2], +] +focusF = [ + ["solo focus", 6], + [ + "butt focus", + 6, + ["headshot portrait", "bust portrait", "half-length portrait"], + ], + ["breast focus", 6], + ["belly focus", 6], + ["face focus", 6], +] +backgroundCategoriesF = [ + ["landscape", 6], + ["nature", 6], + ["scenery", 6], + ["cityscape", 6], +] +backgroundStyleF = [ + ["detailed background", 30], + ["detailed background, amazing background", 60], + ["white background", 2], + ["grey background", 6], + ["gradient background", 6], + ["blurred background", 6], + ["blue background", 6], + ["pink background", 6], + ["black background", 6], + ["yellow background", 6], + ["red background", 6], + ["brown background", 6], + ["green background", 6], + ["purple background", 6], + ["rainbow background", 6], + ["pattern background", 6], + ["striped background", 6], + ["textured background", 6], + ["abstract background", 1], + ["spiral background", 6], + ["tan background", 6], + ["geometric background", 6], + ["multicolored background", 6], + ["forest background", 6], + ["city background", 6], + ["simple background", 4], +] +portraitOptionsF = [ + ["headshot portrait", 2], + ["bust portrait", 2], + ["half-length portrait", 8], + ["three-quarter length portrait", 8], + ["full-length portrait", 4], + ["close-up", 1], +] +intermediatePortraitsF = [ + "half-length portrait", + "three-quarter length portrait", + "full-length portrait", +] +random.shuffle(intermediatePortraitsF) +fullLengthOnlyF = ["full-length portrait"] + +artStylesF = [ + ["photorealism", 6], + ["realistic", 6], + ["surreal", 6], + ["abstract", 6], + ["chibi", 6], + ["line art", 6], + ["sketch", 6], + ["toony", 6], + ["graphite (artwork)", 4], + ["watercolor (artwork)", 4], + ["concept art", 6], + ["flat colors", 6], + ["traditional media (artwork)", 6], + ["oekaki", 6], + ["minimalism", 6], + ["simple shading", 6], + ["cel shading", 6], + ["soft shading", 6], + ["cross-hatching", 6], + ["3d (artwork)", 4], + ["lineless", 6], + ["colored pencil (artwork)", 4], + ["crayon (artwork)", 4], + ["painting (artwork)", 4], + ["marker (artwork)", 4], + ["pen (artwork)", 4], + ["kemono", 6], + ["detailed", 6], + ["digital media (artwork)", 6], + ["shaded", 6], +] +animalOptionsF = [ + ["domestic dog", 6], + ["fox", 6], + ["domestic cat", 6], + ["equine", 6], + ["lagomorph", 6], + ["leporid", 6], + ["pantherine", 6], + ["caprine", 6], + ["rodent", 6], + ["bovine", 6], + ["mustelid", 6], + ["ursine", 6], + ["bird", 6], + ["bat", 6], + ["raccoon", 6], + ["cetacean", 6], + ["shark", 6], + ["theropod", 6], + ["lizard", 6], + ["snake", 6], + ["marsupial", 6], + ["proboscidean", 6], + ["primate", 6], + ["hedgehog", 6], + ["sciurid", 6], + ["sus (pig)", 6], + ["hyena", 6], + ["ailurid", 6], + ["crocodilian", 6], + ["macropod", 6], + ["insect", 6], + ["giraffid", 6], + ["corvid", 6], + ["turtle", 6], + ["passerine", 6], + ["owl", 6], + ["tanuki", 6], + ["anseriform", 6], + ["bee", 6], + ["mollusk", 6], + ["arachnid", 6], + ["fish", 6], + ["naga", 6], + ["frog", 6], + ["western dragon", 6], + ["unicorn", 6], + ["eastern dragon", 6], + ["gryphon", 6], + ["pegasus", 6], + ["amphibian", 6], + ["wyvern", 2], + ["hippogriff", 4], + ["hydra, multi head", 2], + ["hellhound", 6], + ["chimera", 6], + ["phoenix, bird", 2], + ["crustacean", 2], + ["wolf", 6], + ["camelid", 2], + ["cephalopod", 2], + ["gastropod", 2], + ["pinniped", 2], + ["beaver", 2], + ["capybara", 2], + ["rat", 2], + ["squirrel", 2], + ["hamster", 2], + ["chipmunk", 2], + ["reptile", 6], + ["dinosaur", 2], + ["chameleon", 2], + ["gecko", 2], + ["pterosaur", 2], + ["bear", 6], + ["giant panda", 2], + ["canine", 6], + ["feline", 6], + ["moth", 6], + ["ambiguous species", 4], +] +characterTypesF = [ + ["anthro", 24], + ["humanoid", 4], + ["feral", 12], + ["animal humanoid", 6], + ["were", 6], + ["demon", 2], + ["taur", 4], + ["robot", 2], + ["alien", 2], + ["monster", 2], + ["undead", 2], + ["elemental creature", 2], + ["angel", 2], + ["mythological creature", 6], + ["spirit", 2], + ["diety", 2], + ["waddling head", 1], + ["draconopede", 1], +] +mythicalRacesF = [ + ["elf", 6], + ["demon", 6], + ["angel", 6], + ["orc", 6], + ["goblin", 6], + ["ogre", 6], + ["troll (mythology)", 6], + ["halfling", 6], + ["imp", 6], + ["monstrous humanoid", 6], + ["alien", 6], + ["flora fauna", 6], + ["undead", 6], + ["elemental creature", 6], + ["skeleton", 6], + ["human", 6], + ["mineral fauna", 6], + ["food creature", 6], + ["goo creature", 6], + ["robot", 6], + ["monster", 6], + ["ghost", 6], + ["human", 6], + ["merfolk", 6], + ["harpy", 6], + ["lamia", 6], + ["oni", 6], + ["spirit", 6], +] +hybridSpeciesF = [ + ["centaur", 12], + ["kobold", 12], + ["sergal", 6], + ["protogen", 6], + ["animate inanimate", 1], + ["avali", 4], + ["minotaur", 6], +] +bodyColorsF = [ + ["dark body", 6], + ["light body", 6], + ["black body", 6], + ["brown body", 6], + ["gold body", 6], + ["green body", 6], + ["grey body", 6], + ["orange body", 6], + ["pink body", 6], + ["purple body", 6], + ["red body", 6], + ["silver body", 6], + ["tan body", 6], + ["teal body", 6], + ["white body", 6], + ["yellow body", 6], +] +eyeColorsF = [ + ["amber eyes", 6], + ["black eyes", 6], + ["blue eyes", 6], + ["brown eyes", 6], + ["green eyes", 6], + ["grey eyes", 6], + ["orange eyes", 6], + ["pink eyes", 6], + ["purple eyes", 6], + ["red eyes", 6], + ["silver eyes", 6], + ["teal eyes", 6], + ["white eyes", 6], + ["yellow eyes", 6], +] +scleraColorsF = [ + ["amber sclera", 6], + ["black sclera", 6], + ["blue sclera", 6], + ["brown sclera", 6], + ["cyan sclera", 6], + ["green sclera", 6], + ["grey sclera", 6], + ["orange sclera", 6], + ["pink sclera", 6], + ["purple sclera", 6], + ["red sclera", 6], + ["yellow sclera", 6], +] +eyeFeaturesF = [ + ["<3 eyes", 6], + ["beady eyes", 6], + ["big eyes", 6], + ["cute eyes", 6], + ["empty eyes", 6], + ["glistening eyes", 6], + ["glowing eyes", 6], + ["lidded eyes", 6], + ["ringed eyes", 4], + ["simple eyes", 6], + ["dot eyes", 6], + ["small eyes", 6], + ["spiral eyes", 4], + ["star eyes", 6], + ["vertical bar eyes", 6], + ["slit pupils", 3], +] +hairColorsF = [ + ["auburn hair", 6], + ["black hair", 6], + ["blonde hair", 6], + ["blue hair", 6], + ["brown hair", 6], + ["cream hair", 6], + ["green hair", 6], + ["grey hair", 6], + ["orange hair", 6], + ["pink hair", 6], + ["purple hair", 6], + ["red hair", 6], + ["silver hair", 6], + ["tan hair", 6], + ["teal hair", 6], + ["white hair", 6], +] +hairEffectsF = [ + ["multicolored hair", 6], + ["gradient hair", 6], + ["hair highlights", 6], + ["spotted hair", 6], + ["striped hair", 6], +] +hairLengthsF = [ + ["long hair", 24], + ["medium hair", 24], + ["short hair", 24], + ["bald", 1], +] +hairStylesF = [ + ["afro", 6], + ["bob cut", 6], + ["bowl cut", 6], + ["braided hair", 6], + ["dreadlocks", 6], + ["drill curls", 6], + ["fauxhawk", 6], + ["hair bun", 6], + ["hair buns", 6], + ["mohawk (hairstyle)", 6], + ["pigtails", 6], + ["pixie cut", 6], + ["ponytail", 6], + ["undercut", 6], + ["twintails (hairstyle)", 6], + ["mane hair", 2], +] +hairTexturesF = [ + ["big hair", 6], + ["curled hair", 6], + ["fluffy hair", 6], + ["glistening hair", 6], + ["glowing hair", 2], + ["messy hair", 6], + ["spiky hair", 6], + ["tentacle hair", 2], + ["liquid hair", 1], + ["goo hair", 1], + ["plant hair", 1], + ["flaming hair", 2], + ["wavy hair", 6], +] +hairSpecificsF = [ + ["ahoge", 6], + ["blunt bangs", 6], + ["crossed bangs", 6], + ["hair over eye", 6], + ["hair over eyes", 6], +] +chestSizesF = [ + ["flat chested", 3], + ["small breasts", 6], + ["medium breasts", 6], + ["big breasts", 3], + ["huge breasts", 2], +] +bodyFeaturesF = [ + ["collarbone", 6], + ["small waist", 6], + ["wide hips", 6], + ["thigh gap", 2], + ["3 eyes", 2], + ["1 eye", 3], + ["multi eye", 2], + ["multi arm", 2], + ["multi horn", 2], + ["multi tail", 2], + ["multi wing", 2], + ["thick eyebrows", 6], + ["thick eyelashes", 6], + ["teeth", 6], + ["overweight", 6], + ["stocky", 6], + ["slightly chubby", 6], + ["muscular", 6], + ["slim", 6], + ["athletic", 6], + ["short", 6], + ["tall", 6], + ["musclegut", 6], + ["big muscles", 6], + ["curvy figure", 6], + ["hourglass figure", 6], + ["pear-shaped figure", 6], + ["voluptuous", 6], + ["short stack", 6], + ["teapot (body type)", 6], + ["girly", 6], + ["manly", 6], + ["mature", 6], + ["young", 6], + ["old", 6], + ["small butt", 6], + ["big butt", 6], + ["huge butt", 2], + ["beauty mark", 6], + ["freckles", 6], + ["abs", 6], + ["biceps", 6], + ["skinny", 6], + ["thick arms", 6], + ["thick lips", 1], + ["lips", 1], + ["body hair", 6], + ["glistening body", 6], + ["glowing body", 6], + ["metallic body", 6], + ["mottled body", 6], + ["spotted body", 6], + ["striped body", 6], + ["translucent body", 6], + ["markings", 6], + ["feathers", 6], + ["fur", 6], + ["eye scar", 2], + ["scar", 2], + ["scales", 6], + ["long eyelashes", 6], + ["tail", 6], + ["bioluminescence", 6], + ["long ears", 2], + ["big ears", 2], + ["pivoted ears", 2], + ["dipstick ears", 2], + ["floppy ears", 2], +] +hatsF = [ + ["hat", 36], + ["bowler hat", 6], + ["fedora", 6], + ["top hat", 6], + ["aviator cap", 6], + ["biker cap", 6], + ["chef hat", 6], + ["cowboy hat", 6], + ["hard hat", 6], + ["nurse hat", 6], + ["police hat", 6], + ["santa hat", 6], + ["staw hat", 6], + ["ushanka", 6], + ["witch hat", 6], + ["wizard hat", 6], + ["beanie", 6], + ["beret", 6], + ["baseball cap", 6], + ["dunce cap", 6], + ["flat cap", 6], + ["jester cap", 6], + ["party hat", 6], + ["sun hat", 6], + ["helmet", 8], + ["cabbie hat", 6], + ["circlet", 6], + ["crown", 6], + ["diadem", 6], + ["tiara", 6], + ["bandana", 6], + ["bonnet", 6], +] +hairAccessoriesF = [ + ["hair ribbon", 6], + ["hair bow", 6], + ["hairband", 6], + ["headdress", 6], + ["veil", 6], + ["hooded cloak", 6], +] +dressesF = [ + ["dress", 24], + ["short dress", 18], + ["long dress", 18], + ["christmas dress", 6], + ["chinese dress", 6], + ["cocktail dress", 6], + ["evening gown", 6], + ["nurse dress", 6], + ["sundress", 6], + ["wedding dress", 6], + ["backless dress", 6], + ["frilly dress", 6], + ["slit dress", 6], + ["strapless dress", 6], + ["turtleneck dress", 6], + ["pattern dress", 6], + ["tight dress", 6], + ["halter dress", 6], + ["tube dress", 6], + ["collared dress", 6], + ["sailor dress", 6], + ["gown", 6], + ["dirndl", 6], + ["sweater dress", 6], + ["fur-trimmed dress", 6], + ["latex dress", 6], + ["layered dress", 6], + ["ribbed dress", 6], + ["ribbon-trimmed dress", 6], + ["see-through dress", 6], + ["sleeveless dress", 6], + ["fundoshi", 6], + ["hakama", 6], + ["kimono", 6], + ["yukata", 6], + ["furisode", 6], +] +legWearF = [ + ["leggings", 6], + ["leg warmers", 6], + ["pantyhose", 6], + ["stockings", 6], + ["tights", 6], + ["thigh highs", 6], + ["socks", 6], + ["loose socks", 6], + ["knee socks", 6], + ["thigh socks", 6], + ["ankle socks", 6], +] +topsF = [ + ["blouse", 6], + ["frilled shirt", 6], + ["sleeveless shirt", 6], + ["bustier", 6], + ["crop top", 6], + ["camisole", 6], + ["babydoll", 6], + ["chemise", 6], + ["nightgown", 6], + ["cardigan", 6], + ["cardigan", 6], + ["cardigan vest", 6], + ["coat", 6], + ["fur coat", 6], + ["fur-trimmed coat", 6], + ["long coat", 6], + ["overcoat", 6], + ["raincoat", 6], + ["trenchcoat", 6], + ["winter coat", 6], + ["compression shirt", 6], + ["hoodie", 6], + ["criss-cross halter", 6], + ["jacket", 6], + ["blazer", 6], + ["cropped jacket", 6], + ["letterman jacket", 6], + ["suit jacket", 6], + ["leather jacket", 6], + ["poncho", 6], + ["shirt", 6], + ["collared shirt", 6], + ["dress shirt", 6], + ["off-shoulder shirt", 6], + ["sleeveless shirt", 6], + ["striped shirt", 6], + ["t-shirt", 6], + ["surcoat", 6], + ["sweater", 6], + ["turtleneck", 6], + ["sleeveless turtleneck", 6], + ["ribbed sweater", 6], + ["aran sweater", 6], + ["argyle sweater", 6], + ["virgin killer sweater", 6], + ["tabard", 6], + ["tailcoat", 6], + ["tank top", 6], + ["tube top", 6], + ["bandeau", 6], + ["underbust", 6], + ["vest", 6], + ["sweater vest", 6], + ["waistcoat", 6], + ["chest wraps", 6], + ["front-tie top", 6], + ["jersey", 6], + ["baggy shirt", 6], + ["polo shirt", 6], + ["undershirt", 6], + ["keyhole turtleneck", 6], +] +pantsAndShortsF = [ + ["bloomers", 6], + ["buruma", 6], + ["chaps", 6], + ["kilt", 6], + ["pants", 6], + ["tight pants", 6], + ["baggy pants", 6], + ["bell-bottoms", 6], + ["capri pants", 6], + ["jeans", 6], + ["rolled up pants", 6], + ["pelvic curtain", 6], + ["petticoat", 6], + ["shorts", 6], + ["denim shorts", 6], + ["dolphin shorts", 6], + ["gym shorts", 6], + ["micro shorts", 6], + ["short shorts", 6], + ["suspender shorts", 6], + ["skirt", 6], + ["high-waist skirt", 6], + ["long skirt", 6], + ["microskirt", 6], + ["miniskirt", 6], + ["overall skirt", 6], + ["plaid skirt", 6], + ["pleated skirt", 6], + ["suspender skirt", 6], + ["sweatpants", 6], + ["camo pants", 6], + ["cargo pants", 6], + ["harem pants", 6], + ["leather pants", 6], + ["sagging pants", 6], + ["booty shorts", 6], + ["cargo shorts", 6], + ["daisy dukes", 6], + ["hot pants", 6], + ["short shorts", 6], + ["track shorts", 6], + ["grass skirt", 6], +] +footwearF = [ + ["boots", 6], + ["ankle boots", 6], + ["cowboy boots", 6], + ["knee boots", 6], + ["high heel boots", 6], + ["lace-up boots", 6], + ["rubber boots", 6], + ["thigh boots", 6], + ["dress shoes", 6], + ["flats", 6], + ["high heels", 6], + ["loafers", 6], + ["mary janes", 6], + ["platform footwear", 6], + ["pointy footwear", 6], + ["pumps", 6], + ["sandals", 6], + ["flip-flops", 6], + ["geta", 6], + ["gladiator sandals", 6], + ["slippers", 6], + ["animal slippers", 6], + ["ballet slippers", 6], + ["crocs", 6], + ["sneakers", 6], + ["high tops", 6], + ["converse", 6], + ["toeless footwear", 6], + ["wedge heels", 6], + ["footwear", 6], +] +specialtyClothingF = [ + ["armor", 6], + ["power armor", 6], + ["armored dress", 6], + ["bikini armor", 6], + ["cassock", 6], + ["cheerleader", 6], + ["ghost costume", 6], + ["business suit", 6], + ["pant suit", 6], + ["skirt suit", 6], + ["black tie (suit)", 6], + ["gym uniform", 6], + ["harem outfit", 6], + ["hazmat suit", 6], + ["maid", 6], + ["miko", 6], + ["military uniform", 6], + ["overalls", 6], + ["pajamas", 6], + ["pilot suit", 6], + ["santa costume", 6], + ["school uniform", 6], + ["serafuku", 6], + ["track suit", 6], + ["tutu", 6], + ["waitress", 6], + ["cowboy outfit", 6], + ["magical girl", 6], + ["lab coat", 6], + ["police", 6], + ["race queen", 6], + ["bride", 6], + ["knight", 6], + ["tomboy", 6], + ["soccer uniform", 6], + ["employee uniform", 6], + ["dancer", 6], + ["spacesuit", 6], + ["gyaru", 6], + ["kogal", 6], + ["soldier", 6], + ["pirate", 6], + ["princess", 6], + ["samurai", 6], + ["priest", 6], + ["nun", 6], + ["baseball uniform", 6], + ["basketball uniform", 6], + ["firefighter uniform", 6], +] +bodysuitsAndRobesF = [ + ["bikesuit", 6], + ["racing suit", 6], + ["bodysuit", 6], + ["jumpsuit", 6], + ["leotard", 6], + ["thong leotard", 6], + ["robe", 6], + ["unitard", 6], + ["onesie", 6], + ["coveralls", 6], + ["prison uniform", 6], +] +swimwearF = [ + ["swimwear", 6], + ["swimsuit", 6], + ["one-piece swimsuit", 6], + ["square bikini", 6], + ["school swimsuit", 6], + ["bikini", 6], + ["string bikini", 6], + ["micro bikini", 6], + ["thong bikini", 6], + ["sports bikini", 6], + ["swim briefs", 6], + ["wetsuit", 6], + ["front-tie bikini top", 6], + ["strapless bikini", 6], + ["maid bikini", 6], + ["swim trunks", 6], + ["bikini thong", 6], + ["speedo", 6], +] +clothingItemsF = [ + ["apron", 6], + ["cape", 6], + ["capelet", 6], + ["hood", 6], + ["bodystocking", 6], + ["ascot", 6], + ["bowtie", 6], + ["choker", 6], + ["collar", 6], + ["epaulettes", 6], + ["feather boa", 6], + ["lapels", 6], + ["neckerchief", 6], + ["necklace", 6], + ["necktie", 6], + ["neck ribbon", 6], + ["scarf", 6], + ["shawl", 6], + ["anklet", 6], + ["armband", 6], + ["armlet", 6], + ["bracelet", 6], + ["bangle", 6], + ["spiked bracelet", 6], + ["bridal gauntlets", 6], + ["detached sleeves", 6], + ["arm warmers", 6], + ["gloves", 6], + ["fingerless gloves", 6], + ["elbow gloves", 6], + ["mittens", 6], + ["ring", 6], + ["wide sleeves", 6], + ["wristband", 6], + ["wrist cuffs", 6], + ["ankle cuffs", 6], + ["wrist scrunchie", 6], + ["belly chain", 6], + ["belt", 6], + ["brooch", 6], + ["buttons", 6], + ["corsage", 6], + ["cuff links", 6], + ["sarong", 6], + ["sash", 6], + ["suspenders", 6], + ["tassel", 6], + ["cutout", 6], + ["frills", 6], + ["gold trim", 6], + ["lace trim", 6], + ["see-through", 6], + ["torn clothes", 6], + ["earrings", 6], + ["hoop earrings", 6], + ["stud earrings", 6], + ["glasses", 6], + ["monocle", 6], + ["hair accessory", 12], + ["hairclip", 6], + ["hair scrunchie", 6], + ["mask", 6], + ["surgical mask", 6], + ["rolled up sleeves", 6], + ["short sleeves", 6], + ["long sleeves", 6], + ["long sleeves", 6], + ["sleeves past wrists", 6], + ["puffy sleeves", 6], + ["sleeveless", 6], + ["goggles", 6], + ["sunglasses", 6], + ["ski goggles", 6], + ["ear piercing", 6], + ["eyebrow piercing", 6], + ["lip piercing", 6], + ["nose piercing", 6], + ["tongue piercing", 6], + ["navel piercing", 6], + ["zipper", 6], + ["zettai ryouiki", 6], + ["wristwatch", 6], + ["wet", 6], + ["weapon", 6], + ["wand", 6], + ["waist apron", 6], + ["vambraces", 6], + ["valentine", 6], + ["under boob", 6], + ["umbrella", 6], + ["unbuttoned", 6], + ["tray", 6], + ["tentacles", 6], + ["tattoo", 6], + ["sweat", 6], + ["striped", 6], + ["off shoulder", 6], + ["star print", 6], + ["side boob", 6], + ["side slit", 6], + ["shoulder bag", 6], + ["shirt tucked in", 6], + ["glistening clothing", 6], + ["sharp teeth", 6], + ["sharp fingernails", 6], + ["saliva", 6], + ["pouch", 6], + ["polka dot", 6], + ["pom poms", 6], + ["pockets", 6], + ["skimpy", 6], + ["ribbons", 6], + ["plaid", 6], + ["pendant", 6], + ["pauldrons", 6], + ["partially clothed", 6], + ["neck bell", 6], + ["navel cutout", 6], + ["mustache", 6], + ["wings", 6], + ["low wings", 6], + ["lipstick", 6], + ["leash", 6], + ["lace", 6], + ["knee pads", 6], + ["jewelry", 6], + ["horn", 6], + ["curled horn", 6], + ["midriff", 6], + ["makeup", 6], + ["long fingernails", 6], + ["halo", 6], + ["gauntlets", 6], + ["fur trim (clothing)", 6], + ["fin", 6], + ["fangs", 6], + ["facial hair", 6], + ["eyeshadow", 6], + ["eyepatch", 6], + ["eyeliner", 6], + ["eyelashes", 6], + ["eyebrows", 6], + ["eyewear on head", 6], + ["earmuffs", 6], + ["corset", 6], + ["cleavage cutout", 6], + ["cleavage", 6], + ["claws", 6], + ["breasts apart", 6], + ["breastplate", 6], + ["bracer", 6], + ["blood on clothing", 2], + ["blood on face", 2], + ["blindfold", 6], + ["bare shoulders", 6], + ["bare legs", 6], + ["band-aid on face", 6], + ["band-aid", 6], + ["bandage", 6], + ["bandaged arm", 6], + ["bandaged leg", 6], + ["backpack", 6], + ["backless clothing", 6], + ["arm tattoo", 6], + ["animal print", 6], + ["clothing around waist", 6], + ["headphones around neck", 6], + ["oversized clothing", 6], + ["greaves", 6], + ["polka dot bow", 6], + ["harness", 6], + ["forehead gem", 6], + ["spiked collar", 6], + ["striped necktie", 6], + ["arm guards", 6], + ["latex", 6], + ["bead necklace", 6], + ["motorcycle", 6], + ["macro", 6], + ["cyborg", 6], + ["bruise", 6], + ["bruised", 6], + ["chest gem", 6], + ["v-neck", 6], + ["plaid scarf", 6], + ["prosthetic", 6], + ["mechanical arm", 6], + ["blood on hand", 2], + ["band-aid on nose", 6], + ["robot joints", 6], + ["zombie", 6], + ["tail ribbon", 6], + ["lanyard", 6], + ["amputee", 6], + ["bra strap", 6], + ["missing arm", 6], + ["money", 6], + ["revolver", 6], + ["pearl necklace", 6], + ["back dimples", 6], + ["chest harness", 6], + ["slime", 6], + ["partially unzipped", 6], + ["bodypaint", 6], + ["metal collar", 6], + ["loose necktie", 6], + ["clover", 6], + ["markings", 6], + ["mechanical wings", 6], + ["mascara", 6], + ["wounded", 6], + ["jacket around waist", 6], + ["blood", 2], + ["rectangular eyewear", 6], + ["chain necklace", 6], + ["tie clip", 6], + ["gold chain", 6], + ["mechanical parts", 6], + ["seamed legwear", 6], + ["eye mask", 6], + ["scratches", 6], + ["cross scar", 6], + ["tusks", 6], + ["sun symbol", 6], + ["energy wings", 6], + ["sweatband", 6], + ["glowing sword", 6], + ["fanny pack", 6], + ["energy ball", 6], + ["scepter", 6], + ["cherry blossom print", 6], + ["insect wings", 6], + ["utility belt", 6], + ["fake ears", 6], + ["magic user", 6], + ["dark magic", 6], + ["holy spellcaster", 6], + ["tribal spellcaster", 6], + ["adventurer", 6], + ["goth", 6], + ["visor", 6], + ["superhero", 6], + ["warrior", 6], + ["thief", 6], +] +facialExpressionsF = [ + ["wince", 6], + ["wide eyed", 6], + ["tears", 6], + ["triangle mouth", 6], + ["trembling", 6], + ["tongue out", 6], + ["sweatdrop", 6], + ["surprised", 6], + ["spoken heart", 6], + ["spoken question mark", 6], + ["spoken ellipsis", 6], + ["smug", 6], + ["smirk", 6], + ["smile", 6], + ["serious", 6], + ["pouting", 6], + ["parted lips", 6], + ["o_o", 6], + ["nose blush", 6], + ["naughty face", 6], + ["light smile", 6], + ["light blush", 6], + ["licking lips", 6], + ["laughing", 6], + ["panting", 6], + ["happy", 6], + ["half-closed eyes", 6], + ["grin", 6], + ["frown", 6], + ["flying sweatdrops", 6], + ["expressionless", 6], + ["evil grin", 6], + ["embarrassed", 6], + ["drunk", 6], + ["crying", 6], + ["eyes closed", 6], + ["clenched teeth", 6], + ["blush stickers", 6], + ["blush", 6], + ["angry", 6], + ["cross-popping vein", 6], + ["ahegao", 1], + ["^_^", 6], + ["spiral eyes", 6], + ["question mark", 6], + [">:)", 6], + ["=_=", 6], + [";d", 6], + [";)", 6], + ["tongue out", 6], + [":o", 6], + [":d", 6], + [":3", 6], + ["ellipsis", 6], + ["?!", 6], + ["exclamation point", 6], + ["annoyed", 6], + ["spoken exclamation mark", 6], + ["sad", 6], + ["nervous", 6], + ["seductive", 6], + ["bedroom eyes", 6], + ["zzz", 6], + ["sleepy", 6], + ["ear blush", 6], + ["tired", 6], + ["nervous sweat", 6], + ["spoken musical note", 6], + ["glare", 6], + ["shy", 6], + ["nervous smile", 6], + ["thinking", 6], + ["puckered lips", 6], + ["screaming", 6], + ["grimace", 6], + ["confused", 6], + ["worried", 6], + ["raised eyebrows", 6], + ["raised eyebrow", 6], + ["cross-eyed", 6], + ["narrowed eyes", 6], + ["stare", 6], + ["wide eyed", 6], + ["wink", 6], + ["furrowed brow", 6], + ["dilated pupils", 6], + ["scowl", 6], + ["sneer", 6], + ["open smile, open mouth", 6], + ["open frown, open mouth", 6], + ["closed smile, mouth closed", 6], + ["closed frown, mouth closed", 6], + ["bored", 6], + ["disgust", 6], + ["disturbed", 6], + ["flustered", 6], + ["grumpy", 6], + ["guilty", 6], + ["fear", 6], + ["love", 6], + ["lust", 6], + ["proud", 6], + ["scared", 6], + ["shocked", 6], + ["unimpressed", 6], +] +yearsF = [ + ["year 2005", 6], + ["year 2006", 6], + ["year 2007", 6], + ["year 2008", 6], + ["year 2009", 6], + ["year 2010", 6], + ["year 2011", 6], + ["year 2012", 6], + ["year 2013", 6], + ["year 2014", 6], + ["year 2015", 6], + ["year 2016", 6], + ["year 2017", 6], + ["year 2018", 6], + ["year 2018", 6], + ["year 2019", 6], + ["year 2020", 6], + ["year 2021", 6], + ["year 2022", 6], + ["year 2023", 6], +] +environmentDetailsF = [ + ["wood floor", 6], + ["window", 6], + ["wine glass", 6], + ["water", 6], + ["wall", 6], + ["wall (structure)", 6], + ["underwater", 6], + ["torii", 6], + ["tatami", 6], + ["steam", 6], + ["starry sky", 6], + ["stairs", 6], + ["space", 6], + ["snow", 6], + ["snowing", 6], + ["smoke", 6], + ["sky", 6], + ["shadow", 6], + ["under shade", 6], + ["sand", 6], + ["road", 6], + ["reflection", 6], + ["raining", 6], + ["railing", 6], + ["pool", 6], + ["palm tree", 6], + ["onsen", 6], + ["sea", 6], + ["night", 6], + ["nature", 6], + ["moon", 6], + ["grass", 6], + ["full moon", 6], + ["forest", 6], + ["field", 6], + ["fence", 6], + ["desk", 6], + ["day", 6], + ["curtains", 6], + ["sofa", 6], + ["cloud", 6], + ["classroom", 6], + ["city", 6], + ["car", 6], + ["shrub", 6], + ["building", 6], + ["bookshelf", 6], + ["bedroom", 6], + ["bed", 6], + ["beach", 6], + ["bath", 6], + ["vines", 6], + ["bamboo", 6], + ["house", 6], + ["ruins", 6], + ["brick wall", 6], + ["futon", 6], + ["bridge", 6], + ["shelf", 6], + ["street", 6], + ["castle", 6], + ["flower field", 6], + ["skyscraper", 6], + ["utility pole", 6], + ["train interior", 6], + ["evening", 6], + ["mountainous horizon", 6], + ["wave", 6], + ["kitchen", 6], + ["tower", 6], + ["waterfall", 6], + ["library", 6], + ["puddle", 6], + ["lake", 6], + ["store", 6], + ["fog", 6], + ["blood moon", 2], + ["rooftop", 6], + ["floor", 6], + ["shore", 6], + ["ceiling", 6], + ["city lights", 6], + ["bamboo forest", 6], + ["hallway", 6], + ["moonlight", 6], + ["dusk", 6], + ["sink", 6], + ["tombstone", 6], + ["hill", 6], + ["sunrise", 6], + ["restaurant", 6], + ["moss", 6], + ["church", 6], + ["town", 6], + ["cave", 6], + ["veranda", 6], + ["reflective floor", 6], + ["alley", 6], + ["pond", 6], + ["tree", 6], + ["landscape", 6], + ["cityscape", 6], + ["garden", 6], + ["mountain", 6], + ["scenic view", 6], + ["dungeon", 6], + ["underground", 6], + ["partially submerged", 6], +] +smallObjectsF = [ + ["strawberry", 6], + ["teddy bear", 6], + ["teacup", 6], + ["smartphone", 6], + ["skull", 6], + ["shield", 6], + ["scabbard", 6], + ["school desk", 6], + ["scythe", 6], + ["sack", 6], + ["rose", 6], + ["rope", 6], + ["rock", 6], + ["rifle", 6], + ["pumpkin", 6], + ["potted plant", 6], + ["popsicle", 6], + ["polearm", 6], + ["pocky", 6], + ["plate", 6], + ["plant", 6], + ["pen", 6], + ["phone", 6], + ["open book", 6], + ["parasol", 6], + ["mug", 6], + ["mecha", 6], + ["machine", 6], + ["lollipop", 6], + ["leaf", 6], + ["lantern", 6], + ["lamp", 6], + ["knife", 6], + ["key", 6], + ["katana", 6], + ["jack-o'-lantern", 6], + ["instrument", 6], + ["innertube", 6], + ["ice cream", 6], + ["hibiscus", 6], + ["headset", 6], + ["headphones", 6], + ["handgun", 6], + ["handbag", 6], + ["hand fan", 6], + ["gun", 6], + ["guitar", 6], + ["gift", 6], + ["gift box", 6], + ["gem", 6], + ["fruit", 6], + ["food", 6], + ["flower", 6], + ["disposable cup", 6], + ["dagger", 6], + ["cup", 6], + ["cross", 6], + ["controller", 6], + ["computer", 6], + ["cigarette", 6], + ["chopsticks", 6], + ["chocolate", 6], + ["chair", 6], + ["chain", 6], + ["cellphone", 6], + ["cellphone", 6], + ["cannon", 6], + ["candy", 6], + ["candle", 6], + ["can", 6], + ["camera", 6], + ["cake", 6], + ["bucket", 6], + ["broom", 6], + ["branch", 6], + ["box", 6], + ["bowl", 6], + ["bottle", 6], + ["book", 6], + ["blanket", 6], + ["blanket", 6], + ["bench", 6], + ["bell", 6], + ["bed sheet", 6], + ["beads", 6], + ["beachball", 6], + ["basket", 6], + ["balloon", 6], + ["ball", 6], + ["axe", 6], + ["assault rifle", 6], + ["apple, fruit", 6], + ["alcohol", 6], + ["carrot, vegetable", 6], + ["paintbrush", 6], + ["tea", 6], + ["maple leaf", 6], + ["television", 6], + ["handcuffs", 6], + ["doughnut", 6], + ["water bottle", 6], + ["bread", 6], + ["monitor", 6], + ["handheld console", 6], + ["earphones", 6], + ["stool", 6], + ["smoking pipe", 6], + ["cookie", 6], + ["chalkboard", 6], + ["coin", 6], + ["syringe", 6], + ["christmas tree", 6], + ["rice", 6], + ["bathtub", 6], + ["beer", 6], + ["street lamp", 6], + ["egg (food)", 6], + ["cherry, fruit", 6], + ["cushion", 6], + ["scissors", 6], + ["sake", 6], + ["burger", 6], + ["coffee", 6], + ["clipboard", 6], + ["electric guitar", 6], + ["cardboard box", 6], + ["lily (flower)", 6], + ["pillar", 6], + ["wine", 6], + ["laptop", 6], + ["shopping bag", 6], + ["whip", 6], + ["grapes", 6], + ["grapes", 6], + ["water gun", 6], + ["paper lantern", 6], + ["vase", 6], + ["whistle", 6], + ["noodles", 6], + ["notebook", 6], + ["suitcase", 6], + ["bone", 6], + ["ice cream cone", 6], + ["elbow pads", 6], + ["heart-shaped chocolate", 6], + ["cane", 6], + ["ladle", 6], + ["orange (fruit)", 6], + ["locker", 6], + ["gears", 6], + ["crab", 6], + ["wine bottle", 6], + ["coffee mug", 6], + ["machine gun", 6], + ["trident", 6], + ["boat", 6], + ["road sign", 6], + ["stick", 6], + ["armchair", 6], + ["pillow", 6], + ["tissue box", 6], + ["jar", 6], + ["computer keyboard", 6], + ["thorns", 6], + ["office chair", 6], + ["pot", 6], + ["pole", 6], + ["test tube", 6], + ["rapier", 6], + ["envelope", 6], + ["banana, fruit", 6], + ["lemon, fruit", 6], + ["shotgun", 6], + ["energy sword", 6], + ["pizza", 6], + ["tomato, fruit", 6], + ["rubber duck", 6], + ["candy apple", 6], + ["baozi", 6], + ["lily pad", 6], + ["pancake", 6], + ["beverage can", 6], + ["vegetable", 6], + ["trash can", 6], + ["frying pan", 6], + ["four-leaf clover", 6], + ["ramen", 6], + ["candy cane", 6], + ["stethoscope", 6], + ["plastic bag", 6], + ["bass guitar", 6], + ["flower pot", 6], + ["pudding", 6], + ["soccer ball", 6], + ["duffel bag", 6], + ["cigar", 6], + ["beach towel", 6], + ["hammer", 6], + ["glowstick", 6], + ["coffee cup", 6], + ["volleyball", 6], + ["sweets", 6], + ["pastry", 6], + ["dessert", 6], + ["satchel", 6], + ["torch", 6], + ["surfboard", 6], + ["briefcase", 6], + ["baseball", 6], + ["barrel", 6], + ["tulip (flower)", 6], + ["baseball glove", 6], +] +posesAndActionsF = [ + ["waving", 6], + ["wariza", 6], + ["walking", 6], + ["wading", 6], + ["ass up", 6], + ["thought bubble", 6], + ["dialogue", 6], + ["stretching", 6], + ["straddling", 6], + ["on one leg", 6], + ["standing", 6], + ["spread legs", 6], + ["spread arms", 6], + ["shirt lift", 6], + ["selfie", 6], + ["salute", 6], + ["restrained", 6], + ["reaching towards viewer", 6], + ["reaching", 6], + ["v sign", 6], + ["paw pose", 6], + ["outstretched arm", 6], + ["outstretched arms", 6], + ["on back", 6], + ["on bed", 6], + ["on chair", 6], + ["on couch", 6], + ["on floor", 6], + ["on one knee", 6], + ["on side", 6], + ["on front", 6], + ["lying", 6], + ["looking up", 6], + ["looking aside", 6], + ["looking down", 6], + ["looking back", 6], + ["looking away", 6], + ["looking at viewer", 6], + ["licking", 6], + ["legs up", 6], + ["legs together", 6], + ["raised leg", 6], + ["leaning forward", 6], + ["leaning backward", 6], + ["knees up", 6], + ["knock-kneed", 6], + ["kneeling", 6], + ["jumping", 6], + ["raised index finger", 6], + ["hugging object", 6], + ["heart hands", 6], + ["headpat", 6], + ["arms above head", 6], + ["hands on hips", 6], + ["hand on hip", 6], + ["hand on face", 6], + ["hand on chest", 6], + ["hand in pocket", 6], + ["raised hand", 6], + ["hand to mouth", 6], + ["hand between legs", 6], + ["pose", 6], + ["fighting pose", 6], + ["eating", 6], + ["drinking", 6], + ["double v sign", 6], + ["dancing", 6], + ["crossed legs", 6], + ["crossed arms", 6], + ["covering mouth", 6], + ["covering breasts", 1], + ["contrapposto", 6], + ["clothing pull", 6], + ["fist", 6], + ["claw pose", 6], + ["bent over", 6], + ["hands behind back", 6], + ["hands behind head", 6], + ["arms at sides", 6], + ["raised arm", 6], + ["arm support", 6], + ["holding own arm", 6], + ["arched back", 6], + ["all fours", 1], + ["against surface", 6], + ["arm under breasts", 6], + ["on ground", 6], + ["pigeon toed", 6], + ["thumbs up", 6], + ["kick", 6], + ["hand on thigh", 6], + ["tiptoes", 6], + ["singing", 6], + ["falling", 6], + ["hand on knee", 6], + ["punch", 6], + ["yawn", 6], + ["hand on stomach", 6], + ["hand on cheek", 6], + ["hands on cheeks", 6], + ["hand on butt", 6], + ["covering face", 6], + ["shooting", 6], + ["shush", 6], + ["crouching", 6], + ["feet up", 6], + ["open hands", 6], + ["waking up", 6], + ["hands on knees", 6], + ["pointing", 6], + ["pointing up", 6], + ["pointing at viewer", 6], + ["holding own arm", 6], + ["exercise", 6], + ["finger to cheek", 6], + ["covering eyes", 6], + ["beckoning", 6], + ["rubbing eyes", 6], + ["praying", 6], + ["holding sign", 6], + ["looking at phone", 6], + ["fleeing", 6], + ["ok sign", 6], + ["hands on own thighs", 6], + ["sleeping", 6], + ["action pose", 6], + ["holding object", 6], + ["flying", 6], + ["relaxing", 6], + ["sitting", 6], + ["gesture", 6], + ["playing music", 6], + ["workout", 6], + ["playing videogame", 6], +] +visualEffectsF = [ + ["sparkles", 6], + ["snowflake", 6], + ["petals", 6], + ["pawprint", 6], + ["musical note", 6], + ["motion lines", 6], + ["magic", 6], + ["light rays", 6], + ["lens flare", 6], + ["ice", 6], + ["glowing", 6], + ["glint", 6], + ["fire", 6], + ["fantasy", 6], + ["falling petals", 6], + ["emphasis lines", 6], + ["electricity", 6], + ["depth of field", 6], + ["crystal", 6], + ["confetti", 6], + ["chromatic aberration", 6], + ["christmas", 6], + ["cherry blossom", 6], + ["bubble", 6], + ["autumn", 6], + ["aura", 6], + ["explosion", 6], + ["summer", 6], + ["sunbeam", 6], + ["magic circle", 6], + ["fireworks", 6], + ["winter", 6], + ["partially colored", 6], + ["ripples", 6], + ["rainbow", 6], + ["sepia", 6], + ["blood splatter", 2], + ["spring (season)", 6], + ["rose petals", 6], + ["shiny", 6], + ["lightning", 6], + ["blue fire", 6], + ["falling leaves", 6], + ["muted color", 6], + ["soap bubbles", 6], + ["horror (theme)", 6], + ["colorful", 6], + ["constellation", 6], + ["egyptian", 6], + ["surreal", 6], + ["paint splatter", 6], + ["lolita (fashion) ", 6], + ["abstract", 6], + ["embers", 6], + ["sunburst", 6], + ["stage lights", 6], + ["fashion", 6], + ["trick or treat", 6], + ["fluffy", 6], + ["symmetry", 6], + ["glitch", 6], + ["border", 6], + ["framed", 6], + ["character image", 6], + ["3d (artwork)", 6], + ["line art", 6], + ["lineless", 6], + ["outline", 6], + ["pixel (artwork) ", 6], + ["oekaki", 6], + ["screencap", 6], + ["game cg", 6], + ["drop shadow", 6], + ["gradient", 6], + ["grainy", 6], + ["film grain", 6], + ["bokeh", 6], + ["backlighting", 6], + ["dithering", 6], + ["monochrome", 2], + ["greyscale", 6], + ["silhouette", 6], + ["vignette", 6], + ["art deco", 6], + ["art nouveau", 6], + ["science fiction", 6], + ["steampunk", 6], + ["cyberpunk", 6], + ["futuristic", 6], + ["western", 6], + ["sunlight", 6], + ["wind", 6], + ["restricted palette", 6], + ["overgrown", 6], + ["cosmic horror", 6], + ["halloween", 6], + ["grass", 6], + ["blood", 2], + ["dark theme", 6], + ["light theme", 6], + ["foreshortening", 6], + ["cutaway", 6], + ["romantic ambiance", 6], +] +colorsF = [ + ["black", 6], + ["blue", 6], + ["brown", 6], + ["green ", 6], + ["grey", 6], + ["orange", 6], + ["pink", 6], + ["purple", 6], + ["red", 6], + ["tan", 6], + ["teal", 6], + ["white", 6], + ["yellow", 6], + ["multicolored", 2], + ["rainbow", 2], + ["two tone", 2], + ["pattern", 3], +] + +type Options = List[List[str | int | Optional[List]]] + + +def random_range(a, b): + if a == b: + return a + if a > b: + a, b = b, a + return random.randint(a, b) + + +def get_weighted_random_choice(options: Options, tags: List[Any]) -> Any: + """ + 从加权选项中随机选择一项。 + :param options: 元组列表, 每个元组包含一个选项值和其权重。 + :param tags: 当前的 traits,用于条件过滤(虽然实际没有直接用到)。 + :return: 随机选择的选项。 + """ + # 过滤掉有条件选项 (第三个字段) 且条件不满足的项 + filtered_options = [option for option in options if len(option) < 3 or any(tag in tags for tag in option[2])] + + # 总权重 + total_weight = sum(option[1] for option in filtered_options) + + # 生成一个 1 到 total_weight 之间的随机数 + random_weight = random_range(1, total_weight) + + # 根据权重,找到对应选项 + cumulative_weight = 0 + for option in filtered_options: + cumulative_weight += option[1] + if random_weight <= cumulative_weight: + return option[0] + + # 如果没有返回,抛出异常 (不应该达到此处) + raise RuntimeError("get_weighted_choice: should not reach here") + + +def generate_character_traits( + gender: str, portrait_type: str, level: int +) -> tuple: + """ + 生成角色特性。 + :param gender: 性别 (例如 'f' 表示女性)。 + :param portrait_type: word of intermediatePortraitsF | fullLengthOnlyF + :param level: 等级 (影响特征和服饰数量)。 + :return: 包含 tags 和 flags。 + """ + traits: List[Any] = [] + flags: List[str] = [] + + # 随机选择一个 "种类" + category = get_weighted_random_choice( + [ + ["core", 50], + ["humanoid", 20], + ["other", 5], + ], + traits + ) + + # 根据选择种类,选择不同特征或标志 + if category == "core": + traits.append(get_weighted_random_choice(animalOptionsF, traits)) + if random.random() < 0.8: + traits.append(get_weighted_random_choice(characterTypesF, traits)) + + elif category == "humanoid": + traits.append("humanoid") + traits.append(get_weighted_random_choice(mythicalRacesF, traits)) + flags.append("not_furry") + + elif category == "other": + traits.append(get_weighted_random_choice(hybridSpeciesF, traits)) + + # 随机分支:身体颜色 + if random.random() < 0.7: + traits.append(get_weighted_random_choice(bodyColorsF, traits)) + + # 随机分支:身体风格 + if random.random() < 0.7: + body_style = get_weighted_random_choice( + [ + ["multicolored body", 50], + ["two tone body", 30], + ["rainbow body", 2], + ], + traits + ) + + if body_style in {"multicolored body", "two tone body"} and random.random() < 0.5: + traits.append(get_weighted_random_choice(bodyColorsF, traits)) + + traits.append(body_style) + + # 随机分支:眼睛和其他特性 + if random.random() < 0.7: + traits.append(get_weighted_random_choice(eyeColorsF, traits)) + + if random.random() < 0.05: + traits.append(get_weighted_random_choice(scleraColorsF, traits)) + + if random.random() < 0.1: + traits.append(get_weighted_random_choice(eyeFeaturesF, traits)) + + # 如果标签中含 "not_furry",处理毛发或发型的特性 + if "not_furry" in flags: + if random.random() < 0.7: + traits.append(get_weighted_random_choice(hairLengthsF, traits)) + if random.random() < 0.5: + traits.append(get_weighted_random_choice(hairStylesF, traits)) + if random.random() < 0.7: + traits.append(get_weighted_random_choice(hairColorsF, traits)) + if random.random() < 0.1: + traits.append(get_weighted_random_choice(hairEffectsF, traits)) + else: + if random.random() < 0.2: + traits.append(get_weighted_random_choice(hairLengthsF, traits)) + if random.random() < 0.1: + traits.append(get_weighted_random_choice(hairStylesF, traits)) + if random.random() < 0.1: + traits.append(get_weighted_random_choice(hairColorsF, traits)) + if random.random() < 0.1: + traits.append(get_weighted_random_choice(hairEffectsF, traits)) + + if "not_furry" in flags: + if random.random() < 0.1: + traits.append(get_weighted_random_choice(hairTexturesF, traits)) + else: + if random.random() < 0.05: + traits.append(get_weighted_random_choice(hairTexturesF, traits)) + + if "not_furry" in flags: + if random.random() < 0.1: + traits.append(get_weighted_random_choice(hairSpecificsF, traits)) + else: + if random.random() < 0.05: + traits.append(get_weighted_random_choice(hairSpecificsF, traits)) + + # 人物性别特征 + if gender == "f" and random.random() < 0.5 and "feral" not in traits: + traits.append(get_weighted_random_choice(chestSizesF, traits)) + elif gender == "f" and random.random() < 0.1: + traits.append(get_weighted_random_choice(chestSizesF, traits)) + + # 身体特征数量,通过级别决定权重 + body_feature_count = ( + get_weighted_random_choice( + [ + [0, 10], + [1, 30], + [2, 15], + [3, 5], + ], + traits + ) + if level == 1 + else get_weighted_random_choice( + [ + [0, 20], + [1, 40], + [2, 10], + ], + traits + ) + if level == 2 + else get_weighted_random_choice( + [ + [0, 30], + [1, 30], + ], + traits + ) + ) + + for _ in range(body_feature_count): + traits.append(get_weighted_random_choice(bodyFeaturesF, traits)) + + # 随机分支: 帽子或头饰 + if random.random() < 0.15: + traits.append(get_weighted_random_choice(hatsF, traits)) + elif random.random() < 0.2: + traits.append(get_weighted_random_choice(hairAccessoriesF, traits)) + + # 生成服饰相关内容(简化逻辑) + clothing_type = get_weighted_random_choice( + [ + ["uniform", 10], + ["swimsuit", 5], + ["bodysuit", 5], + ["normal clothes", 40], + ], + traits + ) + + # 处理服饰类型和附加逻辑(如颜色等) + if "feral" in traits: + if random.random() > 0.6: + clothing_type = None + elif random.random() < 0.2: + clothing_type = None + + hasIntermediateFeatures = any(e in intermediatePortraitsF for e in traits) + + # 概率分支:30% 概率添加 "furgonomics" + if clothing_type and random.random() < 0.3: + traits.append("furgonomics") + + if clothing_type == "uniform": + traits.append(get_weighted_random_choice(specialtyClothingF, traits)) + elif clothing_type == "swimsuit": + traits.append(get_weighted_random_choice(swimwearF, traits)) + elif clothing_type == "bodysuit": + traits.append(get_weighted_random_choice(bodysuitsAndRobesF, traits)) + elif clothing_type == "normal clothes": + if gender == "f" and random.random() < 0.2: + addColor = random.random() < 0.5 + color = get_weighted_random_choice(colorsF, traits) + dress = get_weighted_random_choice(dressesF, traits) + traits.append(f"{color + ' ' if addColor else ''}{dress}") + if random.random() < 0.9: + addColor = random.random() < 0.5 + color = get_weighted_random_choice(colorsF, traits) + traits.append(f"{color + ' ' if addColor else ''}{get_weighted_random_choice(topsF, traits)}") + if ( + not hasIntermediateFeatures + and random.random() < 0.7 + and portrait_type + and portrait_type in intermediatePortraitsF + ): + addColor = random.random() < 0.5 + color = get_weighted_random_choice(colorsF, traits) + traits.append(f"{color + ' ' if addColor else ''}{get_weighted_random_choice(pantsAndShortsF, traits)}") + if random.random() < 0.5 and portrait_type and portrait_type in intermediatePortraitsF: + addColor = random.random() < 0.5 + color = get_weighted_random_choice(colorsF, traits) + traits.append(f"{color + ' ' if addColor else ''}{get_weighted_random_choice(legWearF, traits)}") + if random.random() < 0.3 and portrait_type and portrait_type in fullLengthOnlyF: + addColor = random.random() < 0.5 + color = get_weighted_random_choice(colorsF, traits) + traits.append(f"{color + ' ' if addColor else ''}{get_weighted_random_choice(footwearF, traits)}") + + # 概率分支:60% 添加 facialExpressionsF + if random.random() < 0.6: + traits.append(get_weighted_random_choice(facialExpressionsF, traits)) + + # 概率分支:40% 添加 posesAndActionsF + if random.random() < 0.4: + traits.append(get_weighted_random_choice(posesAndActionsF, traits)) + + # 筛选逻辑:去除某些特定的眼睛特征 + if any( + "sleeping" in trait or "zzz" in trait or "eyes closed" in trait + for trait in traits + ): + traits = [ + trait + for trait in traits + if all( + trait != eyeOption[0] for eyeOption in eyeColorsF + ) + ] + traits = [ + trait + for trait in traits + if all( + trait != scleraOption[0] for scleraOption in scleraColorsF + ) + ] + traits = [ + trait + for trait in traits + if all( + trait != eyeFeature[0] for eyeFeature in eyeFeaturesF + ) + ] + + # 根据 level 确定 clothingItemsCount + if level == 1: + clothingItemsCount = get_weighted_random_choice( + [ + [0, 20], + [1, 20], + [2, 10], + [3, 2], + ], + traits, + ) + elif level == 2: + clothingItemsCount = get_weighted_random_choice( + [ + [0, 30], + [1, 30], + [2, 5], + ], + traits, + ) + else: + clothingItemsCount = get_weighted_random_choice( + [ + [0, 30], + [1, 15], + ], + traits, + ) + + # 添加随机数量的 clothingItemsF 标签 + for _ in range(clothingItemsCount): + traits.append(get_weighted_random_choice(clothingItemsF, traits)) + + # 特定情况下筛除与 "legwear" 和 "legs" 相关的特性 + if hasIntermediateFeatures or (portrait_type and portrait_type not in intermediatePortraitsF): + traits = [e for e in traits if "legwear" not in e and "legs" not in e] + + return traits, flags + + +# 核心函数:场景标签生成器 +def generate_scene_tags() -> List[str]: + tags: List[str] = [] + + # 随机选择角色数及其权重分布 + character_count = get_weighted_random_choice( + [ + [1, 80], + [2, 15], + [3, 5], + [0, 5] + ], + tags + ) + if character_count == 0: + tags.append("zero pictured") + # 概率分支:30% 概率添加艺术风格 + if random.random() < 0.3: + tags.append(get_weighted_random_choice(artStylesF, tags)) + tags.append(get_weighted_random_choice(backgroundCategoriesF, tags)) + + # 随机环境细节生成 + environment_count = get_weighted_random_choice( + [ + [2, 15], + [3, 50], + [4, 15], + [5, 5] + ], + tags + ) + for _ in range(environment_count): + tags.append( + get_weighted_random_choice( + [ + ["inside", 50], + ["outside", 50] + ], + tags + ) + ) + tags.append(get_weighted_random_choice(environmentDetailsF, tags)) + + # 随机小物件生成 + small_object_count = get_weighted_random_choice( + [ + [0, 15], + [1, 20], + [2, 15], + [3, 15], + [4, 10], + [5, 5] + ], + tags + ) + for _ in range(small_object_count): + tags.append(get_weighted_random_choice(smallObjectsF, tags)) + + return [", ".join(tags)] + + portrait_option = None + female_count = 0 + male_count = 0 + ambiguous_gender_count = 0 + + # 根据角色数随机分配性别 + for _ in range(character_count): + gender_choice = get_weighted_random_choice( + [ + ["m", 45], + ["f", 45], + ["o", 10] + ], + tags + ) + if gender_choice == "m": + male_count += 1 + elif gender_choice == "f": + female_count += 1 + elif gender_choice == "o": + ambiguous_gender_count += 1 + + # 添加标签:"solo", "duo", "trio" + if character_count == 1: + tags.append("solo") + elif character_count == 2: + tags.append("duo") + elif character_count == 3: + tags.append("trio") + + # 概率分支:30% 概率添加艺术风格 + if random.random() < 0.3: + tags.append(get_weighted_random_choice(artStylesF, tags)) + + # 根据性别计数添加标签 + if female_count > 0: + tags.append("female") + if male_count > 0: + tags.append("male") + if ambiguous_gender_count > 0: + tags.append("ambiguous gender") + + # 概率分支:90% 添加背景样式 + if random.random() < 0.9: + background_style = get_weighted_random_choice(backgroundStyleF, tags) + tags.append(background_style) + + # 详细背景样式 + if background_style in {"detailed background", "amazing background"}: + environment_detail_count = get_weighted_random_choice( + [ + [1, 50], + [2, 20] + ], + tags + ) + tags.append( + get_weighted_random_choice( + [ + ["inside", 50], + ["outside", 50] + ], + tags + ) + ) + for _ in range(environment_detail_count): + tags.append(get_weighted_random_choice(environmentDetailsF, tags)) + + # 概率分支:30% 添加视角标签 + if random.random() < 0.3: + tags.append(get_weighted_random_choice(viewF, tags)) + + # 概率分支:70% 添加肖像选项 + if random.random() < 0.7: + portrait_option = get_weighted_random_choice(portraitOptionsF, tags) + if portrait_option: + tags.append(portrait_option) + + has_furry_elements = False + character_tags: List[str] = [] + + # 根据性别计数生成角色特征 + for _ in range(female_count): + _tags, _flags = generate_character_traits("f", portrait_option, character_count) + character_tags.extend(_tags) + if "not_furry" not in _flags: + has_furry_elements = True + + for _ in range(male_count): + _tags, _flags = generate_character_traits("m", portrait_option, character_count) + character_tags.extend(_tags) + if "not_furry" not in _flags: + has_furry_elements = True + + for _ in range(ambiguous_gender_count): + _tags, _flags = generate_character_traits("o", portrait_option, character_count) + character_tags.extend(_tags) + if "not_furry" not in _flags: + has_furry_elements = True + + # 如果没有毛绒元素,添加 "not furry" + if not has_furry_elements: + character_tags.insert(0, "not furry") + + tags.extend(character_tags) + + # 概率分支:20% 添加小物件 + if random.random() < 0.2: + small_object_count = get_weighted_random_choice( + [ + [0, 40], + [1, 20], + [2, 10], + [3, 2] + ], + tags + ) + if character_count == 2: + small_object_count = get_weighted_random_choice( + [ + [0, 30], + [1, 20], + [2, 5] + ], + tags + ) + elif character_count == 3: + small_object_count = get_weighted_random_choice( + [ + [0, 20], + [1, 10] + ], + tags + ) + for _ in range(small_object_count): + tags.append(get_weighted_random_choice(smallObjectsF, tags)) + + # 概率分支:25% 添加视觉效果 + if random.random() < 0.25: + visual_effect_count = get_weighted_random_choice( + [ + [1, 80], + [2, 20] + ], + tags + ) + for _ in range(visual_effect_count): + tags.append(get_weighted_random_choice(visualEffectsF, tags)) + + # 概率分支:20% 添加年代标签 + if random.random() < 0.2: + tags.append(get_weighted_random_choice(yearsF, tags)) + + # 概率分支:5% 添加焦点标签 + if random.random() < 0.05: + tags.append(get_weighted_random_choice(focusF, tags)) + + # 消除重复标签并返回 + tags = list({tag: True for tag in tags}.keys()) + return [", ".join(tags)] + + +if __name__ == "__main__": + print(generate_scene_tags()) diff --git a/src/novelai_python/tool/random_prompt/generate_tags.py b/src/novelai_python/tool/random_prompt/generate_tags.py new file mode 100644 index 0000000..f1711d0 --- /dev/null +++ b/src/novelai_python/tool/random_prompt/generate_tags.py @@ -0,0 +1,2517 @@ +import base64 +import random +from datetime import datetime +from typing import List, Optional, Any + +from pydantic import BaseModel + +cameraAngles = [ + ["dutch angle", 5], + ["from above", 5], + ["from behind", 5], + ["from below", 5], + ["from side", 5], + ["straight-on", 5], +] +objectFocus = [ + ["solo focus", 5], + ["ass focus", 5, ["portrait"]], + ["foot focus", 5, ["portrait", "cowboy shot", "upper body"]], + ["hip focus", 5, ["portrait"]], + ["back focus", 5], + ["breast focus", 5], + ["armpit focus", 3], + ["eye focus", 5], +] +sceneTypes = [ + ["landscape", 5], + ["nature", 5], + ["scenery", 5], + ["still life", 5], + ["cityscape", 5], +] +backgroundStyles = [ + ["white background", 5], + ["grey background", 5], + ["gradient background", 7], + ["blurry background", 5], + ["blue background", 5], + ["pink background", 5], + ["black background", 5], + ["yellow background", 5], + ["red background", 5], + ["two-tone background", 7], + ["brown background", 5], + ["green background", 5], + ["purple background", 5], + ["orange background", 5], + ["floral background", 5], + ["polka dot background", 5], + ["striped background", 5], + ["multicolored background", 7], + ["starry background", 5], + ["dark background", 5], + ["checkered background", 5], + ["aqua background", 5], + ["beige background", 5], + ["heart background", 5], + ["argyle background", 3], + ["halftone background", 4], + ["sparkle background", 5], + ["abstract background", 5], + ["patterned background", 5], + ["plaid background", 4], + ["sunburst background", 4], + ["tan background", 5], + ["light blue background", 5], + ["snowflake background", 5], + ["grid background", 5], + ["leaf background", 5], + ["rainbow background", 5], + ["lavender background", 5], + ["light brown background", 5], + ["monochrome background", 5], + ["bubble background", 5], + ["sepia background", 5], + ["fiery background", 5], + ["silver background", 5], + ["splatter background", 5], + ["sketch background", 5], + ["scenery", 100], +] +framingStyles = [ + ["portrait", 4], + ["upper body", 5], + ["cowboy shot", 3], + ["full body", 4], + ["close-up", 1], + ["split crop", 1], +] +artStyles = [ + ["ligne claire", 5], + ["realistic", 5], + ["sketch", 5], + ["jaggy lines", 5], + ["retro artstyle", 5], + ["toon (style)", 5], + ["western comics (style)", 5], + ["surreal", 5], + ["abstract", 5], + ["spot color", 5], + ["graphite (medium)", 5], + ["watercolor (medium)", 5], + ["concept art", 5], + ["flat color", 5], + ["ai-generated", 5], + ["faux traditional media", 5], + ["oekaki", 5], + ["jaggy lines", 5], + ["minimalism", 5], + ["impressionism", 5], + ["1970s (style)", 5], + ["1980s (style)", 5], + ["1990s (style)", 5], +] +animalFeatures = [ + ["bat ears, bat wings", 5], + ["bear ears", 5], + ["rabbit ears", 5], + ["cat ears, cat tail", 5], + ["cow ears, cow horns, cow tail", 5], + ["deer ears, deer antlers", 5], + ["dog ears, dog tail", 5], + ["fox ears, fox tail", 5], + ["horse ears, horse tail", 5], + ["monkey ears, monkey tail", 5], + ["mouse ears, mouse tail", 5], + ["sheep ears, sheep horns", 5], + ["squirrel ears, squirrel tail", 5], + ["tiger ears, tiger tail", 5], + ["wolf ears, wolf tail", 5], + ["oni, oni horns", 5], + ["elf, pointy ears", 5], + ["elf, long pointy ears", 5], + ["dark elf, pointy ears", 5], + ["dark elf, long pointy ears", 5], + ["fairy", 5], + ["dragon horns, dragon tail", 5], + ["demon horns, demon tail", 5], + ["cow ears, cow horns", 5], + ["angel", 5], + ["android", 5], + ["mermaid, scales", 5], + ["head fins, fish tail", 5], + ["raccoon ears, raccoon tail", 5], + ["slime girl", 5], + ["lamia", 5], + ["harpy", 5], + ["orc", 5], + ["cyclops", 5], + ["centaur", 5], + ["monster", 5], +] +skinColors = [ + ["dark skin", 200], + ["very dark skin", 200], + ["pale skin", 200], + ["tan", 50], + ["black skin", 5], + ["blue skin", 5], + ["green skin", 5], + ["grey skin", 5], + ["orange skin", 5], + ["pink skin", 5], + ["purple skin", 5], + ["red skin", 5], + ["white skin", 5], + ["yellow skin", 5], +] +eyeStyles = [ + ["heterochromia", 5], + ["multicolored eyes", 5], + ["no eyes", 2], + ["ringed eyes", 5], + ["heart-shaped pupils", 5], + ["star-shaped pupils", 5], + ["bags under eyes", 5], + ["glowing eyes", 5], + ["glowing eye", 5], + ["bright pupils", 5], + ["sparkling eyes", 5], +] +strangeEyeEffects = [ + ["crazy eyes", 2], + ["empty eyes", 5], + ["solid circle eyes", 2], + ["solid oval eyes", 2], + ["jitome", 5], + ["tareme", 5], + ["tsurime", 5], + ["sanpaku", 5], + ["long eyelashes", 5], +] +hairLengths = [ + ["very short hair", 5], + ["short hair", 5], + ["medium hair", 5], + ["long hair", 5], + ["very long hair", 2], + ["absurdly long hair", 2], + ["big hair", 5], +] +braidStyles = [ + ["braid", 5], + ["braided bangs", 5], + ["front braid", 5], + ["side braid", 5], + ["french braid", 5], + ["crown braid", 5], + ["single braid", 5], + ["multiple braids", 5], + ["braided ponytail", 5], + ["hair bun", 5], + ["braided bun", 5], + ["single hair bun", 5], + ["double bun", 5], + ["hair rings", 5], + ["half updo", 5], + ["one side up", 5], + ["two side up", 5], + ["cone hair bun", 5], + ["low-braided long hair", 5], + ["low-tied long hair", 5], + ["ponytail", 5], + ["folded ponytail", 5], + ["high ponytail", 5], + ["short ponytail", 5], + ["side ponytail", 5], + ["split ponytail", 5], + ["twintails", 5], + ["low twintails", 5], + ["short twintails", 5], + ["uneven twintails", 5], + ["sidecut", 5], + ["asymmetrical hair", 5], + ["hime cut", 5], + ["curly hair", 5], +] +hairStyles = [ + ["drill hair", 5], + ["twin drills", 5], + ["hair flaps", 5], + ["messy hair", 5], + ["pointy hair", 5], + ["ringlets", 5], + ["spiked hair", 5], + ["straight hair", 5], + ["wavy hair", 5], + ["blunt ends", 5], + ["flipped hair", 5], +] +bangsStyles = [ + ["arched bangs", 5], + ["asymmetrical bangs", 5], + ["bangs pinned back", 5], + ["blunt bangs", 5], + ["crossed bangs", 5], + ["dyed bangs", 5], + ["hair over eyes", 5], + ["hair over one eye", 5], + ["long bangs", 5], + ["parted bangs", 5], + ["short bangs", 5], + ["swept bangs", 5], + ["hair between eyes", 5], + ["hair intakes", 5], + ["sidelocks", 5], + ["asymmetrical sidelocks", 5], + ["drill sidelocks", 5], + ["single sidelock", 5], + ["hair pulled back", 5], + ["hair slicked back", 5], + ["ahoge", 5], + ["antenna hair", 5], + ["hair spread out", 2], + ["cowlick", 5], +] +breastSizes = [ + ["flat chest", 5], + ["small breasts", 10], + ["medium breasts", 10], + ["large breasts", 5], + ["huge breasts", 2], + ["gigantic breasts", 1], + ["sagging breasts", 1], +] +bodyFeatures = [ + ["forehead", 5], + ["collarbone", 5], + ["ribs", 5], + ["neck", 5], + ["narrow waist", 5], + ["wide hips", 5], + ["shiny skin", 5], + ["thighs", 5], + ["thick thighs", 5], + ["thigh gap", 5], + ["third eye", 3], + ["thick eyebrows", 5], + ["teeth", 5], + ["stomach", 5], + ["plump", 5], + ["scar", 3], + ["petite", 5], + ["muscular", 5], + ["mature", 5], + ["huge ass", 1], + ["flat ass", 1], + ["mole under eye", 4], + ["mole under mouth", 4], + ["mole", 3], + ["mole on thigh", 3], + ["freckles", 5], + ["curvy", 5], + ["androgynous", 5], + ["abs", 5], + ["old", 5], + ["toned", 5], + ["fat", 1], + ["biceps", 5], + ["knees", 5], + ["skinny", 5], + ["hip bones", 5], + ["thick arms", 5], + ["tall", 5], +] +hatTypes = [ + ["baseball cap", 5], + ["cabbie hat", 5], + ["deerstalker", 5], + ["peaked cap", 5], + ["shako cap", 5], + ["bicorne", 5], + ["bowler hat", 5], + ["cowboy hat", 5], + ["straw hat", 5], + ["fedora", 5], + ["female service cap", 5], + ["flat cap", 5], + ["pirate hat", 5], + ["sun hat", 5], + ["top hat", 5], + ["tricorne", 5], + ["witch hat", 5], + ["wizard hat", 5], + ["dixie cup hat", 5], + ["chef hat", 5], + ["beret", 5], + ["beanie", 5], + ["coif", 5], + ["fur hat", 5], + ["nightcap", 5], + ["nurse cap", 5], + ["party hat", 5], + ["sailor hat", 5], + ["santa hat", 5], + ["animal hat", 5], + ["crown", 5], + ["circlet", 5], + ["diadem", 5], + ["tiara", 5], + ["aviator cap", 5], + ["bandana", 5], + ["bonnet", 5], + ["head scarf", 5], + ["jester cap", 5], + ["frilled hat", 5], + ["military hat", 5], + ["police hat", 5], + ["visor cap", 5], + ["headpiece", 5], + ["garrison cap", 5], + ["head wreath", 5], + ["flower wreath", 5], + ["animal on head", 5], +] +hairAccessories = [ + ["hair ribbon", 5], + ["hair bow", 5], + ["hairband", 5], + ["headband", 5], + ["headdress", 5], + ["veil", 5], + ["hooded cloak", 5], +] +hatAccessories = [ + ["hat bow", 5], + ["hat flower", 5], + ["hat ornament", 5], + ["hat ribbon", 5], + ["hat with ears", 5], +] +dressStyles = [ + ["coat dress", 5], + ["cocktail dress", 5], + ["dirndl", 5], + ["evening gown", 5], + ["funeral dress", 5], + ["gown", 5], + ["nightgown", 5], + ["pencil dress", 5], + ["sailor dress", 5], + ["santa dress", 5], + ["sundress", 5], + ["sweater dress", 5], + ["tube dress", 5], + ["wedding dress", 5], + ["fur-trimmed dress", 5], + ["armored dress", 5], + ["backless dress", 5], + ["collared dress", 5], + ["frilled dress", 5], + ["halter dress", 5], + ["latex dress", 5], + ["layered dress", 5], + ["long dress", 5], + ["off-shoulder dress", 5], + ["pleated dress", 5], + ["ribbed dress", 5], + ["ribbon-trimmed dress", 5], + ["short dress", 5], + ["see-through dress", 5], + ["sleeveless dress", 5], + ["strapless dress", 5], + ["china dress", 5], + ["fundoshi", 5], + ["hakama", 5], + ["kimono", 5], + ["yukata", 5], + ["furisode", 5], +] +legWearTypes = [ + ["socks", 5], + ["kneehighs", 5], + ["over-kneehighs", 5], + ["thighhighs", 5], + ["pantyhose", 5], + ["leggings", 5], + ["leg warmers", 5], + ["loose socks", 5], +] +detailedLegWear = [ + ["fishnet legwear", 5], + ["bow legwear", 5], + ["ribbed legwear", 5], + ["seamed legwear", 5], + ["see-through legwear", 5], + ["shiny legwear", 5], + ["toeless legwear", 5], + ["fur-trimmed legwear", 5], + ["lace-trimmed legwear", 5], + ["uneven legwear", 5], + ["mismatched legwear", 5], +] +topWear = [ + ["blouse", 5], + ["frilled shirt", 5], + ["sleeveless shirt", 5], + ["bustier", 5], + ["crop top", 5], + ["camisole", 5], + ["babydoll", 5], + ["chemise", 5], + ["nightgown", 5], + ["cardigan", 5], + ["cardigan vest", 5], + ["coat", 5], + ["duffel coat", 5], + ["fur coat", 5], + ["fur-trimmed coat", 5], + ["long coat", 5], + ["overcoat", 5], + ["raincoat", 5], + ["trench coat", 5], + ["winter coat", 5], + ["compression shirt", 5], + ["halterneck", 5], + ["criss-cross halter", 5], + ["hoodie", 5], + ["jacket", 5], + ["blazer", 5], + ["cropped jacket", 5], + ["letterman jacket", 5], + ["safari jacket", 5], + ["suit jacket", 5], + ["leather jacket", 5], + ["poncho", 5], + ["raglan sleeves", 5], + ["shirt", 5], + ["collared shirt", 5], + ["dress shirt", 5], + ["off-shoulder shirt", 5], + ["sleeveless shirt", 5], + ["striped shirt", 5], + ["t-shirt", 5], + ["shrug (clothing)", 5], + ["surcoat", 5], + ["sweater", 5], + ["turtleneck", 5], + ["sleeveless turtleneck", 5], + ["ribbed sweater", 5], + ["aran sweater", 5], + ["argyle sweater", 5], + ["virgin killer sweater", 5], + ["tabard", 5], + ["tailcoat", 5], + ["tank top", 5], + ["tube top", 5], + ["bandeau", 5], + ["underbust", 5], + ["vest", 5], + ["sweater vest", 5], + ["waistcoat", 5], + ["sarashi", 5], + ["tunic", 5], + ["front-tie top", 5], + ["breast curtains", 5], + ["pasties", 1], + ["heart pasties", 1], +] +bottomWear = [ + ["bloomers", 5], + ["buruma", 5], + ["chaps", 5], + ["kilt", 5], + ["pants", 5], + ["tight pants", 5], + ["baggy pants", 5], + ["bell-bottoms", 5], + ["capri pants", 5], + ["detached pants", 5], + ["jeans", 5], + ["lowleg pants", 5], + ["pants rolled up", 5], + ["yoga pants", 5], + ["pelvic curtain", 5], + ["petticoat", 5], + ["shorts", 5], + ["bike shorts", 5], + ["denim shorts", 5], + ["dolphin shorts", 5], + ["gym shorts", 5], + ["lowleg shorts", 5], + ["micro shorts", 5], + ["short shorts", 5], + ["suspender shorts", 5], + ["shorts under skirt", 5], + ["skirt", 5], + ["bubble skirt", 5], + ["high-waist skirt", 5], + ["long skirt", 5], + ["lowleg skirt", 5], + ["microskirt", 5], + ["miniskirt", 5], + ["overall skirt", 5], + ["plaid skirt", 5], + ["pleated skirt", 5], + ["suspender skirt", 5], + ["showgirl skirt", 5], + ["sweatpants", 5], +] +bootTypes = [ + ["boots", 5], + ["ankle boots", 5], + ["armored boots", 5], + ["cowboy boots", 5], + ["knee boots", 5], + ["high heel boots", 5], + ["lace-up boots", 5], + ["rubber boots", 5], + ["thigh boots", 5], + ["cross-laced footwear", 5], + ["dress shoes", 5], + ["flats", 5], + ["high heels", 5], + ["loafers", 5], + ["mary janes", 5], + ["platform footwear", 5], + ["pointy footwear", 5], + ["pumps", 5], + ["sandals", 5], + ["flip-flops", 5], + ["geta", 5], + ["gladiator sandals", 5], + ["okobo", 5], + ["zouri", 5], + ["slippers", 5], + ["animal slippers", 5], + ["ballet slippers", 5], + ["crocs", 5], + ["uwabaki", 5], + ["sneakers", 5], + ["high tops", 5], + ["converse", 5], + ["toeless footwear", 5], + ["wedge heels", 5], +] +clothingArmor = [ + ["armor", 5], + ["full armor", 5], + ["power armor", 5], + ["armored dress", 5], + ["bikini armor", 5], + ["band uniform", 5], + ["cassock", 5], + ["cheerleader", 5], + ["ghost costume", 5], + ["business suit", 5], + ["pant suit", 5], + ["skirt suit", 5], + ["tuxedo", 5], + ["gym uniform", 5], + ["habit", 5], + ["harem outfit", 5], + ["hazmat suit", 5], + ["animal costume", 5], + ["maid", 5], + ["unconventional maid", 5], + ["miko", 5], + ["military uniform", 5], + ["overalls", 5], + ["pajamas", 5], + ["pilot suit", 5], + ["sailor", 5], + ["santa costume", 5], + ["school uniform", 5], + ["serafuku", 5], + ["track suit", 5], + ["tutu", 5], + ["waitress", 5], + ["cowboy western", 5], + ["magical girl", 5], + ["lab coat", 5], + ["idol", 5], + ["police", 5], + ["race queen", 5], + ["bride", 5], + ["knight", 5], + ["tomboy", 5], + ["soccer uniform", 5], + ["employee uniform", 5], + ["dancer", 5], + ["spacesuit", 5], + ["idol", 5], + ["gyaru", 5], + ["kogal", 5], + ["soldier", 5], + ["pirate", 5], + ["princess", 5], + ["samurai", 5], + ["priest", 5], + ["nun", 5], +] +bodySuits = [ + ["bikesuit", 5], + ["racing suit", 5], + ["bodysuit", 5], + ["jumpsuit", 5], + ["short jumpsuit", 5], + ["leotard", 5], + ["strapless leotard", 5], + ["thong leotard", 5], + ["robe", 5], + ["unitard", 5], + ["springsuit", 5], +] +swimwear = [ + ["swimsuit", 5], + ["one-piece swimsuit", 5], + ["casual one-piece swimsuit", 5], + ["competition swimsuit", 5], + ["slingshot swimsuit", 5], + ["square bikini", 5], + ["school swimsuit", 5], + ["bikini", 5], + ["string bikini", 5], + ["micro bikini", 5], + ["lowleg bikini", 5], + ["thong bikini", 5], + ["sports bikini", 5], + ["swim briefs", 5], + ["rash guard", 5], + ["wetsuit", 5], + ["front-tie bikini top", 5], + ["o-ring bikini", 5], + ["strapless bikini", 5], + ["maid bikini", 5], + ["swim trunks", 5], +] +accessories = [ + ["apron", 5], + ["cape", 5], + ["capelet", 5], + ["hood", 5], + ["bodystocking", 5], + ["ascot", 5], + ["bowtie", 5], + ["choker", 5], + ["collar", 5], + ["epaulettes", 5], + ["feather boa", 5], + ["lapels", 5], + ["neck ruff", 5], + ["neckerchief", 5], + ["necklace", 5], + ["necktie", 5], + ["neck ribbon", 5], + ["scarf", 5], + ["shawl", 5], + ["anklet", 5], + ["arm belt", 5], + ["armband", 5], + ["armlet", 5], + ["bracelet", 5], + ["bangle", 5], + ["spiked bracelet", 5], + ["bridal gauntlets", 5], + ["detached sleeves", 5], + ["arm warmers", 5], + ["gloves", 5], + ["fingerless gloves", 5], + ["elbow gloves", 5], + ["half gloves", 5], + ["mittens", 5], + ["leg belt", 5], + ["ring", 5], + ["thighlet", 5], + ["wide sleeves", 5], + ["wristband", 5], + ["wrist cuffs", 5], + ["cuffs", 5], + ["wrist scrunchie", 5], + ["badge", 5], + ["belly chain", 5], + ["belt", 5], + ["brooch", 5], + ["buttons", 5], + ["collar chain", 5], + ["corsage", 5], + ["cuff links", 5], + ["pentacle", 5], + ["sarong", 5], + ["sash", 5], + ["suspenders", 5], + ["tassel", 5], + ["clothing cutout", 5], + ["flower trim", 5], + ["frills", 5], + ["gold trim", 5], + ["lace trim", 5], + ["ribbon trim", 5], + ["see-through", 5], + ["silver trim", 5], + ["torn clothes", 5], + ["earrings", 5], + ["hoop earrings", 5], + ["stud earrings", 5], + ["earclip", 5], + ["glasses", 5], + ["monocle", 5], + ["hair ornament", 5], + ["hair beads", 5], + ["hair bobbles", 5], + ["hairclip", 5], + ["hairpin", 5], + ["hair scrunchie", 5], + ["hair stick", 5], + ["mask", 5], + ["surgical mask", 5], + ["sleeves pushed up", 5], + ["sleeves rolled up", 5], + ["short sleeves", 5], + ["long sleeves", 5], + ["sleeves past wrists", 5], + ["sleeves past fingers", 5], + ["sleeves past elbows", 5], + ["puffy sleeves", 5], + ["sleeveless", 5], + ["goggles", 5], + ["sunglasses", 5], + ["coke-bottle glasses", 5], + ["opaque glasses", 5], + ["safety glasses", 5], + ["ski goggles", 5], + ["bespectacled", 5], + ["ear piercing", 5], + ["eyebrow piercing", 5], + ["lip piercing", 5], + ["nose piercing", 5], + ["tongue piercing", 5], + ["navel piercing", 5], + ["zipper", 5], + ["zettai ryouiki", 5], + ["wristwatch", 5], + ["x hair ornament", 5], + ["wing collar", 5], + ["whisker markings", 5], + ["wet", 5], + ["weapon", 5], + ["wand", 5], + ["waist apron", 5], + ["veins", 5], + ["vambraces", 5], + ["valentine", 5], + ["underboob", 5], + ["umbrella", 5], + ["under-rim eyewear", 5], + ["unbuttoned", 5], + ["tray", 5], + ["toenail polish", 5], + ["tentacles", 5], + ["tattoo", 5], + ["tanlines", 5], + ["swimsuit under clothes", 5], + ["sweat", 5], + ["striped", 5], + ["strap slip", 5], + ["star print", 5], + ["spikes", 5], + ["sideboob", 5], + ["side slit", 5], + ["shoulder armor", 5], + ["shoulder bag", 5], + ["shoulder cutout", 5], + ["shoulder tattoo", 5], + ["shirt tucked in", 5], + ["shiny clothes", 5], + ["sharp teeth", 5], + ["sharp fingernails", 5], + ["saliva", 5], + ["pouch", 5], + ["polka dot", 5], + ["pom pom (clothes)", 5], + ["pocket", 5], + ["revealing clothes", 5], + ["ribbon", 5], + ["ribbon choker", 5], + ["randoseru", 5], + ["semi-rimless eyewear", 5], + ["scrunchie", 5], + ["school bag", 5], + ["plaid", 5], + ["pendant", 5], + ["pauldrons", 5], + ["partially unbuttoned", 5], + ["paw gloves", 5], + ["open clothes", 5], + ["off shoulder", 5], + ["o-ring top", 5], + ["neck bell", 5], + ["navel cutout", 5], + ["mustache", 5], + ["wings", 5], + ["low wings", 5], + ["lipstick", 5], + ["leg ribbon", 5], + ["leash", 5], + ["lace", 5], + ["knee pads", 5], + ["kemonomimi mode", 5], + ["juliet sleeves", 5], + ["joints", 5], + ["jewelry", 5], + ["jacket on shoulders", 5], + ["impossible clothes", 5], + ["ice wings", 5], + ["horns", 5], + ["curled horns", 5], + ["highleg", 5], + ["high collar", 5], + ["helmet", 5], + ["mouth mask", 5], + ["midriff peek", 5], + ["midriff", 5], + ["mechanical arms", 5], + ["mask on head", 5], + ["makeup", 5], + ["long fingernails", 5], + ["helmet", 5], + ["halo", 5], + ["hair tubes", 5], + ["gauntlets", 5], + ["garter straps", 5], + ["fur trim", 5], + ["floating hair", 5], + ["fins", 5], + ["fangs", 5], + ["fang out", 5], + ["facial mark", 5], + ["facial hair", 5], + ["eyeshadow", 5], + ["eyes visible through hair", 5], + ["eyepatch", 5], + ["eyeliner", 5], + ["eyelashes", 5], + ["eyebrows", 5], + ["eyewear on head", 5], + ["earmuffs", 5], + ["covered navel", 5], + ["corset", 5], + ["contemporary", 5], + ["colored eyelashes", 5], + ["cleavage cutout", 5], + ["cleavage", 5], + ["claws", 5], + ["checkered clothes", 5], + ["center opening", 5], + ["center frills", 5], + ["breasts apart", 5], + ["breastplate", 5], + ["breast pocket", 5], + ["bracer", 5], + ["blood on clothes", 2], + ["blood on face", 2], + ["blindfold", 5], + ["bare shoulders", 5], + ["bare arms", 5], + ["bare legs", 5], + ["bandaid on face", 5], + ["bandaid", 5], + ["bandages", 5], + ["bandaged leg", 5], + ["bandaged arm", 5], + ["backpack", 5], + ["backless outfit", 5], + ["back bow", 5], + ["ass visible through thighs", 5], + ["ass focus", 5], + ["armpits", 5], + ["armpit crease", 5], + ["arm tattoo", 5], + ["animal print", 5], + ["clothes around waist", 5], + ["headphones around neck", 5], + ["oversized clothes", 5], + ["manly", 5], + ["greaves", 5], + ["one-eyed", 5], + ["fur-trimmed sleeves", 5], + ["polka dot bow", 5], + ["harness", 5], + ["forehead jewel", 5], + ["single bare shoulder", 5], + ["spiked collar", 5], + ["striped necktie", 5], + ["arm guards", 5], + ["undershirt", 5], + ["latex", 5], + ["bandaid on leg", 5], + ["bead necklace", 5], + ["dirty", 5], + ["motorcycle", 5], + ["giantess", 5], + ["cyborg", 5], + ["bruise", 5], + ["waist cape", 5], + ["extra arms", 5], + ["taut shirt", 5], + ["chest jewel", 5], + ["v-neck", 5], + ["plaid scarf", 5], + ["prosthesis", 5], + ["single mechanical arm", 5], + ["blood on hands", 2], + ["bandaid on nose", 5], + ["robot joints", 5], + ["zombie", 5], + ["tail ribbon", 5], + ["tomboy", 5], + ["panty peek", 5], + ["leg tattoo", 5], + ["lanyard", 5], + ["bra visible through clothes", 5], + ["amputee", 5], + ["bra strap", 5], + ["money", 5], + ["revolver", 5], + ["pearl necklace", 5], + ["dimples of venus", 5], + ["coat on shoulders", 5], + ["chest harness", 5], + ["slime (substance)", 5], + ["partially unzipped", 5], + ["bodypaint", 5], + ["metal collar", 5], + ["loose necktie", 5], + ["clover", 5], + ["body markings", 5], + ["mechanical wings", 5], + ["leaf print", 5], + ["pentagram", 5], + ["neon trim", 5], + ["prosthetic arm", 5], + ["bandage over one eye", 5], + ["mascara", 5], + ["cat ear headphones", 5], + ["cuts", 5], + ["jacket around waist", 5], + ["bleeding", 5], + ["rectangular eyewear", 5], + ["chain necklace", 5], + ["medal", 5], + ["tie clip", 5], + ["paw shoes", 5], + ["feather trim", 5], + ["gold chain", 5], + ["mechanical parts", 5], + ["seamed legwear", 5], + ["mechanical legs", 5], + ["eye mask", 5], + ["scratches", 5], + ["cross scar", 5], + ["tusks", 5], + ["dragon print", 5], + ["sun symbol", 5], + ["uneven sleeves", 5], + ["energy wings", 5], + ["cat print", 5], + ["sweatband", 5], + ["sweater around waist", 5], + ["single vertical stripe", 5], + ["glowing sword", 5], + ["fanny pack", 5], + ["blood stain", 2], + ["single pauldron", 5], + ["panty straps", 5], + ["energy ball", 5], + ["scepter", 5], + ["cherry blossom print", 5], + ["insect wings", 5], + ["constellation print", 5], + ["utility belt", 5], + ["prosthetic leg", 5], + ["very sweaty", 5], + ["scales", 5], + ["fake animal ears", 5], +] +facialExpressions = [ + ["wince", 5], + ["wide-eyed", 5], + ["tears", 5], + ["triangle mouth", 5], + ["trembling", 5], + ["tongue out", 5], + ["tearing up", 5], + ["sweatdrop", 5], + ["surprised", 5], + ["spoken heart", 5], + ["spoken question mark", 5], + ["spoken heart", 5], + ["spoken ellipsis", 5], + ["smug", 5], + ["smirk", 5], + ["smile", 5], + ["serious", 5], + ["shaded face", 5], + ["pout", 5], + ["parted lips", 5], + ["o_o", 5], + ["notice lines", 5], + ["nose blush", 5], + ["naughty face", 5], + ["light smile", 5], + ["light blush", 5], + ["licking lips", 5], + ["laughing", 5], + ["heavy breathing", 5], + ["happy", 5], + ["half-closed eyes", 5], + ["grin", 5], + ["frown", 5], + ["flying sweatdrops", 5], + ["expressionless", 5], + ["evil smile", 5], + ["embarrassed", 5], + ["drunk", 5], + ["crying with eyes open", 5], + ["crying", 5], + ["closed eyes", 5], + ["clenched teeth", 5], + ["chestnut mouth", 5], + ["blush stickers", 5], + ["blush", 5], + ["angry", 5], + ["anger vein", 5], + ["ahegao", 1], + ["^_^", 5], + ["@_@", 5], + ["?", 5], + [">:)", 5], + ["=_=", 5], + [";d", 5], + [";)", 5], + [":t", 5], + [":q", 5], + [":p", 5], + [":o", 5], + [":d", 5], + [":>", 5], + [":<", 5], + [":3", 5], + ["...", 5], + ["+_+", 5], + ["+++", 5], + ["!?", 5], + ["!", 5], + ["annoyed", 5], + ["spoken exclamation mark", 5], + ["sad", 5], + [":/", 5], + ["!!", 5], + ["nervous", 5], + ["0_0", 5], + [";o", 5], + ["seductive smile", 5], + ["zzz", 5], + ["torogao", 5], + ["d:", 5], + ["sleepy", 5], + ["ear blush", 5], + ["nervous sweating", 5], + ["=3", 5], + ["spoken musical note", 5], + ["glaring", 5], + [";p", 5], + ["yandere", 5], + ["shy", 5], + ["streaming tears", 5], + ["spoken blush", 5], + [">:(", 5], + ["evil grin", 5], + ["nervous smile", 5], + [";q", 5], + ["spoken squiggle", 5], + ["spoken interrobang", 5], + ["thinking", 5], + ["puckered lips", 5], + ["screaming", 5], + ["spoken anger vein", 5], + ["dot mouth", 5], + ["grimace", 5], + [";3", 5], + ["confused", 5], + ["worried", 5], + ["u_u", 5], + ["raised eyebrows", 5], +] +years = [ + ["year 2005", 5], + ["year 2006", 5], + ["year 2007", 5], + ["year 2008", 5], + ["year 2009", 5], + ["year 2010", 5], + ["year 2011", 5], + ["year 2012", 5], + ["year 2013", 5], + ["year 2014", 5], + ["year 2015", 5], + ["year 2016", 5], + ["year 2017", 5], + ["year 2018", 5], + ["year 2018", 5], + ["year 2019", 5], + ["year 2020", 5], + ["year 2021", 5], + ["year 2022", 5], + ["year 2023", 5], +] +environmentElements = [ + ["wooden floor", 5], + ["window", 5], + ["wine glass", 5], + ["water drop", 5], + ["water", 5], + ["wall", 5], + ["underwater", 5], + ["torii", 5], + ["tatami", 5], + ["steam", 5], + ["starry sky", 5], + ["stairs", 5], + ["space", 5], + ["snow", 5], + ["snowing", 5], + ["smoke", 5], + ["sky", 5], + ["shadow", 5], + ["shade", 5], + ["sand", 5], + ["road", 5], + ["rigging", 5], + ["reflection", 5], + ["rain", 5], + ["railing", 5], + ["pool", 5], + ["palm tree", 5], + ["outdoors", 5], + ["onsen", 5], + ["ocean", 5], + ["night sky", 5], + ["night", 5], + ["nature", 5], + ["moon", 5], + ["mountain", 5], + ["indoors", 5], + ["horizon", 5], + ["grass", 5], + ["full moon", 5], + ["frog", 5], + ["forest", 5], + ["field", 5], + ["fence", 5], + ["desk", 5], + ["day", 5], + ["curtains", 5], + ["couch", 5], + ["cloudy sky", 5], + ["cloud", 5], + ["classroom", 5], + ["cityscape", 5], + ["city", 5], + ["car", 5], + ["bush", 5], + ["building", 5], + ["bookshelf", 5], + ["bedroom", 5], + ["bed", 5], + ["beach", 5], + ["bath", 5], + ["vines", 5], + ["bamboo", 5], + ["house", 5], + ["ruins", 5], + ["crescent moon", 5], + ["sliding doors", 5], + ["brick wall", 5], + ["east asian architecture", 5], + ["futon", 5], + ["bridge", 5], + ["planet", 5], + ["shelf", 5], + ["bare tree", 5], + ["street", 5], + ["river", 5], + ["castle", 5], + ["flower field", 5], + ["skyscraper", 5], + ["utility pole", 5], + ["train interior", 5], + ["evening", 5], + ["mountainous horizon", 5], + ["waves", 5], + ["crowd", 5], + ["kitchen", 5], + ["tower", 5], + ["waterfall", 5], + ["library", 5], + ["puddle", 5], + ["shop", 5], + ["lake", 5], + ["fog", 5], + ["shrine", 5], + ["red moon", 5], + ["rooftop", 5], + ["shore", 5], + ["floor", 5], + ["contrail", 5], + ["shooting star", 5], + ["ceiling", 5], + ["city lights", 5], + ["bamboo forest", 5], + ["hallway", 5], + ["moonlight", 5], + ["locker room", 5], + ["dusk", 5], + ["sink", 5], + ["tombstone", 5], + ["hill", 5], + ["sunrise", 5], + ["restaurant", 5], + ["moss", 5], + ["church", 5], + ["town", 5], + ["cave", 5], + ["festival", 5], + ["veranda", 5], + ["reflective floor", 5], + ["alley", 5], + ["pond", 5], + ["tree", 5], + ["overgrown", 5], +] +smallObjects = [ + ["strawberry", 5], + ["teddy bear", 5], + ["teacup", 5], + ["teapot", 5], + ["spoon", 5], + ["smartphone", 5], + ["skull", 5], + ["shield", 5], + ["sheath", 5], + ["school desk", 5], + ["scythe", 5], + ["sack", 5], + ["rose", 5], + ["rope", 5], + ["rock", 5], + ["rifle", 5], + ["pumpkin", 5], + ["potted plant", 5], + ["popsicle", 5], + ["polearm", 5], + ["pocky", 5], + ["plate", 5], + ["plant", 5], + ["pen", 5], + ["phone", 5], + ["peach", 5], + ["parasol", 5], + ["open book", 5], + ["ofuda", 5], + ["mug", 5], + ["motor vehicle", 5], + ["mecha", 5], + ["machinery", 5], + ["lollipop", 5], + ["leaf", 5], + ["lantern", 5], + ["lamp", 5], + ["knife", 5], + ["key", 5], + ["katana", 5], + ["jack-o'-lantern", 5], + ["instrument", 5], + ["innertube", 5], + ["id card", 5], + ["ice cream", 5], + ["hibiscus", 5], + ["headset", 5], + ["headphones", 5], + ["handgun", 5], + ["handbag", 5], + ["hand fan", 5], + ["gun", 5], + ["guitar", 5], + ["gift", 5], + ["gift box", 5], + ["ghost", 5], + ["gem", 5], + ["fruit", 5], + ["fork", 5], + ["food", 5], + ["folding fan", 5], + ["flower", 5], + ["fish", 5], + ["doll", 5], + ["disposable cup", 5], + ["dagger", 5], + ["cup", 5], + ["cross", 5], + ["controller", 5], + ["computer", 5], + ["cigarette", 5], + ["chopsticks", 5], + ["chocolate", 5], + ["chair", 5], + ["chain", 5], + ["cellphone", 5], + ["carrot", 5], + ["cannon", 5], + ["candy", 5], + ["candle", 5], + ["can", 5], + ["camera", 5], + ["cake", 5], + ["butterfly", 5], + ["bucket", 5], + ["broom", 5], + ["branch", 5], + ["box", 5], + ["bowl", 5], + ["bouquet", 5], + ["bottle", 5], + ["book", 5], + ["blanket", 5], + ["bird", 5], + ["bench", 5], + ["bell", 5], + ["bed sheet", 5], + ["beads", 5], + ["beachball", 5], + ["basket", 5], + ["balloon", 5], + ["ball", 5], + ["axe", 5], + ["assault rifle", 5], + ["apple", 5], + ["alcohol", 5], + ["paintbrush", 5], + ["tea", 5], + ["black cat", 5], + ["maple leaf", 5], + ["mushroom", 5], + ["television", 5], + ["handcuffs", 5], + ["doughnut", 5], + ["water bottle", 5], + ["bread", 5], + ["pink rose", 5], + ["monitor", 5], + ["handheld game console", 5], + ["huge weapon", 5], + ["earphones", 5], + ["tank", 5], + ["stool", 5], + ["smoking pipe", 5], + ["cookie", 5], + ["chalkboard", 5], + ["coin", 5], + ["syringe", 5], + ["christmas tree", 5], + ["rice", 5], + ["bathtub", 5], + ["beer", 5], + ["lamppost", 5], + ["egg", 5], + ["cherry", 5], + ["cushion", 5], + ["scissors", 5], + ["horse", 5], + ["shell", 5], + ["sake", 5], + ["burger", 5], + ["coffee", 5], + ["clipboard", 5], + ["skeleton", 5], + ["electric guitar", 5], + ["cardboard box", 5], + ["lily (flower)", 5], + ["pillar", 5], + ["book stack", 5], + ["wine", 5], + ["mouse", 5], + ["laptop", 5], + ["kotatsu", 5], + ["shopping bag", 5], + ["whip", 5], + ["dango", 5], + ["grapes", 5], + ["water gun", 5], + ["paper lantern", 5], + ["vase", 5], + ["whistle", 5], + ["noodles", 5], + ["microphone stand", 5], + ["bicycle", 5], + ["notebook", 5], + ["hydrangea", 5], + ["suitcase", 5], + ["ship", 5], + ["bone", 5], + ["ice cream cone", 5], + ["elbow pads", 5], + ["heart-shaped chocolate", 5], + ["lance", 5], + ["cane", 5], + ["ladle", 5], + ["orange (fruit)", 5], + ["spring onion", 5], + ["statue", 5], + ["locker", 5], + ["gears", 5], + ["crab", 5], + ["wine bottle", 5], + ["gourd", 5], + ["starfish", 5], + ["coffee mug", 5], + ["machine gun", 5], + ["trident", 5], + ["lock", 5], + ["crow", 5], + ["boat", 5], + ["road sign", 5], + ["stick", 5], + ["armchair", 5], + ["frilled pillow", 5], + ["tissue box", 5], + ["jar", 5], + ["mandarin orange", 5], + ["keyboard (computer)", 5], + ["thorns", 5], + ["office chair", 5], + ["scope", 5], + ["pot", 5], + ["pole", 5], + ["food print", 5], + ["test tube", 5], + ["spider web", 5], + ["rapier", 5], + ["envelope", 5], + ["banana", 5], + ["lemon", 5], + ["shotgun", 5], + ["energy sword", 5], + ["pizza", 5], + ["digital media player", 5], + ["tomato", 5], + ["rubber duck", 5], + ["candy apple", 5], + ["baozi", 5], + ["lily pad", 5], + ["pancake", 5], + ["soda can", 5], + ["vegetable", 5], + ["trash can", 5], + ["frying pan", 5], + ["lotus", 5], + ["four-leaf clover", 5], + ["plum blossoms", 5], + ["electric fan", 5], + ["puppet", 5], + ["ramen", 5], + ["bento", 5], + ["candy cane", 5], + ["stethoscope", 5], + ["seashell", 5], + ["plastic bag", 5], + ["bass guitar", 5], + ["flower pot", 5], + ["pudding", 5], + ["flask", 5], + ["soccer ball", 5], + ["duffel bag", 5], + ["cigar", 5], + ["beach towel", 5], + ["shaved ice", 5], + ["mallet", 5], + ["turtle shell", 5], + ["glowstick", 5], + ["coffee cup", 5], + ["drumsticks", 5], + ["jellyfish", 5], + ["volleyball", 5], + ["sweets", 5], + ["swirl lollipop", 5], + ["pastry", 5], + ["omelet", 5], + ["curry", 5], + ["milk bottle", 5], + ["dessert", 5], + ["black rose", 5], + ["satchel", 5], + ["torch", 5], + ["transparent umbrella", 5], + ["surfboard", 5], + ["prayer beads", 5], + ["potato chips", 5], + ["racket", 5], + ["turtle", 5], + ["briefcase", 5], + ["baseball", 5], + ["wooden bucket", 5], + ["crepe", 5], + ["barrel", 5], + ["ramune", 5], + ["tulip", 5], + ["cat teaser", 5], + ["baseball mitt", 5], + ["desk lamp", 5], +] +posesAndActions = [ + ["waving", 5], + ["wariza", 5], + ["walking", 5], + ["wading", 5], + ["w", 5], + ["top-down bottom-up", 5], + ["thought bubble", 5], + ["talking", 5], + ["stretching", 5], + ["straddling", 5], + ["standing on one leg", 5], + ["standing", 5], + ["spread legs", 5], + ["spread arms", 5], + ["skirt hold", 5], + ["sitting", 5], + ["shirt lift", 5], + ["selfie", 5], + ["salute", 5], + ["riding", 5], + ["restrained", 5], + ["reading", 5], + ["reaching towards viewer", 5], + ["reaching", 5], + ["pulled by self", 5], + ["pose", 5], + ["peace sign", 5], + ["paw pose", 5], + ["own hands together", 5], + ["own hands clasped", 5], + ["outstretched hand", 5], + ["outstretched arms", 5], + ["open hand", 5], + ["on back", 5], + ["on bed", 5], + ["on chair", 5], + ["on couch", 5], + ["on floor", 5], + ["on one knee", 5], + ["on side", 5], + ["on stomach", 5], + ["lying", 5], + ["looking up", 5], + ["looking to the side", 5], + ["looking down", 5], + ["looking back", 5], + ["looking away", 5], + ["looking at viewer", 5], + ["looking ahead", 5], + ["looking afar", 5], + ["lifted by self", 5], + ["licking", 5], + ["legs up", 5], + ["legs together", 5], + ["legs apart", 5], + ["leg up", 5], + ["leg lift", 5], + ["leaning forward", 5], + ["leaning back", 5], + ["knees up", 5], + ["knees together feet apart", 5], + ["kneeling", 5], + ["jumping", 5], + ["indian style", 5], + ["index finger raised", 5], + ["hugging own legs", 5], + ["hugging object", 5], + ["heart hands", 5], + ["headpat", 5], + ["hands up", 5], + ["hands on own hips", 5], + ["hands on own face", 5], + ["hands on own chest", 5], + ["hands in pockets", 5], + ["hand up", 5], + ["hand to own mouth", 5], + ["hand on own hip", 5], + ["hand on own head", 5], + ["hand on own chin", 5], + ["hand on own chest", 5], + ["hand on own cheek", 5], + ["hand in pocket", 5], + ["hand between legs", 5], + ["finger to mouth", 5], + ["fighting stance", 5], + ["facing viewer", 5], + ["facing away", 5], + ["eating", 5], + ["drinking", 5], + ["double peace", 5], + ["dancing", 5], + ["crossed legs", 5], + ["crossed arms", 5], + ["covering mouth", 5], + ["covering breasts", 5], + ["covering", 5], + ["contrapposto", 5], + ["clothes pull", 5], + ["clenched hands", 5], + ["clenched hand", 5], + ["claw pose", 5], + ["carrying", 5], + ["breasts squeezed together", 5], + ["bent over", 5], + ["arms up", 5], + ["arms behind head", 5], + ["arms behind back", 5], + ["arms at sides", 5], + ["arm up", 5], + ["arm support", 5], + ["arm grab", 5], + ["arm behind head", 5], + ["arm behind back", 5], + ["arm at side", 5], + ["arched back", 5], + ["all fours", 5], + ["against wall", 5], + ["adjusting hair", 5], + ["adjusting eyewear", 5], + ["arm under breasts", 5], + ["holding hair", 5], + ["on ground", 5], + ["pigeon-toed", 5], + ["thumbs up", 5], + ["kicking", 5], + ["invisible chair", 5], + ["hand on own thigh", 5], + ["tiptoes", 5], + ["singing", 5], + ["falling", 5], + ["hand on own knee", 5], + ["holding gift", 5], + ["playing instrument", 5], + ["holding stuffed toy", 5], + ["pointing at viewer", 5], + ["broom riding", 5], + ["leaning to the side", 5], + ["tying hair", 5], + ["shouting", 5], + ["reclining", 5], + ["pillow hug", 5], + ["punching", 5], + ["yawning", 5], + ["\\m/", 5], + ["hand on own stomach", 5], + ["hands on own cheeks", 5], + ["hand on own ass", 5], + ["covering face", 5], + ["firing", 5], + ["strap pull", 5], + ["shushing", 5], + ["breast suppress", 5], + ["peeking out", 5], + ["squatting", 5], + ["feet up", 5], + ["open hands", 5], + ["waking up", 5], + ["hands on own knees", 5], + ["breast lift", 5], + ["hands in hair", 5], + ["peace sign, v over eye", 5], + ["pointing at self", 5], + ["pointing up", 5], + ["against glass", 5], + ["holding own arm", 5], + ["elbow rest", 5], + ["steepled fingers", 5], + ["hand on own arm", 5], + ["hair tucking", 5], + ["staring", 5], + ["fingers together", 5], + ["arms under breasts", 5], + ["clothes grab", 5], + ["exercise", 5], + ["shirt tug", 5], + ["finger to cheek", 5], + ["covering own eyes", 5], + ["come hither", 5], + ["rubbing eyes", 5], + ["praying", 5], + ["zombie pose", 5], + ["holding sign", 5], + ["looking at phone", 5], + ["fleeing", 5], + ["ok sign", 5], + ["playing with own hair", 5], + ["hands on lap", 5], + ["finger to own chin", 5], + ["hands on own thighs", 5], + ["confession", 5], + ["wiping tears", 5], + ["sleeping", 5], +] +visualEffects = [ + ["sparkle", 5], + ["snowflakes", 5], + ["petals", 5], + ["paw print", 5], + ["musical note", 5], + ["motion lines", 5], + ["magic", 5], + ["light rays", 5], + ["light particles", 5], + ["lens flare", 5], + ["ice", 5], + ["glowing", 5], + ["glint", 5], + ["fire", 5], + ["fantasy", 5], + ["falling petals", 5], + ["emphasis lines", 5], + ["electricity", 5], + ["eighth note", 5], + ["depth of field", 5], + ["crystal", 5], + ["crescent", 5], + ["confetti", 5], + ["chromatic aberration", 5], + ["christmas", 5], + ["chibi", 5], + ["cherry blossoms", 5], + ["bubble", 5], + ["blurry background", 5], + ["blurry foreground", 5], + ["autumn leaves", 5], + ["air bubble", 5], + ["aura", 5], + ["halftone", 5], + ["explosion", 5], + ["summer", 5], + ["sunbeam", 5], + ["magic circle", 5], + ["fireworks", 5], + ["winter", 5], + ["partially colored", 5], + ["ripples", 5], + ["rainbow", 5], + ["sepia", 5], + ["blood splatter", 2], + ["autumn", 5], + ["spring (season)", 5], + ["rose petals", 5], + ["danmaku", 5], + ["shiny", 5], + ["lightning", 5], + ["blue fire", 5], + ["falling leaves", 5], + ["muted color", 5], + ["soap bubbles", 5], + ["horror (theme)", 5], + ["colorful", 5], + ["viewfinder", 5], + ["constellation", 5], + ["egyptian", 5], + ["surreal", 5], + ["darkness", 5], + ["paint splatter", 5], + ["lolita fashion", 5], + ["bloom", 5], + ["abstract", 5], + ["embers", 5], + ["corruption", 5], + ["sunburst", 5], + ["stage lights", 5], + ["fashion", 5], + ["trick or treat", 5], + ["fluffy", 5], + ["symmetry", 5], + ["reflective water", 5], + ["glitch", 5], + ["border", 5], + ["framed", 5], + ["character image", 5], + ["3d", 5], + ["lineart", 5], + ["no lineart", 5], + ["outline", 5], + ["pixel art", 5], + ["oekaki", 5], + ["anime screencap", 5], + ["game screenshot", 5], + ["game cg", 5], + ["fake screenshot", 5], + ["drop shadow", 5], + ["cut-in", 5], + ["gradient", 5], + ["film grain", 5], + ["caustics", 5], + ["bokeh", 5], + ["bloom", 5], + ["backlighting", 5], + ["dithering", 5], + ["halftone", 5], + ["lens flare", 5], + ["monochrome", 5], + ["multiple monochrome", 5], + ["silhouette", 5], + ["vignetting", 5], + ["chromatic aberration", 5], + ["art deco", 5], + ["art nouveau", 5], + ["science fiction", 5], + ["steampunk", 5], + ["cyberpunk", 5], + ["western", 5], + ["sunlight", 5], + ["wind", 5], + ["squiggle", 5], + ["limited palette", 5], + ["overgrown", 5], + ["cosmic horror", 5], + ["halloween", 5], + ["grass", 5], + ["blood", 2], +] +eyeColors = [ + ["aqua eyes", 5], + ["black eyes", 5], + ["blue eyes", 5], + ["brown eyes", 5], + ["green eyes", 5], + ["grey eyes", 5], + ["orange eyes", 5], + ["purple eyes", 5], + ["pink eyes", 5], + ["red eyes", 5], + ["white eyes", 5], + ["yellow eyes", 5], + ["amber eyes", 5], +] +hairColors = [ + ["aqua hair", 5], + ["black hair", 5], + ["blonde hair", 5], + ["blue hair", 5], + ["light blue hair", 5], + ["dark blue hair", 5], + ["brown hair", 5], + ["light brown hair", 5], + ["green hair", 5], + ["dark green hair", 5], + ["light green hair", 5], + ["grey hair", 5], + ["orange hair", 5], + ["pink hair", 5], + ["purple hair", 5], + ["light purple hair", 5], + ["red hair", 5], + ["white hair", 5], +] +hairMutiColors = [ + ["multicolored hair", 5], + ["colored inner hair", 5], + ["gradient hair", 5], + ["rainbow hair", 5], + ["split-color hair", 2], + ["streaked hair", 5], + ["two-tone hair", 5], +] +colorPalette = [ + ["aqua", 5], + ["black", 5], + ["blue", 5], + ["brown", 5], + ["grey", 5], + ["orange", 5], + ["pink", 5], + ["purple", 5], + ["red", 5], + ["white", 5], + ["yellow", 5], + ["beige", 5], + ["two-toned", 5], + ["multicolored", 5], + ["silver", 2], + ["gold", 2], + ["rainbow", 1], +] + +nsfwData = "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" + +tailWingFeatures = ["mermaid", "centaur", "lamia"] + +holidayThemes = [ + ["christmas", 6], + ["christmas tree", 6], + ["santa hat", 6], + ["santa costume", 6], + ["merry christmas", 6], + ["gift", 6], + ["christmas ornaments", 6], + ["gift box", 6], + ["christmas lights", 6], + ["holly", 6], + ["reindeer antlers", 6], + ["candy cane", 6], + ["gingerbread", 6], + ["fireplace", 6], + ["chimney", 6], + ["pine tree", 6], + ["snowman", 6], + ["snow", 6], + ["winter", 6], + ["winter clothes", 6], + ["snowflake", 6], + ["snowing", 6], + ["snow", 6], + ["mittens", 6], + ["snowscape", 6], + ["earmuffs", 6], + ["star (symbol)", 6], + ["snowflake background", 6], + ["mistletoe", 6], + ["wreath", 6], + ["christmas wreath", 6], +] + + +class NsfwDecode(BaseModel): + p: List[List[str | int | List]] + mp: List[List[str | int | List]] + n: List[List[str | int | List]] + u: List[List[str | int | List]] + nk: List[List[str | int | List]] + bd: List[List[str | int | List]] + nEx: List[List[str | int | List]] + nSM: List[List[str | int | List]] + nSA: List[List[str | int | List]] + nSP: List[List[str | int | List]] + nPM: List[List[str | int | List]] + nPA: List[List[str | int | List]] + nPP: List[List[str | int | List]] + sMod: List[List[str | int | List]] + sActMod: List[List[str | int | List]] + sT: List[List[str | int | List]] + h: str + yu: str + ya: str + fu: str + fwm: str + fwf: str + nw: str + + +def decode_nsfw_data(nsfw_data): + # Decode the Base64 data to raw bytes + decoded_data = base64.b64decode(nsfw_data) + + # Apply XOR operation on each byte with its index, and clamp values within the valid range + decoded_array = bytearray( + (decoded_data[i] ^ i) & 0xFF for i in range(len(decoded_data)) + ) + + # Decode the resulting byte array into a UTF-8 string, and parse it as JSON + return NsfwDecode.model_validate_json(decoded_array.decode('utf-8')) + + +def random_range(a, b): + if a == b: + return a + if a > b: + a, b = b, a + return random.randint(a, b) + + +type Options = List[List[str | int | Optional[List]]] + +nsfwDecode = decode_nsfw_data(nsfwData) + + +def get_weighted_choice(options: Options, + tags: Optional[List[str]] = None) -> Any: + filtered_options = [] + + # 要么不存在第三个参数,要么第三个参数存在tags中的任意一个元素 + for option in options: + if len(option) > 2: + requirement = option[2] + if isinstance(requirement, list) and any(tag in tags for tag in requirement): + filtered_options.append(option) + if len(option) <= 2: + filtered_options.append(option) + + total_weight = sum(option[1] for option in filtered_options) + random_weight = random_range(total_weight, 1) + cumulative_weight = 0 + + for option in filtered_options: + cumulative_weight += option[1] + if random_weight <= cumulative_weight: + return option[0] + + raise ValueError("getWeightedChoice: should not reach here") + + +def generate_character_attributes( + gender: str, + view_type: Optional[str], + is_nsfw: bool, + level: int +) -> List[Any]: + attributes: List[Any] = [] + + # Adding attributes based on randomness + if random.random() < 0.1: + attributes.append(get_weighted_choice(animalFeatures, attributes)) + + has_tail_or_wing_features = any(attr in tailWingFeatures for attr in attributes) + + if random.random() < 0.4: + attributes.append(get_weighted_choice(skinColors, attributes)) + if random.random() < 0.8: + attributes.append(get_weighted_choice(eyeColors, attributes)) + if random.random() < 0.1: + attributes.append(get_weighted_choice(eyeStyles, attributes)) + if random.random() < 0.2: + attributes.append(get_weighted_choice(strangeEyeEffects, attributes)) + if random.random() < 0.8: + attributes.append(get_weighted_choice(hairLengths, attributes)) + if random.random() < 0.5: + attributes.append(get_weighted_choice(braidStyles, attributes)) + if random.random() < 0.7: + attributes.append(get_weighted_choice(hairColors, attributes)) + if random.random() < 0.1: + attributes.extend( + [get_weighted_choice(hairMutiColors, attributes), get_weighted_choice(hairColors, attributes)]) + if random.random() < 0.1: + attributes.append(get_weighted_choice(hairStyles, attributes)) + if random.random() < 0.2: + attributes.append(get_weighted_choice(bangsStyles, attributes)) + if gender.startswith("f") and random.random() < 0.5: + attributes.append(get_weighted_choice(breastSizes, attributes)) + + # Determine number of body features + number_of_body_features: int + if level == 1: + number_of_body_features = get_weighted_choice( + [ + [0, 10], + [1, 30], + [2, 15], + [3, 5], + ], + attributes + ) + elif level == 2: + number_of_body_features = get_weighted_choice( + [ + [0, 20], + [1, 40], + [2, 10], + ], + attributes + ) + else: + number_of_body_features = get_weighted_choice( + [ + [0, 30], + [1, 30], + ], + attributes + ) + + for _ in range(number_of_body_features): + attributes.append(get_weighted_choice(bodyFeatures, attributes)) + + if random.random() < 0.2: + attributes.append(get_weighted_choice(hatTypes, attributes)) + if random.random() < 0.2: + attributes.append(get_weighted_choice(hatAccessories, attributes)) + elif random.random() < 0.3: + attributes.append(get_weighted_choice(hairAccessories, attributes)) + + # Adding clothing options + clothing_option = get_weighted_choice( + [ + ["uniform", 10], + ["swimsuit", 5], + ["bodysuit", 5], + ["normal clothes", 40], + ], + attributes + ) + + # Handling NSFW-specific clothing + if is_nsfw and random.random() < 0.9: + nsfw_choice = get_weighted_choice( + [ + ["n", 15], + ["u", 10], + ["nk", 5], + ], + attributes + ) + + if nsfw_choice == "n": + attributes.append(get_weighted_choice(nsfwDecode.n, attributes)) + elif nsfw_choice == "u": + attributes.append(get_weighted_choice(nsfwDecode.u, attributes)) + if random.random() < 0.5: + clothing_option = None # Remove clothing + elif nsfw_choice == "nk": + attributes.append(get_weighted_choice(nsfwDecode.nk, attributes)) + clothing_option = None # Remove clothing + + if view_type not in ("portrait", "upper body"): + if gender == "f" and random.random() < 0.8: + attributes.append(get_weighted_choice(nsfwDecode.p, attributes)) + elif gender == "m" and random.random() < 0.8: + attributes.append(get_weighted_choice(nsfwDecode.mp, attributes)) + elif gender == "fu": + attributes.append(get_weighted_choice(nsfwDecode.mp, attributes)) + if random.random() < 0.5: + attributes.append(get_weighted_choice(nsfwDecode.p, attributes)) + + # Handling clothing-specific options + if clothing_option == "uniform": + attributes.append(get_weighted_choice(clothingArmor, attributes)) + elif clothing_option == "swimsuit": + attributes.append(get_weighted_choice(swimwear, attributes)) + elif clothing_option == "bodysuit": + attributes.append(get_weighted_choice(bodySuits, attributes)) + elif clothing_option == "normal clothes": + if gender.startswith("f") and random.random() < 0.5: + attributes.append(get_weighted_choice(legWearTypes, attributes)) + if random.random() < 0.2: + attributes.append(get_weighted_choice(detailedLegWear, attributes)) + if gender.startswith("f") and random.random() < 0.2: + add_color = random.random() < 0.5 + color = get_weighted_choice(colorPalette, attributes) + dress = get_weighted_choice(dressStyles, attributes) + attributes.append(f"{color} {dress}" if add_color else dress) + else: + if random.random() < 0.85: + add_color = random.random() < 0.5 + color = get_weighted_choice(colorPalette, attributes) + top = get_weighted_choice(topWear, attributes) + attributes.append(f"{color} {top}" if add_color else top) + if not has_tail_or_wing_features: + if random.random() < 0.85 and view_type != "portrait": + add_color = random.random() < 0.5 + color = get_weighted_choice(colorPalette, attributes) + bottom = get_weighted_choice(bottomWear, attributes) + attributes.append(f"{color} {bottom}" if add_color else bottom) + if random.random() < 0.6 and (view_type == "full body" or view_type is None): + add_color = random.random() < 0.5 + color = get_weighted_choice(colorPalette, attributes) + boots = get_weighted_choice(bootTypes, attributes) + attributes.append(f"{color} {boots}" if add_color else boots) + + if random.random() < 0.6: + attributes.append(get_weighted_choice(facialExpressions, attributes)) + + # Adding poses and actions + if random.random() < (1 if is_nsfw and level == 1 else 0.4): + poses_and_actions = posesAndActions + (nsfwDecode.nSM + nsfwDecode.nSA + nsfwDecode.nSP if is_nsfw else []) + attributes.append(get_weighted_choice(poses_and_actions, attributes)) + + # Filter for certain specific attributes + if any(attr for attr in attributes if "sleeping" in attr or "zzz" in attr or "closed eyes" in attr): + attributes = [attr for attr in attributes if attr not in [color[0] for color in eyeColors]] + + # Determine number of accessories + accessory_count: int + if level == 1: + accessory_count = get_weighted_choice( + [ + [0, 10], + [1, 30], + [2, 15], + [3, 5], + ], + attributes + ) + elif level == 2: + accessory_count = get_weighted_choice( + [ + [0, 20], + [1, 40], + [2, 10], + ], + attributes + ) + else: + accessory_count = get_weighted_choice( + [ + [0, 30], + [1, 30], + ], + attributes + ) + + for _ in range(accessory_count): + accessories_combined = accessories + (nsfwDecode.nEx if is_nsfw else []) + attributes.append(get_weighted_choice(accessories_combined, attributes)) + + # Remove legwear attributes if tail or wing features present + if has_tail_or_wing_features: + attributes = [attr for attr in attributes if "legwear" not in attr] + + return attributes + + +def generate_tags(isNSFW: bool) -> str: + """ + Generate tags for a character or scene based on whether it's NSFW or not. + + Args: + isNSFW (bool): Indicates whether the content is NSFW. + + Returns: + str: Comma-separated tags. + """ + tags: List[str] = [] + is_explicit = isNSFW + character_count = get_weighted_choice( + [ + [1, 70], + [2, 20], + [3, 7], + [0, 5], + ], + tags + ) + if is_explicit: + character_count = get_weighted_choice( + [ + [1, 35], + [2, 20], + [3, 7], + ], + tags + ) + if character_count == 0: + tags.append("no humans") + if random.random() < 0.3: + tags.append(get_weighted_choice(artStyles, tags)) + + tags.append(get_weighted_choice(sceneTypes, tags)) + + environment_count = get_weighted_choice( + [ + [2, 15], + [3, 50], + [4, 15], + [5, 5], + ], + tags + ) + for _ in range(environment_count): + tags.append(get_weighted_choice(environmentElements, tags)) + + small_object_count = get_weighted_choice( + [ + [0, 15], + [1, 10], + [2, 20], + [3, 20], + [4, 20], + [5, 15], + ], + tags + ) + small_object_count -= character_count + if small_object_count < 0: + small_object_count = 0 + for _ in range(small_object_count): + tags.append(get_weighted_choice(smallObjects, tags)) + + return ", ".join(tags) + + background_option = None + if random.random() < 0.3: + tags.append(get_weighted_choice(artStyles, tags)) + + male_count = female_count = other_count = 0 + + for _ in range(character_count): + gender = get_weighted_choice( + [ + ["m", 30], + ["f", 50], + ["o", 10], + ], + tags + ) + if gender == "m": + male_count += 1 + elif gender == "f": + female_count += 1 + else: + other_count += 1 + + if male_count == 1: + tags.insert(0, "1boy") + elif male_count == 2: + tags.insert(0, "2boys") + elif male_count == 3: + tags.insert(0, "3boys") + + if female_count == 1: + tags.insert(0, "1girl") + elif female_count == 2: + tags.insert(0, "2girls") + elif female_count == 3: + tags.insert(0, "3girls") + + if other_count == 1: + tags.insert(0, "1other") + elif other_count == 2: + tags.insert(0, "2others") + elif other_count == 3: + tags.insert(0, "3others") + + has_NSFw_content = False + # Handle explicit content + if is_explicit: + has_futa = False + if male_count >= 2 and female_count == 0: + if random.random() < 0.7: + tags.append(nsfwDecode.yu) + else: + tags.append(nsfwDecode.fu) + has_futa = True + + if female_count >= 2 and male_count == 0: + tags.append(nsfwDecode.ya) + + mixed_content = male_count > 0 and female_count > 0 and random.random() < 0.2 + if mixed_content: + tags.append(nsfwDecode.fu) + + if character_count >= 2: + has_NSFw_content = True + potential_NSFw_tags = nsfwDecode.nPM[:] + + if (male_count > 0 and female_count > 0) or has_futa: + potential_NSFw_tags += nsfwDecode.nPP + + if female_count > 0 or has_futa: + potential_NSFw_tags += nsfwDecode.nPA + + if has_futa: + tags.append(nsfwDecode.fwf) + + if mixed_content: + tags.append(nsfwDecode.fwm) + + tags.append(get_weighted_choice(potential_NSFw_tags, tags)) + + if random.random() < 0.6: + tags.append(get_weighted_choice(nsfwDecode.sMod, tags)) + + if random.random() < 0.4: + tags.append(get_weighted_choice(nsfwDecode.sActMod, tags)) + if random.random() < 0.05: + tags.append(get_weighted_choice(nsfwDecode.bd, tags)) + if random.random() < 0.05: + tags.append(get_weighted_choice(nsfwDecode.sT, tags)) + + tags.insert(0, nsfwDecode.nw) + + # Background and setting + if random.random() < 0.8: + background_style = get_weighted_choice(backgroundStyles, tags) + tags.append(background_style) + + if background_style == "scenery" and random.random() < 0.5: + scenery_elements = random_range(3, 1) + for _ in range(scenery_elements): + tags.append(get_weighted_choice(environmentElements, tags)) + + if random.random() < 0.3: + tags.append(get_weighted_choice(cameraAngles, tags)) + + if random.random() < 0.7 and not has_NSFw_content: + background_option = get_weighted_choice(framingStyles, tags) + tags.append(background_option) + + # Generate character-specific attributes + for _ in range(male_count): + include_futa_tag = is_explicit and male_count == 1 and character_count == 1 and random.random() < 0.2 + if include_futa_tag: + tags.append(nsfwDecode.fu) + tags.extend(generate_character_attributes("fu" if include_futa_tag else "m", background_option, is_explicit, + character_count)) + + for _ in range(female_count): + tags.extend(generate_character_attributes("f", background_option, is_explicit, character_count)) + + for _ in range(other_count): + tags.extend(generate_character_attributes("o", background_option, is_explicit, character_count)) + + if random.random() < 0.2: + object_count = random_range(4, 0) + if character_count == 2: + object_count = random_range(3, 0) + for _ in range(object_count): + tags.append(get_weighted_choice(smallObjects, tags)) + + if random.random() < 0.25: + effect_count = random_range(3, 1) + for _ in range(effect_count): + tags.append(get_weighted_choice(visualEffects, tags)) + + if random.random() < 0.2: + tags.append(get_weighted_choice(years, tags)) + if random.random() < 0.1: + tags.append(get_weighted_choice(objectFocus, tags)) + + # Remove duplicates, add optional special formatting + tags = list({tag: True for tag in tags}.keys()) + for i in range(len(tags)): + if random.random() < 0.02: + tags[i] = f"{{{tags[i]}}}" + + return ", ".join(tags) + + +def is_holiday_season() -> bool: + """ + Check if the current date is within the holiday season (December 1 - December 31). + + Returns: + bool: True if it's holiday season, False otherwise. + """ + today = datetime.now() + return today.month == 12 and 1 <= today.day <= 31 + + +def get_holiday_themed_tags() -> str: + """ + Generate holiday-themed tags based on the current date. + + Returns: + str: Comma-separated tags. + """ + return get_weighted_choice(holidayThemes) + + +if __name__ == "__main__": + is_nsfw = random.random() < 0.1 + print(generate_tags(is_nsfw)) + if is_holiday_season(): + print(get_weighted_choice(holidayThemes)) diff --git a/src/novelai_python/tool/random_prompt/tag.py b/src/novelai_python/tool/random_prompt/tag.py deleted file mode 100644 index 347d569..0000000 --- a/src/novelai_python/tool/random_prompt/tag.py +++ /dev/null @@ -1,7542 +0,0 @@ -# -*- coding: utf-8 -*- -# @Time : 2024/1/26 下午2:00 -# @Author : sudoskys -# @File : tag.py - - -cameraPerspective = [ - ['dutch angle', - 5], - [ - 'from above', - 5 - ], - [ - 'from behind', - 5 - ], - [ - 'from below', - 5 - ], - [ - 'from side', - 5 - ], - [ - 'straight-on', - 5 - ] -] - -cameraFocus = [ - ['solo focus', - 5], - [ - 'ass focus', - 5, - [ - 'portrait' - ] - ], - [ - 'foot focus', - 5, - [ - 'portrait', - 'cowboy shot', - 'upper body' - ] - ], - [ - 'hip focus', - 5, - [ - 'portrait' - ] - ], - [ - 'back focus', - 5 - ], - [ - 'breast focus', - 5 - ], - [ - 'armpit focus', - 3 - ], - [ - 'eye focus', - 5 - ] -] - -backgroundTheme = [ - ['landscape', - 5], - [ - 'nature', - 5 - ], - [ - 'scenery', - 5 - ], - [ - 'still life', - 5 - ], - [ - 'cityscape', - 5 - ] -] - -backgroundColor = [ - ['white background', - 5], - [ - 'grey background', - 5 - ], - [ - 'gradient background', - 7 - ], - [ - 'blurry background', - 5 - ], - [ - 'blue background', - 5 - ], - [ - 'pink background', - 5 - ], - [ - 'black background', - 5 - ], - [ - 'yellow background', - 5 - ], - [ - 'red background', - 5 - ], - [ - 'two-tone background', - 7 - ], - [ - 'brown background', - 5 - ], - [ - 'green background', - 5 - ], - [ - 'purple background', - 5 - ], - [ - 'orange background', - 5 - ], - [ - 'floral background', - 5 - ], - [ - 'polka dot background', - 5 - ], - [ - 'striped background', - 5 - ], - [ - 'multicolored background', - 7 - ], - [ - 'starry background', - 5 - ], - [ - 'dark background', - 5 - ], - [ - 'checkered background', - 5 - ], - [ - 'aqua background', - 5 - ], - [ - 'beige background', - 5 - ], - [ - 'heart background', - 5 - ], - [ - 'argyle background', - 3 - ], - [ - 'halftone background', - 4 - ], - [ - 'sparkle background', - 5 - ], - [ - 'abstract background', - 5 - ], - [ - 'patterned background', - 5 - ], - [ - 'plaid background', - 4 - ], - [ - 'sunburst background', - 4 - ], - [ - 'tan background', - 5 - ], - [ - 'light blue background', - 5 - ], - [ - 'snowflake background', - 5 - ], - [ - 'grid background', - 5 - ], - [ - 'leaf background', - 5 - ], - [ - 'rainbow background', - 5 - ], - [ - 'lavender background', - 5 - ], - [ - 'light brown background', - 5 - ], - [ - 'monochrome background', - 5 - ], - [ - 'bubble background', - 5 - ], - [ - 'sepia background', - 5 - ], - [ - 'fiery background', - 5 - ], - [ - 'silver background', - 5 - ], - [ - 'splatter background', - 5 - ], - [ - 'sketch background', - 5 - ], - [ - 'scenery', - 100 - ] -] - -cameraAngle = [ - ['portrait', - 4], - [ - 'upper body', - 5 - ], - [ - 'cowboy shot', - 3 - ], - [ - 'full body', - 4 - ], - [ - 'close-up', - 1 - ], - [ - 'split crop', - 1 - ] -] - -artStyle = [ - [ - 'ligne claire', - 5 - ], - [ - 'realistic', - 5 - ], - [ - 'sketch', - 5 - ], - [ - 'jaggy lines', - 5 - ], - [ - 'retro artstyle', - 5 - ], - [ - 'toon (style)', - 5 - ], - [ - 'western comics (style)', - 5 - ], - [ - 'surreal', - 5 - ], - [ - 'abstract', - 5 - ], - [ - 'spot color', - 5 - ], - [ - 'graphite (medium)', - 5 - ], - [ - 'watercolor (medium)', - 5 - ], - [ - 'concept art', - 5 - ], - [ - 'flat color', - 5 - ], - [ - 'ai-generated', - 5 - ], - [ - 'faux traditional media', - 5 - ], - [ - 'oekaki', - 5 - ], - [ - 'jaggy lines', - 5 - ], - [ - 'minimalism', - 5 - ], - [ - 'impressionism', - 5 - ], - [ - '1970s (style)', - 0 # DOWN - ], - [ - '1980s (style)', - 0 # DOWN - ], - [ - '1990s (style)', - 0 # DOWN - ] -] - -animalFeatures = [ - [ - 'bat ears, bat wings', - 5 - ], - [ - 'bear ears', - 5 - ], - [ - 'rabbit ears', - 5 - ], - [ - 'cat ears, cat tail', - 5 - ], - [ - 'cow ears, cow horns, cow tail', - 5 - ], - [ - 'deer ears, deer antlers', - 5 - ], - [ - 'dog ears, dog tail', - 5 - ], - [ - 'fox ears, fox tail', - 5 - ], - [ - 'horse ears, horse tail', - 5 - ], - [ - 'monkey ears, monkey tail', - 5 - ], - [ - 'mouse ears, mouse tail', - 5 - ], - [ - 'sheep ears, sheep horns', - 5 - ], - [ - 'squirrel ears, squirrel tail', - 5 - ], - [ - 'tiger ears, tiger tail', - 5 - ], - [ - 'wolf ears, wolf tail', - 5 - ], - [ - 'oni, oni horns', - 5 - ], - [ - 'elf, pointy ears', - 5 - ], - [ - 'elf, long pointy ears', - 5 - ], - [ - 'dark elf, pointy ears', - 5 - ], - [ - 'dark elf, long pointy ears', - 5 - ], - [ - 'fairy', - 5 - ], - [ - 'dragon horns, dragon tail', - 5 - ], - [ - 'demon horns, demon tail', - 5 - ], - [ - 'cow ears, cow horns', - 5 - ], - [ - 'angel', - 5 - ], - [ - 'android', - 5 - ], - [ - 'mermaid, scales', - 5 - ], - [ - 'head fins, fish tail', - 5 - ], - [ - 'raccoon ears, raccoon tail', - 5 - ], - [ - 'slime girl', - 5 - ], - [ - 'lamia', - 5 - ], - [ - 'harpy', - 5 - ], - [ - 'orc', - 5 - ], - [ - 'cyclops', - 5 - ], - [ - 'centaur', - 5 - ], - [ - 'monster', - 5 - ] -] - -sinkColor = [ - [ - 'dark skin', - 100 - ], - [ - 'very dark skin', - 100 - ], - [ - 'pale skin', - 200 - ], - [ - 'tan', - 50 - ], - [ - 'black skin', - 5 - ], - [ - 'blue skin', - 5 - ], - [ - 'green skin', - 5 - ], - [ - 'grey skin', - 5 - ], - [ - 'orange skin', - 5 - ], - [ - 'pink skin', - 5 - ], - [ - 'purple skin', - 5 - ], - [ - 'red skin', - 5 - ], - [ - 'white skin', - 100 - ], - [ - 'yellow skin', - 100 - ] -] - -eyeCharacteristics = [ - ['heterochromia', - 5], - [ - 'multicolored eyes', - 5 - ], - [ - 'no eyes', - 2 - ], - [ - 'ringed eyes', - 5 - ], - [ - 'heart-shaped pupils', - 5 - ], - [ - 'star-shaped pupils', - 5 - ], - [ - 'bags under eyes', - 5 - ], - [ - 'glowing eyes', - 5 - ], - [ - 'glowing eye', - 5 - ], - [ - 'bright pupils', - 5 - ], - [ - 'sparkling eyes', - 5 - ] -] - -eyesExpression = [ - ['crazy eyes', - 2], - [ - 'empty eyes', - 5 - ], - [ - 'solid circle eyes', - 2 - ], - [ - 'solid oval eyes', - 2 - ], - [ - 'jitome', - 5 - ], - [ - 'tareme', - 5 - ], - [ - 'tsurime', - 5 - ], - [ - 'sanpaku', - 5 - ], - [ - 'long eyelashes', - 5 - ] -] - -hairLength = [ - ['very short hair', - 5], - [ - 'short hair', - 5 - ], - [ - 'medium hair', - 5 - ], - [ - 'long hair', - 5 - ], - [ - 'very long hair', - 2 - ], - [ - 'absurdly long hair', - 2 - ], - [ - 'big hair', - 5 - ] -] - -backHairStyle = [ - ['braid', - 5], - [ - 'braided bangs', - 5 - ], - [ - 'front braid', - 5 - ], - [ - 'side braid', - 5 - ], - [ - 'french braid', - 5 - ], - [ - 'crown braid', - 5 - ], - [ - 'single braid', - 5 - ], - [ - 'multiple braids', - 5 - ], - [ - 'braided ponytail', - 5 - ], - [ - 'hair bun', - 5 - ], - [ - 'braided bun', - 5 - ], - [ - 'single hair bun', - 5 - ], - [ - 'double bun', - 5 - ], - [ - 'hair rings', - 5 - ], - [ - 'half updo', - 5 - ], - [ - 'one side up', - 5 - ], - [ - 'two side up', - 5 - ], - [ - 'cone hair bun', - 5 - ], - [ - 'low-braided long hair', - 5 - ], - [ - 'low-tied long hair', - 5 - ], - [ - 'ponytail', - 5 - ], - [ - 'folded ponytail', - 5 - ], - [ - 'high ponytail', - 5 - ], - [ - 'short ponytail', - 5 - ], - [ - 'side ponytail', - 5 - ], - [ - 'split ponytail', - 5 - ], - [ - 'twintails', - 5 - ], - [ - 'low twintails', - 5 - ], - [ - 'short twintails', - 5 - ], - [ - 'uneven twintails', - 5 - ], - [ - 'sidecut', - 5 - ], - [ - 'asymmetrical hair', - 5 - ], - [ - 'hime cut', - 5 - ], - [ - 'curly hair', - 5 - ] -] - -hairFeatures = [ - ['drill hair', - 5], - [ - 'twin drills', - 5 - ], - [ - 'hair flaps', - 5 - ], - [ - 'messy hair', - 5 - ], - [ - 'pointy hair', - 5 - ], - [ - 'ringlets', - 5 - ], - [ - 'spiked hair', - 5 - ], - [ - 'straight hair', - 5 - ], - [ - 'wavy hair', - 5 - ], - [ - 'blunt ends', - 5 - ], - [ - 'flipped hair', - 5 - ] -] - -foreheadStyle = [ - ['arched bangs', - 5], - [ - 'asymmetrical bangs', - 5 - ], - [ - 'bangs pinned back', - 5 - ], - [ - 'blunt bangs', - 5 - ], - [ - 'crossed bangs', - 5 - ], - [ - 'dyed bangs', - 5 - ], - [ - 'hair over eyes', - 5 - ], - [ - 'hair over one eye', - 5 - ], - [ - 'long bangs', - 5 - ], - [ - 'parted bangs', - 5 - ], - [ - 'short bangs', - 5 - ], - [ - 'swept bangs', - 5 - ], - [ - 'hair between eyes', - 5 - ], - [ - 'hair intakes', - 5 - ], - [ - 'sidelocks', - 5 - ], - [ - 'asymmetrical sidelocks', - 5 - ], - [ - 'drill sidelocks', - 5 - ], - [ - 'single sidelock', - 5 - ], - [ - 'hair pulled back', - 5 - ], - [ - 'hair slicked back', - 5 - ], - [ - 'ahoge', - 5 - ], - [ - 'antenna hair', - 5 - ], - [ - 'hair spread out', - 2 - ], - [ - 'cowlick', - 5 - ] -] - -breastsSize = [ - ['flat chest', - 5], - [ - 'small breasts', - 10 - ], - [ - 'medium breasts', - 10 - ], - [ - 'large breasts', - 5 - ], - [ - 'huge breasts', - 2 - ], - [ - 'gigantic breasts', - 1 - ], - [ - 'sagging breasts', - 1 - ] -] - -bodyFeatures = [ - ['forehead', - 5], - [ - 'collarbone', - 5 - ], - [ - 'ribs', - 5 - ], - [ - 'neck', - 5 - ], - [ - 'narrow waist', - 5 - ], - [ - 'wide hips', - 5 - ], - [ - 'shiny skin', - 5 - ], - [ - 'thighs', - 5 - ], - [ - 'thick thighs', - 5 - ], - [ - 'thigh gap', - 5 - ], - [ - 'third eye', - 3 - ], - [ - 'thick eyebrows', - 5 - ], - [ - 'teeth', - 5 - ], - [ - 'stomach', - 5 - ], - [ - 'plump', - 5 - ], - [ - 'scar', - 3 - ], - [ - 'petite', - 5 - ], - [ - 'muscular', - 5 - ], - [ - 'mature', - 5 - ], - [ - 'huge ass', - 1 - ], - [ - 'flat ass', - 1 - ], - [ - 'mole under eye', - 4 - ], - [ - 'mole under mouth', - 4 - ], - [ - 'mole', - 3 - ], - [ - 'mole on thigh', - 3 - ], - [ - 'freckles', - 5 - ], - [ - 'curvy', - 5 - ], - [ - 'androgynous', - 5 - ], - [ - 'abs', - 5 - ], - [ - 'old', - 5 - ], - [ - 'toned', - 5 - ], - [ - 'fat', - 1 - ], - [ - 'biceps', - 5 - ], - [ - 'knees', - 5 - ], - [ - 'skinny', - 5 - ], - [ - 'hip bones', - 5 - ], - [ - 'thick arms', - 5 - ], - [ - 'tall', - 5 - ] -] - -headWears = [ - ['baseball cap', - 5], - [ - 'cabbie hat', - 5 - ], - [ - 'deerstalker', - 5 - ], - [ - 'peaked cap', - 5 - ], - [ - 'shako cap', - 5 - ], - [ - 'bicorne', - 5 - ], - [ - 'bowler hat', - 5 - ], - [ - 'cowboy hat', - 5 - ], - [ - 'straw hat', - 5 - ], - [ - 'fedora', - 5 - ], - [ - 'female service cap', - 5 - ], - [ - 'flat cap', - 5 - ], - [ - 'pirate hat', - 5 - ], - [ - 'sun hat', - 5 - ], - [ - 'top hat', - 5 - ], - [ - 'tricorne', - 5 - ], - [ - 'witch hat', - 5 - ], - [ - 'wizard hat', - 5 - ], - [ - 'dixie cup hat', - 5 - ], - [ - 'chef hat', - 5 - ], - [ - 'beret', - 5 - ], - [ - 'beanie', - 5 - ], - [ - 'coif', - 5 - ], - [ - 'fur hat', - 5 - ], - [ - 'nightcap', - 5 - ], - [ - 'nurse cap', - 5 - ], - [ - 'party hat', - 5 - ], - [ - 'sailor hat', - 5 - ], - [ - 'santa hat', - 5 - ], - [ - 'animal hat', - 5 - ], - [ - 'crown', - 5 - ], - [ - 'circlet', - 5 - ], - [ - 'diadem', - 5 - ], - [ - 'tiara', - 5 - ], - [ - 'aviator cap', - 5 - ], - [ - 'bandana', - 5 - ], - [ - 'bonnet', - 5 - ], - [ - 'head scarf', - 5 - ], - [ - 'jester cap', - 1 - ], - [ - 'frilled hat', - 5 - ], - [ - 'military hat', - 5 - ], - [ - 'police hat', - 5 - ], - [ - 'visor cap', - 5 - ], - [ - 'headpiece', - 5 - ], - [ - 'garrison cap', - 5 - ], - [ - 'head wreath', - 5 - ], - [ - 'flower wreath', - 5 - ], - [ - 'animal on head', - 5 - ] -] - -hairOrnaments = [ - ['hair ribbon', - 5], - [ - 'hair bow', - 5 - ], - [ - 'hairband', - 5 - ], - [ - 'headband', - 5 - ], - [ - 'headdress', - 5 - ], - [ - 'veil', - 5 - ], - [ - 'hooded cloak', - 5 - ] -] - -hatOrnaments = [ - ['hat bow', - 5], - [ - 'hat flower', - 5 - ], - [ - 'hat ornament', - 5 - ], - [ - 'hat ribbon', - 5 - ], - [ - 'hat with ears', - 5 - ] -] - -dress = [ - ['coat dress', - 5], - [ - 'cocktail dress', - 5 - ], - [ - 'dirndl', - 5 - ], - [ - 'evening gown', - 5 - ], - [ - 'funeral dress', - 5 - ], - [ - 'gown', - 5 - ], - [ - 'nightgown', - 5 - ], - [ - 'pencil dress', - 5 - ], - [ - 'sailor dress', - 5 - ], - [ - 'santa dress', - 5 - ], - [ - 'sundress', - 5 - ], - [ - 'sweater dress', - 5 - ], - [ - 'tube dress', - 5 - ], - [ - 'wedding dress', - 5 - ], - [ - 'fur-trimmed dress', - 5 - ], - [ - 'armored dress', - 5 - ], - [ - 'backless dress', - 5 - ], - [ - 'collared dress', - 5 - ], - [ - 'frilled dress', - 5 - ], - [ - 'halter dress', - 5 - ], - [ - 'latex dress', - 5 - ], - [ - 'layered dress', - 5 - ], - [ - 'long dress', - 5 - ], - [ - 'off-shoulder dress', - 5 - ], - [ - 'pleated dress', - 5 - ], - [ - 'ribbed dress', - 5 - ], - [ - 'ribbon-trimmed dress', - 5 - ], - [ - 'short dress', - 5 - ], - [ - 'see-through dress', - 5 - ], - [ - 'sleeveless dress', - 5 - ], - [ - 'strapless dress', - 5 - ], - [ - 'china dress', - 5 - ], - [ - 'fundoshi', - 5 - ], - [ - 'hakama', - 5 - ], - [ - 'kimono', - 5 - ], - [ - 'yukata', - 5 - ], - [ - 'furisode', - 5 - ] -] - -socks = [ - ['socks', - 5], - [ - 'kneehighs', - 5 - ], - [ - 'over-kneehighs', - 5 - ], - [ - 'thighhighs', - 5 - ], - [ - 'pantyhose', - 5 - ], - [ - 'leggings', - 5 - ], - [ - 'leg warmers', - 5 - ], - [ - 'loose socks', - 5 - ] -] - -legwear = [ - ['fishnet legwear', - 5], - [ - 'bow legwear', - 5 - ], - [ - 'ribbed legwear', - 5 - ], - [ - 'seamed legwear', - 5 - ], - [ - 'see-through legwear', - 5 - ], - [ - 'shiny legwear', - 5 - ], - [ - 'toeless legwear', - 5 - ], - [ - 'fur-trimmed legwear', - 5 - ], - [ - 'lace-trimmed legwear', - 5 - ], - [ - 'uneven legwear', - 5 - ], - [ - 'mismatched legwear', - 5 - ] -] - -uppers = [ - ['blouse', - 5], - [ - 'frilled shirt', - 5 - ], - [ - 'sleeveless shirt', - 5 - ], - [ - 'bustier', - 5 - ], - [ - 'crop top', - 5 - ], - [ - 'camisole', - 5 - ], - [ - 'babydoll', - 5 - ], - [ - 'chemise', - 5 - ], - [ - 'nightgown', - 5 - ], - [ - 'cardigan', - 5 - ], - [ - 'cardigan vest', - 5 - ], - [ - 'coat', - 5 - ], - [ - 'duffel coat', - 5 - ], - [ - 'fur coat', - 5 - ], - [ - 'fur-trimmed coat', - 5 - ], - [ - 'long coat', - 5 - ], - [ - 'overcoat', - 5 - ], - [ - 'raincoat', - 5 - ], - [ - 'trench coat', - 5 - ], - [ - 'winter coat', - 5 - ], - [ - 'compression shirt', - 5 - ], - [ - 'halterneck', - 5 - ], - [ - 'criss-cross halter', - 5 - ], - [ - 'hoodie', - 5 - ], - [ - 'jacket', - 5 - ], - [ - 'blazer', - 5 - ], - [ - 'cropped jacket', - 5 - ], - [ - 'letterman jacket', - 5 - ], - [ - 'safari jacket', - 5 - ], - [ - 'suit jacket', - 5 - ], - [ - 'leather jacket', - 5 - ], - [ - 'poncho', - 5 - ], - [ - 'raglan sleeves', - 5 - ], - [ - 'shirt', - 5 - ], - [ - 'collared shirt', - 5 - ], - [ - 'dress shirt', - 5 - ], - [ - 'off-shoulder shirt', - 5 - ], - [ - 'sleeveless shirt', - 5 - ], - [ - 'striped shirt', - 5 - ], - [ - 't-shirt', - 5 - ], - [ - 'shrug (clothing)', - 5 - ], - [ - 'surcoat', - 5 - ], - [ - 'sweater', - 5 - ], - [ - 'turtleneck', - 5 - ], - [ - 'sleeveless turtleneck', - 5 - ], - [ - 'ribbed sweater', - 5 - ], - [ - 'aran sweater', - 5 - ], - [ - 'argyle sweater', - 5 - ], - [ - 'virgin killer sweater', - 5 - ], - [ - 'tabard', - 5 - ], - [ - 'tailcoat', - 5 - ], - [ - 'tank top', - 5 - ], - [ - 'tube top', - 5 - ], - [ - 'bandeau', - 5 - ], - [ - 'underbust', - 5 - ], - [ - 'vest', - 5 - ], - [ - 'sweater vest', - 5 - ], - [ - 'waistcoat', - 5 - ], - [ - 'sarashi', - 5 - ], - [ - 'tunic', - 5 - ], - [ - 'front-tie top', - 5 - ], - [ - 'breast curtains', - 5 - ], - [ - 'pasties', - 1 - ], - [ - 'heart pasties', - 1 - ] -] - -bottoms = [ - ['bloomers', - 5], - [ - 'buruma', - 5 - ], - [ - 'chaps', - 5 - ], - [ - 'kilt', - 5 - ], - [ - 'pants', - 5 - ], - [ - 'tight pants', - 5 - ], - [ - 'baggy pants', - 5 - ], - [ - 'bell-bottoms', - 5 - ], - [ - 'capri pants', - 5 - ], - [ - 'detached pants', - 5 - ], - [ - 'jeans', - 5 - ], - [ - 'lowleg pants', - 5 - ], - [ - 'pants rolled up', - 5 - ], - [ - 'yoga pants', - 5 - ], - [ - 'pelvic curtain', - 5 - ], - [ - 'petticoat', - 5 - ], - [ - 'shorts', - 5 - ], - [ - 'bike shorts', - 5 - ], - [ - 'denim shorts', - 5 - ], - [ - 'dolphin shorts', - 5 - ], - [ - 'gym shorts', - 5 - ], - [ - 'lowleg shorts', - 5 - ], - [ - 'micro shorts', - 5 - ], - [ - 'short shorts', - 5 - ], - [ - 'suspender shorts', - 5 - ], - [ - 'shorts under skirt', - 5 - ], - [ - 'skirt', - 5 - ], - [ - 'bubble skirt', - 5 - ], - [ - 'high-waist skirt', - 5 - ], - [ - 'long skirt', - 5 - ], - [ - 'lowleg skirt', - 5 - ], - [ - 'microskirt', - 5 - ], - [ - 'miniskirt', - 5 - ], - [ - 'overall skirt', - 5 - ], - [ - 'plaid skirt', - 5 - ], - [ - 'pleated skirt', - 5 - ], - [ - 'suspender skirt', - 5 - ], - [ - 'showgirl skirt', - 5 - ], - [ - 'sweatpants', - 5 - ] -] - -footwears = [ - ['boots', - 5], - [ - 'ankle boots', - 5 - ], - [ - 'armored boots', - 5 - ], - [ - 'cowboy boots', - 5 - ], - [ - 'knee boots', - 5 - ], - [ - 'high heel boots', - 5 - ], - [ - 'lace-up boots', - 5 - ], - [ - 'rubber boots', - 5 - ], - [ - 'thigh boots', - 5 - ], - [ - 'cross-laced footwear', - 5 - ], - [ - 'dress shoes', - 5 - ], - [ - 'flats', - 5 - ], - [ - 'high heels', - 5 - ], - [ - 'loafers', - 5 - ], - [ - 'mary janes', - 5 - ], - [ - 'platform footwear', - 5 - ], - [ - 'pointy footwear', - 5 - ], - [ - 'pumps', - 5 - ], - [ - 'sandals', - 5 - ], - [ - 'flip-flops', - 5 - ], - [ - 'geta', - 5 - ], - [ - 'gladiator sandals', - 5 - ], - [ - 'okobo', - 5 - ], - [ - 'zouri', - 5 - ], - [ - 'slippers', - 5 - ], - [ - 'animal slippers', - 5 - ], - [ - 'ballet slippers', - 5 - ], - [ - 'crocs', - 5 - ], - [ - 'uwabaki', - 5 - ], - [ - 'sneakers', - 5 - ], - [ - 'high tops', - 5 - ], - [ - 'converse', - 5 - ], - [ - 'toeless footwear', - 5 - ], - [ - 'wedge heels', - 5 - ] -] - -uniform = [ - ['armor', - 5], - [ - 'full armor', - 5 - ], - [ - 'power armor', - 5 - ], - [ - 'armored dress', - 5 - ], - [ - 'bikini armor', - 5 - ], - [ - 'band uniform', - 5 - ], - [ - 'cassock', - 5 - ], - [ - 'cheerleader', - 5 - ], - [ - 'ghost costume', - 5 - ], - [ - 'business suit', - 5 - ], - [ - 'pant suit', - 5 - ], - [ - 'skirt suit', - 5 - ], - [ - 'tuxedo', - 5 - ], - [ - 'gym uniform', - 5 - ], - [ - 'habit', - 5 - ], - [ - 'harem outfit', - 5 - ], - [ - 'hazmat suit', - 5 - ], - [ - 'animal costume', - 5 - ], - [ - 'maid', - 5 - ], - [ - 'unconventional maid', - 5 - ], - [ - 'miko', - 5 - ], - [ - 'military uniform', - 5 - ], - [ - 'overalls', - 5 - ], - [ - 'pajamas', - 5 - ], - [ - 'pilot suit', - 5 - ], - [ - 'sailor', - 5 - ], - [ - 'santa costume', - 5 - ], - [ - 'school uniform', - 5 - ], - [ - 'serafuku', - 5 - ], - [ - 'track suit', - 5 - ], - [ - 'tutu', - 5 - ], - [ - 'waitress', - 5 - ], - [ - 'cowboy western', - 5 - ], - [ - 'magical girl', - 5 - ], - [ - 'lab coat', - 5 - ], - [ - 'idol', - 5 - ], - [ - 'police', - 5 - ], - [ - 'race queen', - 5 - ], - [ - 'bride', - 5 - ], - [ - 'knight', - 5 - ], - [ - 'tomboy', - 5 - ], - [ - 'soccer uniform', - 5 - ], - [ - 'employee uniform', - 5 - ], - [ - 'dancer', - 5 - ], - [ - 'spacesuit', - 5 - ], - [ - 'idol', - 5 - ], - [ - 'gyaru', - 5 - ], - [ - 'kogal', - 5 - ], - [ - 'soldier', - 5 - ], - [ - 'pirate', - 5 - ], - [ - 'princess', - 5 - ], - [ - 'samurai', - 5 - ], - [ - 'priest', - 5 - ], - [ - 'nun', - 5 - ] -] - -athletic = [ - ['bikesuit', - 5], - [ - 'racing suit', - 5 - ], - [ - 'bodysuit', - 5 - ], - [ - 'jumpsuit', - 5 - ], - [ - 'short jumpsuit', - 5 - ], - [ - 'leotard', - 5 - ], - [ - 'strapless leotard', - 5 - ], - [ - 'thong leotard', - 5 - ], - [ - 'robe', - 5 - ], - [ - 'unitard', - 5 - ], - [ - 'springsuit', - 5 - ] -] - -swimsuits = [ - ['swimsuit', - 5], - [ - 'one-piece swimsuit', - 5 - ], - [ - 'casual one-piece swimsuit', - 5 - ], - [ - 'competition swimsuit', - 5 - ], - [ - 'slingshot swimsuit', - 5 - ], - [ - 'square bikini', - 5 - ], - [ - 'school swimsuit', - 5 - ], - [ - 'bikini', - 5 - ], - [ - 'string bikini', - 5 - ], - [ - 'micro bikini', - 5 - ], - [ - 'lowleg bikini', - 5 - ], - [ - 'thong bikini', - 5 - ], - [ - 'sports bikini', - 5 - ], - [ - 'swim briefs', - 5 - ], - [ - 'rash guard', - 5 - ], - [ - 'wetsuit', - 5 - ], - [ - 'front-tie bikini top', - 5 - ], - [ - 'o-ring bikini', - 5 - ], - [ - 'strapless bikini', - 5 - ], - [ - 'maid bikini', - 5 - ], - [ - 'swim trunks', - 5 - ] -] - -clothesAccessories = [ - ['apron', - 5], - [ - 'cape', - 5 - ], - [ - 'capelet', - 5 - ], - [ - 'hood', - 5 - ], - [ - 'bodystocking', - 5 - ], - [ - 'ascot', - 5 - ], - [ - 'bowtie', - 5 - ], - [ - 'choker', - 5 - ], - [ - 'collar', - 5 - ], - [ - 'epaulettes', - 5 - ], - [ - 'feather boa', - 5 - ], - [ - 'lapels', - 5 - ], - [ - 'neck ruff', - 5 - ], - [ - 'neckerchief', - 5 - ], - [ - 'necklace', - 5 - ], - [ - 'necktie', - 5 - ], - [ - 'neck ribbon', - 5 - ], - [ - 'scarf', - 5 - ], - [ - 'shawl', - 5 - ], - [ - 'anklet', - 5 - ], - [ - 'arm belt', - 5 - ], - [ - 'armband', - 5 - ], - [ - 'armlet', - 5 - ], - [ - 'bracelet', - 5 - ], - [ - 'bangle', - 5 - ], - [ - 'spiked bracelet', - 5 - ], - [ - 'bridal gauntlets', - 5 - ], - [ - 'detached sleeves', - 5 - ], - [ - 'arm warmers', - 5 - ], - [ - 'gloves', - 5 - ], - [ - 'fingerless gloves', - 5 - ], - [ - 'elbow gloves', - 5 - ], - [ - 'half gloves', - 5 - ], - [ - 'mittens', - 5 - ], - [ - 'leg belt', - 5 - ], - [ - 'ring', - 5 - ], - [ - 'thighlet', - 5 - ], - [ - 'wide sleeves', - 5 - ], - [ - 'wristband', - 5 - ], - [ - 'wrist cuffs', - 5 - ], - [ - 'cuffs', - 5 - ], - [ - 'wrist scrunchie', - 5 - ], - [ - 'badge', - 5 - ], - [ - 'belly chain', - 5 - ], - [ - 'belt', - 5 - ], - [ - 'brooch', - 5 - ], - [ - 'buttons', - 5 - ], - [ - 'collar chain', - 5 - ], - [ - 'corsage', - 5 - ], - [ - 'cuff links', - 5 - ], - [ - 'pentacle', - 5 - ], - [ - 'sarong', - 5 - ], - [ - 'sash', - 5 - ], - [ - 'suspenders', - 5 - ], - [ - 'tassel', - 5 - ], - [ - 'clothing cutout', - 5 - ], - [ - 'flower trim', - 5 - ], - [ - 'frills', - 5 - ], - [ - 'gold trim', - 5 - ], - [ - 'lace trim', - 5 - ], - [ - 'ribbon trim', - 5 - ], - [ - 'see-through', - 5 - ], - [ - 'silver trim', - 5 - ], - [ - 'torn clothes', - 5 - ], - [ - 'earrings', - 5 - ], - [ - 'hoop earrings', - 5 - ], - [ - 'stud earrings', - 5 - ], - [ - 'earclip', - 5 - ], - [ - 'glasses', - 5 - ], - [ - 'monocle', - 5 - ], - [ - 'hair ornament', - 5 - ], - [ - 'hair beads', - 5 - ], - [ - 'hair bobbles', - 5 - ], - [ - 'hairclip', - 5 - ], - [ - 'hairpin', - 5 - ], - [ - 'hair scrunchie', - 5 - ], - [ - 'hair stick', - 5 - ], - [ - 'mask', - 5 - ], - [ - 'surgical mask', - 5 - ], - [ - 'sleeves pushed up', - 5 - ], - [ - 'sleeves rolled up', - 5 - ], - [ - 'short sleeves', - 5 - ], - [ - 'long sleeves', - 5 - ], - [ - 'sleeves past wrists', - 5 - ], - [ - 'sleeves past fingers', - 5 - ], - [ - 'sleeves past elbows', - 5 - ], - [ - 'puffy sleeves', - 5 - ], - [ - 'sleeveless', - 5 - ], - [ - 'goggles', - 5 - ], - [ - 'sunglasses', - 5 - ], - [ - 'coke-bottle glasses', - 5 - ], - [ - 'opaque glasses', - 5 - ], - [ - 'safety glasses', - 5 - ], - [ - 'ski goggles', - 5 - ], - [ - 'bespectacled', - 5 - ], - [ - 'ear piercing', - 5 - ], - [ - 'eyebrow piercing', - 5 - ], - [ - 'lip piercing', - 5 - ], - [ - 'nose piercing', - 5 - ], - [ - 'tongue piercing', - 5 - ], - [ - 'navel piercing', - 5 - ], - [ - 'zipper', - 5 - ], - [ - 'zettai ryouiki', - 5 - ], - [ - 'wristwatch', - 5 - ], - [ - 'x hair ornament', - 5 - ], - [ - 'wing collar', - 5 - ], - [ - 'whisker markings', - 5 - ], - [ - 'wet', - 5 - ], - [ - 'weapon', - 5 - ], - [ - 'wand', - 5 - ], - [ - 'waist apron', - 5 - ], - [ - 'veins', - 5 - ], - [ - 'vambraces', - 5 - ], - [ - 'valentine', - 5 - ], - [ - 'underboob', - 5 - ], - [ - 'umbrella', - 5 - ], - [ - 'under-rim eyewear', - 5 - ], - [ - 'unbuttoned', - 5 - ], - [ - 'tray', - 5 - ], - [ - 'toenail polish', - 5 - ], - [ - 'tentacles', - 5 - ], - [ - 'tattoo', - 5 - ], - [ - 'tanlines', - 5 - ], - [ - 'swimsuit under clothes', - 5 - ], - [ - 'sweat', - 5 - ], - [ - 'striped', - 5 - ], - [ - 'strap slip', - 5 - ], - [ - 'star print', - 5 - ], - [ - 'spikes', - 5 - ], - [ - 'sideboob', - 5 - ], - [ - 'side slit', - 5 - ], - [ - 'shoulder armor', - 5 - ], - [ - 'shoulder bag', - 5 - ], - [ - 'shoulder cutout', - 5 - ], - [ - 'shoulder tattoo', - 5 - ], - [ - 'shirt tucked in', - 5 - ], - [ - 'shiny clothes', - 5 - ], - [ - 'sharp teeth', - 5 - ], - [ - 'sharp fingernails', - 5 - ], - [ - 'saliva', - 5 - ], - [ - 'pouch', - 5 - ], - [ - 'polka dot', - 5 - ], - [ - 'pom pom (clothes)', - 5 - ], - [ - 'pocket', - 5 - ], - [ - 'revealing clothes', - 5 - ], - [ - 'ribbon', - 5 - ], - [ - 'ribbon choker', - 5 - ], - [ - 'randoseru', - 5 - ], - [ - 'semi-rimless eyewear', - 5 - ], - [ - 'scrunchie', - 5 - ], - [ - 'school bag', - 5 - ], - [ - 'plaid', - 5 - ], - [ - 'pendant', - 5 - ], - [ - 'pauldrons', - 5 - ], - [ - 'partially unbuttoned', - 5 - ], - [ - 'paw gloves', - 5 - ], - [ - 'open clothes', - 5 - ], - [ - 'off shoulder', - 5 - ], - [ - 'o-ring top', - 5 - ], - [ - 'neck bell', - 5 - ], - [ - 'navel cutout', - 5 - ], - [ - 'mustache', - 5 - ], - [ - 'wings', - 5 - ], - [ - 'low wings', - 5 - ], - [ - 'lipstick', - 5 - ], - [ - 'leg ribbon', - 5 - ], - [ - 'leash', - 5 - ], - [ - 'lace', - 5 - ], - [ - 'knee pads', - 5 - ], - [ - 'kemonomimi mode', - 5 - ], - [ - 'juliet sleeves', - 5 - ], - [ - 'joints', - 5 - ], - [ - 'jewelry', - 5 - ], - [ - 'jacket on shoulders', - 5 - ], - [ - 'impossible clothes', - 5 - ], - [ - 'ice wings', - 5 - ], - [ - 'horns', - 5 - ], - [ - 'curled horns', - 5 - ], - [ - 'highleg', - 5 - ], - [ - 'high collar', - 5 - ], - [ - 'helmet', - 5 - ], - [ - 'mouth mask', - 5 - ], - [ - 'midriff peek', - 5 - ], - [ - 'midriff', - 5 - ], - [ - 'mechanical arms', - 5 - ], - [ - 'mask on head', - 5 - ], - [ - 'makeup', - 5 - ], - [ - 'long fingernails', - 5 - ], - [ - 'helmet', - 5 - ], - [ - 'halo', - 5 - ], - [ - 'hair tubes', - 5 - ], - [ - 'gauntlets', - 5 - ], - [ - 'garter straps', - 5 - ], - [ - 'fur trim', - 5 - ], - [ - 'floating hair', - 5 - ], - [ - 'fins', - 5 - ], - [ - 'fangs', - 5 - ], - [ - 'fang out', - 5 - ], - [ - 'facial mark', - 5 - ], - [ - 'facial hair', - 5 - ], - [ - 'eyeshadow', - 5 - ], - [ - 'eyes visible through hair', - 5 - ], - [ - 'eyepatch', - 5 - ], - [ - 'eyeliner', - 5 - ], - [ - 'eyelashes', - 5 - ], - [ - 'eyebrows', - 5 - ], - [ - 'eyewear on head', - 5 - ], - [ - 'earmuffs', - 5 - ], - [ - 'covered navel', - 5 - ], - [ - 'corset', - 5 - ], - [ - 'contemporary', - 5 - ], - [ - 'colored eyelashes', - 5 - ], - [ - 'cleavage cutout', - 5 - ], - [ - 'cleavage', - 5 - ], - [ - 'claws', - 5 - ], - [ - 'checkered clothes', - 5 - ], - [ - 'center opening', - 5 - ], - [ - 'center frills', - 5 - ], - [ - 'breasts apart', - 5 - ], - [ - 'breastplate', - 5 - ], - [ - 'breast pocket', - 5 - ], - [ - 'bracer', - 5 - ], - [ - 'blood on clothes', - 2 - ], - [ - 'blood on face', - 2 - ], - [ - 'blindfold', - 5 - ], - [ - 'bare shoulders', - 5 - ], - [ - 'bare arms', - 5 - ], - [ - 'bare legs', - 5 - ], - [ - 'bandaid on face', - 5 - ], - [ - 'bandaid', - 5 - ], - [ - 'bandages', - 5 - ], - [ - 'bandaged leg', - 5 - ], - [ - 'bandaged arm', - 5 - ], - [ - 'backpack', - 5 - ], - [ - 'backless outfit', - 5 - ], - [ - 'back bow', - 5 - ], - [ - 'ass visible through thighs', - 5 - ], - [ - 'ass focus', - 5 - ], - [ - 'armpits', - 5 - ], - [ - 'armpit crease', - 5 - ], - [ - 'arm tattoo', - 5 - ], - [ - 'animal print', - 5 - ], - [ - 'clothes around waist', - 5 - ], - [ - 'headphones around neck', - 5 - ], - [ - 'oversized clothes', - 5 - ], - [ - 'manly', - 5 - ], - [ - 'greaves', - 5 - ], - [ - 'one-eyed', - 5 - ], - [ - 'fur-trimmed sleeves', - 5 - ], - [ - 'polka dot bow', - 5 - ], - [ - 'harness', - 5 - ], - [ - 'forehead jewel', - 5 - ], - [ - 'single bare shoulder', - 5 - ], - [ - 'spiked collar', - 5 - ], - [ - 'striped necktie', - 5 - ], - [ - 'arm guards', - 5 - ], - [ - 'undershirt', - 5 - ], - [ - 'latex', - 5 - ], - [ - 'bandaid on leg', - 5 - ], - [ - 'bead necklace', - 5 - ], - [ - 'dirty', - 5 - ], - [ - 'motorcycle', - 5 - ], - [ - 'giantess', - 5 - ], - [ - 'cyborg', - 5 - ], - [ - 'bruise', - 5 - ], - [ - 'waist cape', - 5 - ], - [ - 'extra arms', - 5 - ], - [ - 'taut shirt', - 5 - ], - [ - 'chest jewel', - 5 - ], - [ - 'v-neck', - 5 - ], - [ - 'plaid scarf', - 5 - ], - [ - 'prosthesis', - 5 - ], - [ - 'single mechanical arm', - 5 - ], - [ - 'blood on hands', - 2 - ], - [ - 'bandaid on nose', - 5 - ], - [ - 'robot joints', - 5 - ], - [ - 'zombie', - 5 - ], - [ - 'tail ribbon', - 5 - ], - [ - 'tomboy', - 5 - ], - [ - 'panty peek', - 5 - ], - [ - 'leg tattoo', - 5 - ], - [ - 'lanyard', - 5 - ], - [ - 'bra visible through clothes', - 5 - ], - [ - 'amputee', - 5 - ], - [ - 'bra strap', - 5 - ], - [ - 'money', - 5 - ], - [ - 'revolver', - 5 - ], - [ - 'pearl necklace', - 5 - ], - [ - 'dimples of venus', - 5 - ], - [ - 'coat on shoulders', - 5 - ], - [ - 'chest harness', - 5 - ], - [ - 'slime (substance)', - 5 - ], - [ - 'partially unzipped', - 5 - ], - [ - 'bodypaint', - 5 - ], - [ - 'metal collar', - 5 - ], - [ - 'loose necktie', - 5 - ], - [ - 'clover', - 5 - ], - [ - 'body markings', - 5 - ], - [ - 'mechanical wings', - 5 - ], - [ - 'leaf print', - 5 - ], - [ - 'pentagram', - 5 - ], - [ - 'neon trim', - 5 - ], - [ - 'prosthetic arm', - 5 - ], - [ - 'bandage over one eye', - 5 - ], - [ - 'mascara', - 5 - ], - [ - 'cat ear headphones', - 5 - ], - [ - 'cuts', - 5 - ], - [ - 'jacket around waist', - 5 - ], - [ - 'bleeding', - 5 - ], - [ - 'rectangular eyewear', - 5 - ], - [ - 'chain necklace', - 5 - ], - [ - 'medal', - 5 - ], - [ - 'tie clip', - 5 - ], - [ - 'paw shoes', - 5 - ], - [ - 'feather trim', - 5 - ], - [ - 'gold chain', - 5 - ], - [ - 'mechanical parts', - 5 - ], - [ - 'seamed legwear', - 5 - ], - [ - 'mechanical legs', - 5 - ], - [ - 'eye mask', - 5 - ], - [ - 'scratches', - 5 - ], - [ - 'cross scar', - 5 - ], - [ - 'tusks', - 5 - ], - [ - 'dragon print', - 5 - ], - [ - 'sun symbol', - 5 - ], - [ - 'uneven sleeves', - 5 - ], - [ - 'energy wings', - 5 - ], - [ - 'cat print', - 5 - ], - [ - 'sweatband', - 5 - ], - [ - 'sweater around waist', - 5 - ], - [ - 'single vertical stripe', - 5 - ], - [ - 'glowing sword', - 5 - ], - [ - 'fanny pack', - 5 - ], - [ - 'blood stain', - 2 - ], - [ - 'single pauldron', - 5 - ], - [ - 'panty straps', - 5 - ], - [ - 'energy ball', - 5 - ], - [ - 'scepter', - 5 - ], - [ - 'cherry blossom print', - 5 - ], - [ - 'insect wings', - 5 - ], - [ - 'constellation print', - 5 - ], - [ - 'utility belt', - 5 - ], - [ - 'prosthetic leg', - 5 - ], - [ - 'very sweaty', - 5 - ], - [ - 'scales', - 5 - ], - [ - 'fake animal ears', - 5 - ] -] - -expression = [ - ['wince', - 5], - [ - 'wide-eyed', - 5 - ], - [ - 'tears', - 5 - ], - [ - 'triangle mouth', - 5 - ], - [ - 'trembling', - 5 - ], - [ - 'tongue out', - 5 - ], - [ - 'tearing up', - 5 - ], - [ - 'sweatdrop', - 5 - ], - [ - 'surprised', - 5 - ], - [ - 'spoken heart', - 5 - ], - [ - 'spoken question mark', - 5 - ], - [ - 'spoken heart', - 5 - ], - [ - 'spoken ellipsis', - 5 - ], - [ - 'smug', - 5 - ], - [ - 'smirk', - 5 - ], - [ - 'smile', - 5 - ], - [ - 'serious', - 5 - ], - [ - 'shaded face', - 5 - ], - [ - 'pout', - 5 - ], - [ - 'parted lips', - 5 - ], - [ - 'o_o', - 5 - ], - [ - 'notice lines', - 5 - ], - [ - 'nose blush', - 5 - ], - [ - 'naughty face', - 5 - ], - [ - 'light smile', - 5 - ], - [ - 'light blush', - 5 - ], - [ - 'licking lips', - 5 - ], - [ - 'laughing', - 5 - ], - [ - 'heavy breathing', - 5 - ], - [ - 'happy', - 5 - ], - [ - 'half-closed eyes', - 5 - ], - [ - 'grin', - 5 - ], - [ - 'frown', - 5 - ], - [ - 'flying sweatdrops', - 5 - ], - [ - 'expressionless', - 5 - ], - [ - 'evil smile', - 5 - ], - [ - 'embarrassed', - 5 - ], - [ - 'drunk', - 5 - ], - [ - 'crying with eyes open', - 5 - ], - [ - 'crying', - 5 - ], - [ - 'closed eyes', - 5 - ], - [ - 'clenched teeth', - 5 - ], - [ - 'chestnut mouth', - 5 - ], - [ - 'blush stickers', - 5 - ], - [ - 'blush', - 5 - ], - [ - 'angry', - 5 - ], - [ - 'anger vein', - 5 - ], - [ - 'ahegao', - 1 - ], - [ - '^_^', - 5 - ], - [ - '@_@', - 5 - ], - [ - '?', - 5 - ], - [ - '>:)', - 5 - ], - [ - '=_=', - 5 - ], - [ - ';d', - 5 - ], - [ - ';)', - 5 - ], - [ - ':t', - 5 - ], - [ - ':q', - 5 - ], - [ - ':p', - 5 - ], - [ - ':o', - 5 - ], - [ - ':d', - 5 - ], - [ - ':>', - 5 - ], - [ - ':<', - 5 - ], - [ - ':3', - 5 - ], - [ - '...', - 5 - ], - [ - '+_+', - 5 - ], - [ - '+++', - 5 - ], - [ - '!?', - 5 - ], - [ - '!', - 5 - ], - [ - 'annoyed', - 5 - ], - [ - 'spoken exclamation mark', - 5 - ], - [ - 'sad', - 5 - ], - [ - ':/', - 5 - ], - [ - '!!', - 5 - ], - [ - 'nervous', - 5 - ], - [ - '0_0', - 5 - ], - [ - ';o', - 5 - ], - [ - 'seductive smile', - 5 - ], - [ - 'zzz', - 5 - ], - [ - 'torogao', - 5 - ], - [ - 'd:', - 5 - ], - [ - 'sleepy', - 5 - ], - [ - 'ear blush', - 5 - ], - [ - 'nervous sweating', - 5 - ], - [ - '=3', - 5 - ], - [ - 'spoken musical note', - 5 - ], - [ - 'glaring', - 5 - ], - [ - ';p', - 5 - ], - [ - 'yandere', - 5 - ], - [ - 'shy', - 5 - ], - [ - 'streaming tears', - 5 - ], - [ - 'spoken blush', - 5 - ], - [ - '>:(', - 5 - ], - [ - 'evil grin', - 5 - ], - [ - 'nervous smile', - 5 - ], - [ - ';q', - 5 - ], - [ - 'spoken squiggle', - 5 - ], - [ - 'spoken interrobang', - 5 - ], - [ - 'thinking', - 5 - ], - [ - 'puckered lips', - 5 - ], - [ - 'screaming', - 5 - ], - [ - 'spoken anger vein', - 5 - ], - [ - 'dot mouth', - 5 - ], - [ - 'grimace', - 5 - ], - [ - ';3', - 5 - ], - [ - 'confused', - 5 - ], - [ - 'worried', - 5 - ], - [ - 'u_u', - 5 - ], - [ - 'raised eyebrows', - 5 - ] -] - -years = [ - [ - 'year 2005', - 1 - ], - [ - 'year 2006', - 1 - ], - [ - 'year 2007', - 1 - ], - [ - 'year 2008', - 1 - ], - [ - 'year 2009', - 1 - ], - [ - 'year 2010', - 1 - ], - [ - 'year 2011', - 1 - ], - [ - 'year 2012', - 2 - ], - [ - 'year 2013', - 3 - ], - [ - 'year 2014', - 4 - ], - [ - 'year 2015', - 5 - ], - [ - 'year 2016', - 6 - ], - [ - 'year 2017', - 7 - ], - [ - 'year 2018', - 8 - ], - [ - 'year 2018', - 9 - ], - [ - 'year 2019', - 10 - ], - [ - 'year 2020', - 20 - ], - [ - 'year 2021', - 30 - ], - [ - 'year 2022', - 40 - ], - [ - 'year 2023', - 50 - ] -] - -backgroundObjects = [ - ['wooden floor', - 5], - [ - 'window', - 5 - ], - [ - 'wine glass', - 5 - ], - [ - 'water drop', - 5 - ], - [ - 'water', - 5 - ], - [ - 'wall', - 5 - ], - [ - 'underwater', - 5 - ], - [ - 'torii', - 5 - ], - [ - 'tatami', - 5 - ], - [ - 'steam', - 5 - ], - [ - 'starry sky', - 5 - ], - [ - 'stairs', - 5 - ], - [ - 'space', - 5 - ], - [ - 'snow', - 5 - ], - [ - 'snowing', - 5 - ], - [ - 'smoke', - 5 - ], - [ - 'sky', - 5 - ], - [ - 'shadow', - 5 - ], - [ - 'shade', - 5 - ], - [ - 'sand', - 5 - ], - [ - 'road', - 5 - ], - [ - 'rigging', - 5 - ], - [ - 'reflection', - 5 - ], - [ - 'rain', - 5 - ], - [ - 'railing', - 5 - ], - [ - 'pool', - 5 - ], - [ - 'palm tree', - 5 - ], - [ - 'outdoors', - 5 - ], - [ - 'onsen', - 5 - ], - [ - 'ocean', - 5 - ], - [ - 'night sky', - 5 - ], - [ - 'night', - 5 - ], - [ - 'nature', - 5 - ], - [ - 'moon', - 5 - ], - [ - 'mountain', - 5 - ], - [ - 'indoors', - 5 - ], - [ - 'horizon', - 5 - ], - [ - 'grass', - 5 - ], - [ - 'full moon', - 5 - ], - [ - 'frog', - 5 - ], - [ - 'forest', - 5 - ], - [ - 'field', - 5 - ], - [ - 'fence', - 5 - ], - [ - 'desk', - 5 - ], - [ - 'day', - 5 - ], - [ - 'curtains', - 5 - ], - [ - 'couch', - 5 - ], - [ - 'cloudy sky', - 5 - ], - [ - 'cloud', - 5 - ], - [ - 'classroom', - 5 - ], - [ - 'cityscape', - 5 - ], - [ - 'city', - 5 - ], - [ - 'car', - 5 - ], - [ - 'bush', - 5 - ], - [ - 'building', - 5 - ], - [ - 'bookshelf', - 5 - ], - [ - 'bedroom', - 5 - ], - [ - 'bed', - 5 - ], - [ - 'beach', - 5 - ], - [ - 'bath', - 5 - ], - [ - 'vines', - 5 - ], - [ - 'bamboo', - 5 - ], - [ - 'house', - 5 - ], - [ - 'ruins', - 5 - ], - [ - 'crescent moon', - 5 - ], - [ - 'sliding doors', - 5 - ], - [ - 'brick wall', - 5 - ], - [ - 'east asian architecture', - 5 - ], - [ - 'futon', - 5 - ], - [ - 'bridge', - 5 - ], - [ - 'planet', - 5 - ], - [ - 'shelf', - 5 - ], - [ - 'bare tree', - 5 - ], - [ - 'street', - 5 - ], - [ - 'river', - 5 - ], - [ - 'castle', - 5 - ], - [ - 'flower field', - 5 - ], - [ - 'skyscraper', - 5 - ], - [ - 'utility pole', - 5 - ], - [ - 'train interior', - 5 - ], - [ - 'evening', - 5 - ], - [ - 'mountainous horizon', - 5 - ], - [ - 'waves', - 5 - ], - [ - 'crowd', - 5 - ], - [ - 'kitchen', - 5 - ], - [ - 'tower', - 5 - ], - [ - 'waterfall', - 5 - ], - [ - 'library', - 5 - ], - [ - 'puddle', - 5 - ], - [ - 'shop', - 5 - ], - [ - 'lake', - 5 - ], - [ - 'fog', - 5 - ], - [ - 'shrine', - 5 - ], - [ - 'red moon', - 5 - ], - [ - 'rooftop', - 5 - ], - [ - 'shore', - 5 - ], - [ - 'floor', - 5 - ], - [ - 'contrail', - 5 - ], - [ - 'shooting star', - 5 - ], - [ - 'ceiling', - 5 - ], - [ - 'city lights', - 5 - ], - [ - 'bamboo forest', - 5 - ], - [ - 'hallway', - 5 - ], - [ - 'moonlight', - 5 - ], - [ - 'locker room', - 5 - ], - [ - 'dusk', - 5 - ], - [ - 'sink', - 5 - ], - [ - 'tombstone', - 5 - ], - [ - 'hill', - 5 - ], - [ - 'sunrise', - 5 - ], - [ - 'restaurant', - 5 - ], - [ - 'moss', - 5 - ], - [ - 'church', - 5 - ], - [ - 'town', - 5 - ], - [ - 'cave', - 5 - ], - [ - 'festival', - 5 - ], - [ - 'veranda', - 5 - ], - [ - 'reflective floor', - 5 - ], - [ - 'alley', - 5 - ], - [ - 'pond', - 5 - ], - [ - 'tree', - 5 - ], - [ - 'overgrown', - 5 - ] -] - -accessories = [ - ['strawberry', - 5], - [ - 'teddy bear', - 5 - ], - [ - 'teacup', - 5 - ], - [ - 'teapot', - 5 - ], - [ - 'spoon', - 5 - ], - [ - 'smartphone', - 5 - ], - [ - 'skull', - 5 - ], - [ - 'shield', - 5 - ], - [ - 'sheath', - 5 - ], - [ - 'school desk', - 5 - ], - [ - 'scythe', - 5 - ], - [ - 'sack', - 5 - ], - [ - 'rose', - 5 - ], - [ - 'rope', - 5 - ], - [ - 'rock', - 5 - ], - [ - 'rifle', - 5 - ], - [ - 'pumpkin', - 5 - ], - [ - 'potted plant', - 5 - ], - [ - 'popsicle', - 5 - ], - [ - 'polearm', - 5 - ], - [ - 'pocky', - 5 - ], - [ - 'plate', - 5 - ], - [ - 'plant', - 5 - ], - [ - 'pen', - 5 - ], - [ - 'phone', - 5 - ], - [ - 'peach', - 5 - ], - [ - 'parasol', - 5 - ], - [ - 'open book', - 5 - ], - [ - 'ofuda', - 5 - ], - [ - 'mug', - 5 - ], - [ - 'motor vehicle', - 5 - ], - [ - 'mecha', - 5 - ], - [ - 'machinery', - 5 - ], - [ - 'lollipop', - 5 - ], - [ - 'leaf', - 5 - ], - [ - 'lantern', - 5 - ], - [ - 'lamp', - 5 - ], - [ - 'knife', - 5 - ], - [ - 'key', - 5 - ], - [ - 'katana', - 5 - ], - [ - 'jack-o\'-lantern', - 5 - ], - [ - 'instrument', - 5 - ], - [ - 'innertube', - 5 - ], - [ - 'id card', - 5 - ], - [ - 'ice cream', - 5 - ], - [ - 'hibiscus', - 5 - ], - [ - 'headset', - 5 - ], - [ - 'headphones', - 5 - ], - [ - 'handgun', - 5 - ], - [ - 'handbag', - 5 - ], - [ - 'hand fan', - 5 - ], - [ - 'gun', - 5 - ], - [ - 'guitar', - 5 - ], - [ - 'gift', - 5 - ], - [ - 'gift box', - 5 - ], - [ - 'ghost', - 5 - ], - [ - 'gem', - 5 - ], - [ - 'fruit', - 5 - ], - [ - 'fork', - 5 - ], - [ - 'food', - 5 - ], - [ - 'folding fan', - 5 - ], - [ - 'flower', - 5 - ], - [ - 'fish', - 5 - ], - [ - 'doll', - 5 - ], - [ - 'disposable cup', - 5 - ], - [ - 'dagger', - 5 - ], - [ - 'cup', - 5 - ], - [ - 'cross', - 5 - ], - [ - 'controller', - 5 - ], - [ - 'computer', - 5 - ], - [ - 'cigarette', - 5 - ], - [ - 'chopsticks', - 5 - ], - [ - 'chocolate', - 5 - ], - [ - 'chair', - 5 - ], - [ - 'chain', - 5 - ], - [ - 'cellphone', - 5 - ], - [ - 'carrot', - 5 - ], - [ - 'cannon', - 5 - ], - [ - 'candy', - 5 - ], - [ - 'candle', - 5 - ], - [ - 'can', - 5 - ], - [ - 'camera', - 5 - ], - [ - 'cake', - 5 - ], - [ - 'butterfly', - 5 - ], - [ - 'bucket', - 5 - ], - [ - 'broom', - 5 - ], - [ - 'branch', - 5 - ], - [ - 'box', - 5 - ], - [ - 'bowl', - 5 - ], - [ - 'bouquet', - 5 - ], - [ - 'bottle', - 5 - ], - [ - 'book', - 5 - ], - [ - 'blanket', - 5 - ], - [ - 'bird', - 5 - ], - [ - 'bench', - 5 - ], - [ - 'bell', - 5 - ], - [ - 'bed sheet', - 5 - ], - [ - 'beads', - 5 - ], - [ - 'beachball', - 5 - ], - [ - 'basket', - 5 - ], - [ - 'balloon', - 5 - ], - [ - 'ball', - 5 - ], - [ - 'axe', - 5 - ], - [ - 'assault rifle', - 5 - ], - [ - 'apple', - 5 - ], - [ - 'alcohol', - 5 - ], - [ - 'paintbrush', - 5 - ], - [ - 'tea', - 5 - ], - [ - 'black cat', - 5 - ], - [ - 'maple leaf', - 5 - ], - [ - 'mushroom', - 5 - ], - [ - 'television', - 5 - ], - [ - 'handcuffs', - 5 - ], - [ - 'doughnut', - 5 - ], - [ - 'water bottle', - 5 - ], - [ - 'bread', - 5 - ], - [ - 'pink rose', - 5 - ], - [ - 'monitor', - 5 - ], - [ - 'handheld game console', - 5 - ], - [ - 'huge weapon', - 5 - ], - [ - 'earphones', - 5 - ], - [ - 'tank', - 5 - ], - [ - 'stool', - 5 - ], - [ - 'smoking pipe', - 5 - ], - [ - 'cookie', - 5 - ], - [ - 'chalkboard', - 5 - ], - [ - 'coin', - 5 - ], - [ - 'syringe', - 5 - ], - [ - 'christmas tree', - 5 - ], - [ - 'rice', - 5 - ], - [ - 'bathtub', - 5 - ], - [ - 'beer', - 5 - ], - [ - 'lamppost', - 5 - ], - [ - 'egg', - 5 - ], - [ - 'cherry', - 5 - ], - [ - 'cushion', - 5 - ], - [ - 'scissors', - 5 - ], - [ - 'horse', - 5 - ], - [ - 'shell', - 5 - ], - [ - 'sake', - 5 - ], - [ - 'burger', - 5 - ], - [ - 'coffee', - 5 - ], - [ - 'clipboard', - 5 - ], - [ - 'skeleton', - 5 - ], - [ - 'electric guitar', - 5 - ], - [ - 'cardboard box', - 5 - ], - [ - 'lily (flower)', - 5 - ], - [ - 'pillar', - 5 - ], - [ - 'book stack', - 5 - ], - [ - 'wine', - 5 - ], - [ - 'mouse', - 5 - ], - [ - 'laptop', - 5 - ], - [ - 'kotatsu', - 5 - ], - [ - 'shopping bag', - 5 - ], - [ - 'whip', - 5 - ], - [ - 'dango', - 5 - ], - [ - 'grapes', - 5 - ], - [ - 'water gun', - 5 - ], - [ - 'paper lantern', - 5 - ], - [ - 'vase', - 5 - ], - [ - 'whistle', - 5 - ], - [ - 'noodles', - 5 - ], - [ - 'microphone stand', - 5 - ], - [ - 'bicycle', - 5 - ], - [ - 'notebook', - 5 - ], - [ - 'hydrangea', - 5 - ], - [ - 'suitcase', - 5 - ], - [ - 'ship', - 5 - ], - [ - 'bone', - 5 - ], - [ - 'ice cream cone', - 5 - ], - [ - 'elbow pads', - 5 - ], - [ - 'heart-shaped chocolate', - 5 - ], - [ - 'lance', - 5 - ], - [ - 'cane', - 5 - ], - [ - 'ladle', - 5 - ], - [ - 'orange (fruit)', - 5 - ], - [ - 'spring onion', - 5 - ], - [ - 'statue', - 5 - ], - [ - 'locker', - 5 - ], - [ - 'gears', - 5 - ], - [ - 'crab', - 5 - ], - [ - 'wine bottle', - 5 - ], - [ - 'gourd', - 5 - ], - [ - 'starfish', - 5 - ], - [ - 'coffee mug', - 5 - ], - [ - 'machine gun', - 5 - ], - [ - 'trident', - 5 - ], - [ - 'lock', - 5 - ], - [ - 'crow', - 5 - ], - [ - 'boat', - 5 - ], - [ - 'road sign', - 5 - ], - [ - 'stick', - 5 - ], - [ - 'armchair', - 5 - ], - [ - 'frilled pillow', - 5 - ], - [ - 'tissue box', - 5 - ], - [ - 'jar', - 5 - ], - [ - 'mandarin orange', - 5 - ], - [ - 'keyboard (computer)', - 5 - ], - [ - 'thorns', - 5 - ], - [ - 'office chair', - 5 - ], - [ - 'scope', - 5 - ], - [ - 'pot', - 5 - ], - [ - 'pole', - 5 - ], - [ - 'food print', - 5 - ], - [ - 'test tube', - 5 - ], - [ - 'spider web', - 5 - ], - [ - 'rapier', - 5 - ], - [ - 'envelope', - 5 - ], - [ - 'banana', - 5 - ], - [ - 'lemon', - 5 - ], - [ - 'shotgun', - 5 - ], - [ - 'energy sword', - 5 - ], - [ - 'pizza', - 5 - ], - [ - 'digital media player', - 5 - ], - [ - 'tomato', - 5 - ], - [ - 'rubber duck', - 5 - ], - [ - 'candy apple', - 5 - ], - [ - 'baozi', - 5 - ], - [ - 'lily pad', - 5 - ], - [ - 'pancake', - 5 - ], - [ - 'soda can', - 5 - ], - [ - 'vegetable', - 5 - ], - [ - 'trash can', - 5 - ], - [ - 'frying pan', - 5 - ], - [ - 'lotus', - 5 - ], - [ - 'four-leaf clover', - 5 - ], - [ - 'plum blossoms', - 5 - ], - [ - 'electric fan', - 5 - ], - [ - 'puppet', - 5 - ], - [ - 'ramen', - 5 - ], - [ - 'bento', - 5 - ], - [ - 'candy cane', - 5 - ], - [ - 'stethoscope', - 5 - ], - [ - 'seashell', - 5 - ], - [ - 'plastic bag', - 5 - ], - [ - 'bass guitar', - 5 - ], - [ - 'flower pot', - 5 - ], - [ - 'pudding', - 5 - ], - [ - 'flask', - 5 - ], - [ - 'soccer ball', - 5 - ], - [ - 'duffel bag', - 5 - ], - [ - 'cigar', - 5 - ], - [ - 'beach towel', - 5 - ], - [ - 'shaved ice', - 5 - ], - [ - 'mallet', - 5 - ], - [ - 'turtle shell', - 5 - ], - [ - 'glowstick', - 5 - ], - [ - 'coffee cup', - 5 - ], - [ - 'drumsticks', - 5 - ], - [ - 'jellyfish', - 5 - ], - [ - 'volleyball', - 5 - ], - [ - 'sweets', - 5 - ], - [ - 'swirl lollipop', - 5 - ], - [ - 'pastry', - 5 - ], - [ - 'omelet', - 5 - ], - [ - 'curry', - 5 - ], - [ - 'milk bottle', - 5 - ], - [ - 'dessert', - 5 - ], - [ - 'black rose', - 5 - ], - [ - 'satchel', - 5 - ], - [ - 'torch', - 5 - ], - [ - 'transparent umbrella', - 5 - ], - [ - 'surfboard', - 5 - ], - [ - 'prayer beads', - 5 - ], - [ - 'potato chips', - 5 - ], - [ - 'racket', - 5 - ], - [ - 'turtle', - 5 - ], - [ - 'briefcase', - 5 - ], - [ - 'baseball', - 5 - ], - [ - 'wooden bucket', - 5 - ], - [ - 'crepe', - 5 - ], - [ - 'barrel', - 5 - ], - [ - 'ramune', - 5 - ], - [ - 'tulip', - 5 - ], - [ - 'cat teaser', - 5 - ], - [ - 'baseball mitt', - 5 - ], - [ - 'desk lamp', - 5 - ] -] - -action = [ - ['waving', - 5], - [ - 'wariza', - 5 - ], - [ - 'walking', - 5 - ], - [ - 'wading', - 5 - ], - [ - 'w', - 5 - ], - [ - 'top-down bottom-up', - 5 - ], - [ - 'thought bubble', - 5 - ], - [ - 'talking', - 5 - ], - [ - 'stretching', - 5 - ], - [ - 'straddling', - 5 - ], - [ - 'standing on one leg', - 5 - ], - [ - 'standing', - 5 - ], - [ - 'spread legs', - 5 - ], - [ - 'spread arms', - 5 - ], - [ - 'skirt hold', - 5 - ], - [ - 'sitting', - 5 - ], - [ - 'shirt lift', - 5 - ], - [ - 'selfie', - 5 - ], - [ - 'salute', - 5 - ], - [ - 'riding', - 5 - ], - [ - 'restrained', - 5 - ], - [ - 'reading', - 5 - ], - [ - 'reaching towards viewer', - 5 - ], - [ - 'reaching', - 5 - ], - [ - 'pulled by self', - 5 - ], - [ - 'pose', - 5 - ], - [ - 'peace sign', - 5 - ], - [ - 'paw pose', - 5 - ], - [ - 'own hands together', - 5 - ], - [ - 'own hands clasped', - 5 - ], - [ - 'outstretched hand', - 5 - ], - [ - 'outstretched arms', - 5 - ], - [ - 'open hand', - 5 - ], - [ - 'on back', - 5 - ], - [ - 'on bed', - 5 - ], - [ - 'on chair', - 5 - ], - [ - 'on couch', - 5 - ], - [ - 'on floor', - 5 - ], - [ - 'on one knee', - 5 - ], - [ - 'on side', - 5 - ], - [ - 'on stomach', - 5 - ], - [ - 'lying', - 5 - ], - [ - 'looking up', - 5 - ], - [ - 'looking to the side', - 5 - ], - [ - 'looking down', - 5 - ], - [ - 'looking back', - 5 - ], - [ - 'looking away', - 5 - ], - [ - 'looking at viewer', - 5 - ], - [ - 'looking ahead', - 5 - ], - [ - 'looking afar', - 5 - ], - [ - 'lifted by self', - 5 - ], - [ - 'licking', - 5 - ], - [ - 'legs up', - 5 - ], - [ - 'legs together', - 5 - ], - [ - 'legs apart', - 5 - ], - [ - 'leg up', - 5 - ], - [ - 'leg lift', - 5 - ], - [ - 'leaning forward', - 5 - ], - [ - 'leaning back', - 5 - ], - [ - 'knees up', - 5 - ], - [ - 'knees together feet apart', - 5 - ], - [ - 'kneeling', - 5 - ], - [ - 'jumping', - 5 - ], - [ - 'indian style', - 5 - ], - [ - 'index finger raised', - 5 - ], - [ - 'hugging own legs', - 5 - ], - [ - 'hugging object', - 5 - ], - [ - 'heart hands', - 5 - ], - [ - 'headpat', - 5 - ], - [ - 'hands up', - 5 - ], - [ - 'hands on own hips', - 5 - ], - [ - 'hands on own face', - 5 - ], - [ - 'hands on own chest', - 5 - ], - [ - 'hands in pockets', - 5 - ], - [ - 'hand up', - 5 - ], - [ - 'hand to own mouth', - 5 - ], - [ - 'hand on own hip', - 5 - ], - [ - 'hand on own head', - 5 - ], - [ - 'hand on own chin', - 5 - ], - [ - 'hand on own chest', - 5 - ], - [ - 'hand on own cheek', - 5 - ], - [ - 'hand in pocket', - 5 - ], - [ - 'hand between legs', - 5 - ], - [ - 'finger to mouth', - 5 - ], - [ - 'fighting stance', - 5 - ], - [ - 'facing viewer', - 5 - ], - [ - 'facing away', - 5 - ], - [ - 'eating', - 5 - ], - [ - 'drinking', - 5 - ], - [ - 'double peace', - 5 - ], - [ - 'dancing', - 5 - ], - [ - 'crossed legs', - 5 - ], - [ - 'crossed arms', - 5 - ], - [ - 'covering mouth', - 5 - ], - [ - 'covering breasts', - 5 - ], - [ - 'covering', - 5 - ], - [ - 'contrapposto', - 5 - ], - [ - 'clothes pull', - 5 - ], - [ - 'clenched hands', - 5 - ], - [ - 'clenched hand', - 5 - ], - [ - 'claw pose', - 5 - ], - [ - 'carrying', - 5 - ], - [ - 'breasts squeezed together', - 5 - ], - [ - 'bent over', - 5 - ], - [ - 'arms up', - 5 - ], - [ - 'arms behind head', - 5 - ], - [ - 'arms behind back', - 5 - ], - [ - 'arms at sides', - 5 - ], - [ - 'arm up', - 5 - ], - [ - 'arm support', - 5 - ], - [ - 'arm grab', - 5 - ], - [ - 'arm behind head', - 5 - ], - [ - 'arm behind back', - 5 - ], - [ - 'arm at side', - 5 - ], - [ - 'arched back', - 5 - ], - [ - 'all fours', - 5 - ], - [ - 'against wall', - 5 - ], - [ - 'adjusting hair', - 5 - ], - [ - 'adjusting eyewear', - 5 - ], - [ - 'arm under breasts', - 5 - ], - [ - 'holding hair', - 5 - ], - [ - 'on ground', - 5 - ], - [ - 'pigeon-toed', - 5 - ], - [ - 'thumbs up', - 5 - ], - [ - 'kicking', - 5 - ], - [ - 'invisible chair', - 5 - ], - [ - 'hand on own thigh', - 5 - ], - [ - 'tiptoes', - 5 - ], - [ - 'singing', - 5 - ], - [ - 'falling', - 5 - ], - [ - 'hand on own knee', - 5 - ], - [ - 'holding gift', - 5 - ], - [ - 'playing instrument', - 5 - ], - [ - 'holding stuffed toy', - 5 - ], - [ - 'pointing at viewer', - 5 - ], - [ - 'broom riding', - 5 - ], - [ - 'leaning to the side', - 5 - ], - [ - 'tying hair', - 5 - ], - [ - 'shouting', - 5 - ], - [ - 'reclining', - 5 - ], - [ - 'pillow hug', - 5 - ], - [ - 'punching', - 5 - ], - [ - 'yawning', - 5 - ], - [ - '\\m/', - 5 - ], - [ - 'hand on own stomach', - 5 - ], - [ - 'hands on own cheeks', - 5 - ], - [ - 'hand on own ass', - 5 - ], - [ - 'covering face', - 5 - ], - [ - 'firing', - 5 - ], - [ - 'strap pull', - 5 - ], - [ - 'shushing', - 5 - ], - [ - 'breast suppress', - 5 - ], - [ - 'peeking out', - 5 - ], - [ - 'squatting', - 5 - ], - [ - 'feet up', - 5 - ], - [ - 'open hands', - 5 - ], - [ - 'waking up', - 5 - ], - [ - 'hands on own knees', - 5 - ], - [ - 'breast lift', - 5 - ], - [ - 'hands in hair', - 5 - ], - [ - 'peace sign, v over eye', - 5 - ], - [ - 'pointing at self', - 5 - ], - [ - 'pointing up', - 5 - ], - [ - 'against glass', - 5 - ], - [ - 'holding own arm', - 5 - ], - [ - 'elbow rest', - 5 - ], - [ - 'steepled fingers', - 5 - ], - [ - 'hand on own arm', - 5 - ], - [ - 'hair tucking', - 5 - ], - [ - 'staring', - 5 - ], - [ - 'fingers together', - 5 - ], - [ - 'arms under breasts', - 5 - ], - [ - 'clothes grab', - 5 - ], - [ - 'exercise', - 5 - ], - [ - 'shirt tug', - 5 - ], - [ - 'finger to cheek', - 5 - ], - [ - 'covering own eyes', - 5 - ], - [ - 'come hither', - 5 - ], - [ - 'rubbing eyes', - 5 - ], - [ - 'praying', - 5 - ], - [ - 'zombie pose', - 5 - ], - [ - 'holding sign', - 5 - ], - [ - 'looking at phone', - 5 - ], - [ - 'fleeing', - 5 - ], - [ - 'ok sign', - 5 - ], - [ - 'playing with own hair', - 5 - ], - [ - 'hands on lap', - 5 - ], - [ - 'finger to own chin', - 5 - ], - [ - 'hands on own thighs', - 5 - ], - [ - 'confession', - 5 - ], - [ - 'wiping tears', - 5 - ], - [ - 'sleeping', - 5 - ] -] - -effects = [ - ['sparkle', - 5], - [ - 'snowflakes', - 5 - ], - [ - 'petals', - 5 - ], - [ - 'paw print', - 5 - ], - [ - 'musical note', - 5 - ], - [ - 'motion lines', - 5 - ], - [ - 'magic', - 5 - ], - [ - 'light rays', - 5 - ], - [ - 'light particles', - 5 - ], - [ - 'lens flare', - 5 - ], - [ - 'ice', - 5 - ], - [ - 'glowing', - 5 - ], - [ - 'glint', - 5 - ], - [ - 'fire', - 5 - ], - [ - 'fantasy', - 5 - ], - [ - 'falling petals', - 5 - ], - [ - 'emphasis lines', - 5 - ], - [ - 'electricity', - 5 - ], - [ - 'eighth note', - 5 - ], - [ - 'depth of field', - 5 - ], - [ - 'crystal', - 5 - ], - [ - 'crescent', - 5 - ], - [ - 'confetti', - 5 - ], - [ - 'chromatic aberration', - 5 - ], - [ - 'christmas', - 5 - ], - [ - 'chibi', - 5 - ], - [ - 'cherry blossoms', - 5 - ], - [ - 'bubble', - 5 - ], - [ - 'blurry background', - 5 - ], - [ - 'blurry foreground', - 5 - ], - [ - 'autumn leaves', - 5 - ], - [ - 'air bubble', - 5 - ], - [ - 'aura', - 5 - ], - [ - 'halftone', - 5 - ], - [ - 'explosion', - 5 - ], - [ - 'summer', - 5 - ], - [ - 'sunbeam', - 5 - ], - [ - 'magic circle', - 5 - ], - [ - 'fireworks', - 5 - ], - [ - 'winter', - 5 - ], - [ - 'partially colored', - 5 - ], - [ - 'ripples', - 5 - ], - [ - 'rainbow', - 5 - ], - [ - 'sepia', - 5 - ], - [ - 'blood splatter', - 2 - ], - [ - 'autumn', - 5 - ], - [ - 'spring (season)', - 5 - ], - [ - 'rose petals', - 5 - ], - [ - 'danmaku', - 5 - ], - [ - 'shiny', - 5 - ], - [ - 'lightning', - 5 - ], - [ - 'blue fire', - 5 - ], - [ - 'falling leaves', - 5 - ], - [ - 'muted color', - 5 - ], - [ - 'soap bubbles', - 5 - ], - [ - 'horror (theme)', - 5 - ], - [ - 'colorful', - 5 - ], - [ - 'viewfinder', - 5 - ], - [ - 'constellation', - 5 - ], - [ - 'egyptian', - 5 - ], - [ - 'surreal', - 5 - ], - [ - 'darkness', - 5 - ], - [ - 'paint splatter', - 5 - ], - [ - 'lolita fashion', - 5 - ], - [ - 'bloom', - 5 - ], - [ - 'abstract', - 5 - ], - [ - 'embers', - 5 - ], - [ - 'corruption', - 5 - ], - [ - 'sunburst', - 5 - ], - [ - 'stage lights', - 5 - ], - [ - 'fashion', - 5 - ], - [ - 'trick or treat', - 5 - ], - [ - 'fluffy', - 5 - ], - [ - 'symmetry', - 5 - ], - [ - 'reflective water', - 5 - ], - [ - 'glitch', - 5 - ], - [ - 'border', - 5 - ], - [ - 'framed', - 5 - ], - [ - 'character image', - 5 - ], - [ - '3d', - 5 - ], - [ - 'lineart', - 5 - ], - [ - 'no lineart', - 5 - ], - [ - 'outline', - 5 - ], - [ - 'pixel art', - 5 - ], - [ - 'oekaki', - 5 - ], - [ - 'anime screencap', - 5 - ], - [ - 'game screenshot', - 5 - ], - [ - 'game cg', - 5 - ], - [ - 'fake screenshot', - 5 - ], - [ - 'drop shadow', - 5 - ], - [ - 'cut-in', - 5 - ], - [ - 'gradient', - 5 - ], - [ - 'film grain', - 5 - ], - [ - 'caustics', - 5 - ], - [ - 'bokeh', - 5 - ], - [ - 'bloom', - 5 - ], - [ - 'backlighting', - 5 - ], - [ - 'dithering', - 5 - ], - [ - 'halftone', - 5 - ], - [ - 'lens flare', - 5 - ], - [ - 'monochrome', - 5 - ], - [ - 'multiple monochrome', - 5 - ], - [ - 'silhouette', - 5 - ], - [ - 'vignetting', - 5 - ], - [ - 'chromatic aberration', - 5 - ], - [ - 'art deco', - 5 - ], - [ - 'art nouveau', - 5 - ], - [ - 'science fiction', - 5 - ], - [ - 'steampunk', - 5 - ], - [ - 'cyberpunk', - 5 - ], - [ - 'western', - 5 - ], - [ - 'sunlight', - 5 - ], - [ - 'wind', - 5 - ], - [ - 'squiggle', - 5 - ], - [ - 'limited palette', - 5 - ], - [ - 'overgrown', - 5 - ], - [ - 'cosmic horror', - 5 - ], - [ - 'halloween', - 5 - ], - [ - 'grass', - 5 - ], - [ - 'blood', - 2 - ] -] - -eyeColors = [ - ['aqua eyes', - 5], - [ - 'black eyes', - 5 - ], - [ - 'blue eyes', - 5 - ], - [ - 'brown eyes', - 5 - ], - [ - 'green eyes', - 5 - ], - [ - 'grey eyes', - 5 - ], - [ - 'orange eyes', - 5 - ], - [ - 'purple eyes', - 5 - ], - [ - 'pink eyes', - 5 - ], - [ - 'red eyes', - 5 - ], - [ - 'white eyes', - 5 - ], - [ - 'yellow eyes', - 5 - ], - [ - 'amber eyes', - 5 - ] -] - -hairColors = [ - ['aqua hair', - 5], - [ - 'black hair', - 5 - ], - [ - 'blonde hair', - 5 - ], - [ - 'blue hair', - 5 - ], - [ - 'light blue hair', - 5 - ], - [ - 'dark blue hair', - 5 - ], - [ - 'brown hair', - 5 - ], - [ - 'light brown hair', - 5 - ], - [ - 'green hair', - 5 - ], - [ - 'dark green hair', - 5 - ], - [ - 'light green hair', - 5 - ], - [ - 'grey hair', - 5 - ], - [ - 'orange hair', - 5 - ], - [ - 'pink hair', - 5 - ], - [ - 'purple hair', - 5 - ], - [ - 'light purple hair', - 5 - ], - [ - 'red hair', - 5 - ], - [ - 'white hair', - 5 - ] -] - -hairColorExtra = [ - [ - 'multicolored hair', - 5], - [ - 'colored inner hair', - 5 - ], - [ - 'gradient hair', - 10 - ], - [ - 'rainbow hair', - 5 - ], - [ - 'split-color hair', - 2 - ], - [ - 'streaked hair', - 5 - ], - [ - 'two-tone hair', - 5 - ] -] - -color = [ - ['aqua', - 5], - [ - 'black', - 5 - ], - [ - 'blue', - 5 - ], - [ - 'brown', - 5 - ], - [ - 'grey', - 5 - ], - [ - 'orange', - 5 - ], - [ - 'pink', - 5 - ], - [ - 'purple', - 5 - ], - [ - 'red', - 5 - ], - [ - 'white', - 5 - ], - [ - 'yellow', - 5 - ], - [ - 'beige', - 5 - ], - [ - 'two-toned', - 5 - ], - [ - 'multicolored', - 5 - ], - [ - 'silver', - 2 - ], - [ - 'gold', - 2 - ], - [ - 'rainbow', - 1 - ] -] - -if __name__ == "__main__": - var = vars().copy() - - # 获取tags列表 - tags = [] - for key, value in var.items(): - if not key.startswith('_') and key != 'var': - tags.extend(value) - print(tags) - - # 展开二级列表 - tags = [tag[0] for tag in tags] - print(tags) - import json - - with open('../../../../playground/cos/tags.json', 'w') as f: - json.dump(tags, f) diff --git a/src/novelai_python/tool/random_prompt/tag_character.py b/src/novelai_python/tool/random_prompt/tag_character.py deleted file mode 100644 index 4c15f6d..0000000 --- a/src/novelai_python/tool/random_prompt/tag_character.py +++ /dev/null @@ -1,270 +0,0 @@ -# -*- coding: utf-8 -*- -# @Time : 2024/2/7 下午5:56 -# @Author : sudoskys -# @File : tag_character.py - - -rankCharacter = [ - ['futanari-sama_(mdf_an)', 10], - ['kouhai-chan_(mignon)', 10], - ['kaleina_(ricegnat)', 10], - ['sarah-san_(mignon)', 10], - ['shiro-chan_(mignon)', 10], - ['ichigo-chan_(mignon)', 10], - ['hiyake-chan', 10], - ['pandora_acherona_(nat_the_lich)', 10], - ['nil_sunna', 10], - ['brown_twintails_girl_(mdf_an)', 10], - ['blonde_ponytail_girl_(mdf_an)', 10], - ['tsona_(nyantcha)', 10], - ['meruccubus_(merunyaa)', 10], ['saki_(the_atko)', 10], ['ophelia_(bigrbear)', 10], - ['chariot_(black_rock_shooter)', 10], ['hoshizuki_suzu', 10], ['hoshizuki_kaede', 10], - ['chloe_(sciamano240)', 10], ['asutora-chan', 10], ['sunomiya_sana', 10], - ['aibo_(gorgeous_mushroom)', 10], ['hachiouji_naoto', 10], ['gojou_wakana', 10], - ['tokisaki_asaba', 10], ['guild_girl_(goblin_slayer!)', 10], ['chobi_(akchu)', 10], - ['kurohanya_(niliu_chahui)', 10], ['yoshi_(nagatoro)', 10], ['oosuki_mamako', 10], - ['riley_fairfeather', 10], ['olga_discordia', 10], ['lillia_greyrat', 10], ['thai_girl_(okpriko)', 10], - ['uzaki_tsuki', 10], ['inui_sajuna', 10], ['okuzumi_yuiko', 10], ['tokisaki_mio', 10], - ['shione_(niliu_chahui)', 10], ['sapphira_nyx', 10], ['cerestia_of_life', 10], - ['celestine_lucullus', 10], ['angelise_reiter', 10], ['south_dakota_(solo_concert)_(azur_lane)', 10], - ['anubis_(houtengeki)', 10], ['nanami_mizuki', 10], - ['regensburg_(dark_dragon_brilliant_beach)_(azur_lane)', 10], ['ursula_(takunomi)', 10], - ['blonde_girl_(okpriko)', 10], ['paldea_mother', 10], ['gamou_maki', 10], ['aegis_(takunomi)', 10], - ['uketsuke_succubus_(konosuba)', 10], ['ursula_(23)', 10], - ['aegir_(golden_dragon_among_auspicious_clouds)_(azur_lane)', 10], ['tiona_hyryute', 10], - ['priana', 10], ['shinano_(moonlit_chrome)_(azur_lane)', 10], ['volume_(nikke)', 10], - ['tione_hyryute', 10], ['hinano_(sky-freedom)', 10], ['noumu_(boku_no_hero_academia)', 10], - ['st._louis_(luxurious_wheels)_(azur_lane)', 10], ['iwami_sayaka', 10], - ['hilichurl_(genshin_impact)', 10], ['kali_belladonna', 10], ['nagatoro_hayase', 10], - ['yui_(sky-freedom)', 10], ['new_jersey_(midsummer_leisure)_(azur_lane)', 10], - ['yorktown_ii_(bright-sky_mermaid)_(azur_lane)', 10], - ['new_jersey_(snow-white_ceremony)_(azur_lane)', 10], ['nonaka_kurumi', 10], - ['carmilla_(swimsuit_rider)_(third_ascension)_(fate)', 10], ['mal_(malberrybush)', 10], - ['rakugaki-chan', 10], ['azuma_(soft_voice_of_spring)_(azur_lane)', 10], ['reiko_(tofuubear)', 10], - ['sekhmet_of_death', 10], ['ty_lee', 10], ["iris_(en'en_no_shouboutai)", 10], - ['bremerton_(relaxation_consultation)_(azur_lane)', 10], - ['owari_(shimmering_forsythia)_(azur_lane)', 10], - ["drake_(the_golden_hind's_respite)_(azur_lane)", 10], ['komi_shuuko', 10], - ["yuigahama_yui's_mother", 10], ['amasawa_chigusa', 10], ['alex_(aestheticc-meme)', 10], - ['uzaki_yanagi', 10], ['nakabeni_yua', 10], ['strength_(black_rock_shooter)', 10], - ['unzen_(sojourn_through_clear_seas)_(azur_lane)', 10], ['bastet_(houtengeki)', 10], - ['yorra_villeneuve', 10], ['aikawa_ren', 10], ['io_(code_vein)', 10], - ['shinano_(dreamy_white_sands)_(azur_lane)', 10], ['elder_cousin_(igarashi_kyouhei)', 10], - ['tokage_setsuna', 10], ['chie_(ishikei)', 10], ['brown_haired_glasses_elf_(houtengeki)', 10], - ['elinalise_dragonroad', 10], ['sword_maiden', 10], ['regensburg_(azur_lane)', 10], - ['shinjin_succubus_(konosuba)', 10], ['marikawa_shizuka', 10], ['long-haired_girl_(motto_notto)', 10], - ['luna_(konosuba)', 10], ['hongryeon_(last_origin)', 10], ['micchan_(ohisashiburi)', 10], - ['sovetskaya_belorussiya_(relaxation_stratagem)_(azur_lane)', 10], ['musashi_(azur_lane)', 10], - ['tsubasa_(kureha)', 10], ['carol_olston', 10], ['hyuuga_hanabi', 10], ['sela_(23)', 10], - ['maki_oze', 10], ['sunao_(wokada)', 10], ['harukawa_syuria_(jack_dempa)', 10], - ['owari_(azur_lane)', 10], ['leonardo_da_vinci_(active_sailor)_(fate)', 10], - ['miyamae_shiho_(jack_dempa)', 10], ['tsuyuhara_miu', 10], ['nina_(wokada)', 10], - ['ariduka_formica', 10], ['implacable_(shepherd_of_the_"lost")_(azur_lane)', 10], ['rocoroco', 10], - ['ryuukyuu', 10], ['fia_the_deathbed_companion', 10], ['toujou_basara', 10], ['sera_(judgemint)', 10], - ['female_commander_(azur_lane)', 10], ['inui_shinju', 10], ['mass_production_eva', 10], - ['aloe_(ishuzoku_reviewers)', 10], ["aegir_(iron_blood's_dragon_maid)_(azur_lane)", 10], ['hinoa', 10], - ['hasegawa_chisato', 10], ['bakugou_mitsuki', 10], ['rapi_(nikke)', 10], ['tamaki_kotatsu', 10], - ['sakyumama_(kedama_milk)', 10], ['tomboy_childhood_friend_(cccpo)', 10], - ['alicia_renato_(yashiro_sousaku)', 10], ['moegi_homi', 10], ['south_dakota_(azur_lane)', 10], - ['sasaki_kanna_(kaedeko)', 10], ['vermeil_(kinsou_no_vermeil)', 10], ['goat-chan_(enarane)', 10], - ['saruei_(vtuber)', 10], ['carmilla_(swimsuit_rider)_(fate)', 10] -] - -rankIdentity = [ - ['virtual_youtuber', 60], ['accountant', 20], ['worker', 10], ['manager', 10], ['traffic_controller', 10], - ['airline_cabin_crew', 10], - ['art_therapist', 10], - ['arts_administrator', 10], ['auditor', 10], ['automotive_engineer', 10], ['barrister', 10], - ['band member', 10], ['maid', 15], ['teacher', 10], - ['student', 20], ['child_psychotherapist', 10], - ["nurse", 20], ['chiropractor', 10], - ['lawyer', 10], ['crystallographer', 10], ['curator', 10], - ['officer', 10], ['dancer', 10], - ['doctor_(general_practitioner,_gp)', 10], ['doctor_(hospital)', 10], ['dramatherapist', 10], - ['army', 15], ['firefighter', 10], ['chef', 15], - ['actress', 10], ['baker', 10], ['bellhop', 10], - ['blacksmith', 10], ['boxer', 10], ['butcher', 10], - ['carpenter', 10], ['cartoonist', 10], ['cashier', 10], - ['chemist', 10], ['clerk', 10], ['detective', 10], - ['engineer', 10], ['fisherman', 10], ['florist', 10], - ['flyer', 10], ['gardener', 10], ['guard', 10], - ['guide', 10], ['hiredresseer', 10], ['housekeeper', 10], - ['housewife', 10], ['janitor', 10], ['journalist', 10], ['hydrologist', 10], - ['illustrator', 10], ['masseuse', 10], ['model', 10], - - ['monk', 10], ['movie star', 10], ['musician', 10], - ['nun', 10], ['insurance_broker', 10], - - ['parachutist', 10], ['personnel', 10], ['photographer', 10], - ['interpreter', 10], ['postman', 10], ['processfor', 10], - ['tailor', 10], ['technician', 10], ['waiter', 20], - ['waitress', 50], ['journalist', 10], ['fisherman', 10], - ['vtuber', 70], ['landscape_architect', 10], ['learning_disability_nurse', 10], - ['midwife', 10], ['photographer', 10], ['police_officer', 10], - ['writer', 10], ['youth_worker', 10] -] - -rankMoods = [ - ['abandoned', 10], ['absent_minded', 10], ['abused', 10], ['accepted', 10], ['accomplished', 10], - ['accusatory', 10], ['accused', 10], ['admired', 10], ['adored', 10], ['adrift', 10], ['affectionate', 10], - ['afraid', 10], ['aggravated', 10], ['aggressive', 10], ['agitated', 10], ['alarmed', 10], ['alert', 10], - ['alienated', 10], ['alive', 10], ['alluring', 10], ['alone', 10], ['aloof', 10], ['amazed', 10], - ['ambushed', 10], ['amused', 10], ['angry', 10], ['annoyed', 10], ['antagonistic', 10], ['anxious', 10], - ['apathetic', 10], ['apologetic', 10], ['appalled', 10], ['appreciated', 10], ['appreciative', 10], - ['apprehensive', 10], ['aroused', 10], ['ashamed', 10], ['astonished', 10], ['attacked', 10], - ['attractive', 10], ['awake', 10], ['aware', 10], ['awe', 10], ['awed', 10], ['awestruck', 10], - ['awkward', 10], ['bad', 10], ['baffled', 10], ['barren', 10], ['bashful', 10], ['beaten', 10], - ['belittled', 10], ['benevolent', 10], ['berated', 10], ['betrayed', 10], ['bewildered', 10], - ['bitchy', 10], - ['bitter', 10], ['bittersweet', 10], ['blah', 10], ['blamed', 10], ['blank', 10], ['blissful', 10], - ['blue', 10], ['bold', 10], ['bored', 10], ['bothered', 10], ['bouncy', 10], ['brave', 10], ['broken', 10], - ['brooding', 10], ['bummed', 10], ['burdened', 10], ['burned-out', 10], ['callous', 10], ['calm', 10], - ['capable', 10], ['carefree', 10], ['careless', 10], ['caring', 10], ['caustic', 10], ['cautious', 10], - ['censored', 10], ['centered', 10], ['certain', 10], ['challenged', 10], ['charmed', 10], ['cheated', 10], - ['cheerful', 10], ['cherished', 10], ['childish', 10], ['chipper', 10], ['choleric', 10], ['clean', 10], - ['clear', 10], ['clever', 10], ['close', 10], ['closed', 10], ['clueless', 10], ['clumsy', 10], - ['cold', 10], - ['comfortable', 10], ['committed', 10], ['compassionate', 10], ['competent', 10], ['competitive', 10], - ['complacent', 10], ['complete', 10], ['concerned', 10], ['condemned', 10], ['condescension', 10], - ['confident', 10], ['confining', 10], ['confused', 10], ['considerate', 10], ['contemplative', 10], - ['contempt', 10], ['contemptuous', 10], ['content', 10], ['controlled', 10], ['conventional', 10], - ['convicted', 10], ['cornered', 10], ['courageous', 10], ['cowardly', 10], ['cranky', 10], ['crappy', 10], - ['crazy', 10], ['critical', 10], ['cross', 10], ['crushed', 10], ['curious', 10], ['cynical', 10], - ['daring', 10], ['dark', 10], ['dashed', 10], ['dazed', 10], ['dead', 10], ['deceived', 10], - ['dedicated', 10], - ['defeated', 10], ['defenseless', 10], ['defensive', 10], ['defiant', 10], ['degraded', 10], - ['dejected', 10], - ['delicate', 10], ['delighted', 10], ['demoralized', 10], ['dependent', 10], ['depressed', 10], - ['deprived', 10], ['derisive', 10], ['deserted', 10], ['desired', 10], ['desolate', 10], ['despair', 10], - ['desperate', 10], ['destroyed', 10], ['detached', 10], ['determined', 10], ['devastated', 10], - ['devious', 10], ['devoted', 10], ['didactic', 10], ['different', 10], ['difficult', 10], - ['dignified', 10], - ['dirty', 10], ['disappointed', 10], ['disbelieving', 10], ['discarded', 10], ['disconnected', 10], - ['discontent', 10], ['discontented', 10], ['discouraged', 10], ['disdainful', 10], ['disgraced', 10], - ['disgusted', 10], ['disheartened', 10], ['dishonest', 10], ['disillusioned', 10], ['dismal', 10], - ['dismayed', 10], ['disobedient', 10], ['disorganized', 10], ['disposable', 10], ['distant', 10], - ['distracted', 10], ['distressed', 10], ['disturbed', 10], ['ditzy', 10], ['dorky', 10], ['doubtful', 10], - ['down', 10], ['drained', 10], ['dreamy', 10], ['dreary', 10], ['dropped', 10], ['drunk', 10], - ['dull', 10], - ['dumb', 10], ['eager', 10], ['earnest', 10], ['ecstatic', 10], ['edgy', 10], ['effective', 10], - ['elated', 10], ['embarassed', 10], ['embarrassed', 10], ['empathetic', 10], ['empowered', 10], - ['empty', 10], - ['enchanted', 10], ['encouraged', 10], ['energetic', 10], ['energized', 10], ['enlightened', 10], - ['enraged', 10], ['enriched', 10], ['entertained', 10], ['enthralled', 10], ['enthusiastic', 10], - ['envious', 10], ['erudite', 10], ['evasive', 10], ['evil', 10], ['exasperated', 10], ['excited', 10], - ['excluded', 10], ['exhausted', 10], ['exhilarated', 10], ['expectant', 10], ['exploited', 10], - ['exposed', 10], ['exuberant', 10], ['faithful', 10], ['fake', 10], ['fanciful', 10], ['fantastic', 10], - ['fatalistic', 10], ['fatigued', 10], ['fearful', 10], ['fearless', 10], ['feisty', 10], ['fine', 10], - ['flirty', 10], ['flustered', 10], ['foolish', 10], ['foreboding', 10], ['forgiven', 10], - ['forgiving', 10], - ['forgotten', 10], ['forthright', 10], ['fortunate', 10], ['framed', 10], ['frantic', 10], ['free', 10], - ['friendly', 10], ['frightened', 10], ['frisky', 10], ['frustrated', 10], ['fulfilled', 10], ['full', 10], - ['funny', 10], ['furious', 10], ['futile', 10], ['geeky', 10], ['generous', 10], ['gentle', 10], - ['giddy', 10], - ['giggly', 10], ['giving', 10], ['glad', 10], ['gloomy', 10], ['glorious', 10], ['good', 10], - ['grateful', 10], - ['great', 10], ['grieving', 10], ['groggy', 10], ['grouchy', 10], ['grumpy', 10], ['guarded', 10], - ['guilty', 10], ['gullible', 10], ['handicapped', 10], ['happy', 10], ['harmonious', 10], ['hateful', 10], - ['haughty', 10], ['haunted', 10], ['haunting', 10], ['healthy', 10], ['heard', 10], ['heartbroken', 10], - ['heavy-hearted', 10], ['helpful', 10], ['helpless', 10], ['hesitant', 10], ['high', 10], ['honored', 10], - ['hopeful', 10], ['hopeless', 10], ['horrible', 10], ['horrified', 10], ['hospitable', 10], - ['hostile', 10], - ['hot', 10], ['humble', 10], ['humiliated', 10], ['hungry', 10], ['hurt', 10], ['hyper', 10], - ['hysterical', 10], ['idealistic', 10], ['idiotic', 10], ['idyllic', 10], ['ignorant', 10], - ['ignored', 10], - ['imaginative', 10], ['immune', 10], ['impatient', 10], ['impelled', 10], ['imperfect', 10], - ['impertinent', 10], ['important', 10], ['impressed', 10], ['impulsive', 10], ['inadequate', 10], - ['inattentive', 10], ['incensed', 10], ['inclusive', 10], ['incompetent', 10], ['incomplete', 10], - ['incredulous', 10], ['indebted', 10], ['indecisive', 10], ['independent', 10], ['indescribable', 10], - ['indifferent', 10], ['indignant', 10], ['industrious', 10], ['inept', 10], ['inferior', 10], - ['inflated', 10], - ['informed', 10], ['infuriated', 10], ['inhibited', 10], ['innocent', 10], ['innovative', 10], - ['inquisitive', 10], ['insane', 10], ['insecure', 10], ['insensitive', 10], ['insidious', 10], - ['insignificant', 10], ['insulted', 10], ['intense', 10], ['interested', 10], ['interrogated', 10], - ['interrupted', 10], ['intimate', 10], ['intimidated', 10], ['intrigued', 10], ['invigorated', 10], - ['invisible', 10], ['involved', 10], ['irate', 10], ['irked', 10], ['irrational', 10], - ['irresponsible', 10], - ['irritated', 10], ['isolated', 10], ['jaded', 10], ['jealous', 10], ['jinxed', 10], ['jolly', 10], - ['jovial', 10], ['joyful', 10], ['joyous', 10], ['jubilant', 10], ['judged', 10], ['judgmental', 10], - ['jumpy', 10], ['just', 10], ['justified', 10], ['kidded', 10], ['kind', 10], ['knowledgeable', 10], - ['late', 10], ['lazy', 10], ['leery', 10], ['left', 10], ['let', 10], ['lethargic', 10], ['liable', 10], - ['liberated', 10], ['liberating', 10], ['lifeless', 10], ['light-hearted', 10], ['liked', 10], - ['listened', 10], ['listless', 10], ['logical', 10], ['lonely', 10], ['loose', 10], ['lost', 10], - ['lousy', 10], ['lovable', 10], ['loved', 10], ['loving', 10], ['lucky', 10], ['lyrical', 10], ['mad', 10], - ['malicious', 10], ['manipulated', 10], ['matter', 10], ['fact', 10], ['mean', 10], ['meditative', 10], - ['melancholic', 10], ['melancholy', 10], ['mellow', 10], ['merciless', 10], ['merry', 10], - ['mischievous', 10], - ['miserable', 10], ['misinterpreted', 10], ['mistreated', 10], ['misunderstood', 10], ['mixed', 10], - ['mocked', 10], ['mocking', 10], ['modest', 10], ['molested', 10], ['moody', 10], ['morose', 10], - ['motivated', 10], ['mournful', 10], ['moved', 10], ['mystified', 10], ['naive', 10], ['nasty', 10], - ['naughty', 10], ['nauseated', 10], ['needed', 10], ['needy', 10], ['negative', 10], ['neglected', 10], - ['nerdy', 10], ['nervous', 10], ['neurotic', 10], ['nightmarish', 10], ['nonchalant', 10], - ['nostalgic', 10], - ['not', 10], ['specified', 10], ['noticed', 10], ['numb', 10], ['obeyed', 10], ['objective', 10], - ['obligated', 10], ['obvious', 10], ['odd', 10], ['offended', 10], ['okay', 10], ['old', 10], ['open', 10], - ['oppressed', 10], ['optimistic', 10], ['ornery', 10], ['control', 10], ['outraged', 10], ['overcome', 10], - ['overjoyed', 10], ['overloaded', 10], ['overwhelmed', 10], ['overworked', 10], ['owned', 10], - ['painful', 10], - ['pampered', 10], ['panicky', 10], ['paralyzed', 10], ['passionate', 10], ['passive', 10], ['patient', 10], - ['patronizing', 10], ['peaceful', 10], ['peeved', 10], ['pensive', 10], ['perky', 10], ['perplexed', 10], - ['persecuted', 10], ['pessimistic', 10], ['pestered', 10], ['petrified', 10], ['petty', 10], ['phony', 10], - ['pious', 10], ['pissed', 10], ['off', 10], ['playful', 10], ['pleased', 10], ['poor', 10], - ['positive', 10], - ['possessive', 10], ['powerful', 10], ['powerless', 10], ['practical', 10], ['predatory', 10], - ['pressured', 10], ['private', 10], ['productive', 10], ['protected', 10], ['protective', 10], - ['proud', 10], - ['provoked', 10], ['prudish', 10], ['punished', 10], ['pushy', 10], ['puzzled', 10], ['questioned', 10], - ['quiet', 10], ['quixotic', 10], ['quizzical', 10], ['rambunctious', 10], ['realistic', 10], - ['reassured', 10], - ['rebellious', 10], ['reborn', 10], ['receptive', 10], ['reckless', 10], ['recognized', 10], - ['reconciled', 10], ['recumbent', 10], ['reflective', 10], ['refreshed', 10], ['regretful', 10], - ['rejected', 10], ['rejuvenated', 10], ['relaxed', 10], ['released', 10], ['relieved', 10], - ['reluctant', 10], - ['reminiscent', 10], ['remorse', 10], ['renewed', 10], ['replaced', 10], ['replenished', 10], - ['repressed', 10], ['rescued', 10], ['resentful', 10], ['reserved', 10], ['resistant', 10], - ['resourceful', 10], ['respected', 10], ['responsible', 10], ['restless', 10], ['restricted', 10], - ['revengeful', 10], ['reverent', 10], ['revitalized', 10], ['ribald', 10], ['rich', 10], ['ridicule', 10], - ['ridiculous', 10], ['right', 10], ['rigid', 10], ['robbed', 10], ['romantic', 10], ['rotten', 10], - ['rushed', 10], ['sabotaged', 10], ['sad', 10], ['safe', 10], ['sarcastic', 10], ['sardonic', 10], - ['sassy', 10], ['satiated', 10], ['satiric', 10], ['satisfied', 10], ['saved', 10], ['scared', 10], - ['scolded', 10], ['scorned', 10], ['secure', 10], ['seductive', 10], ['selfish', 10], ['self-assured', 10], - ['self-centered', 10], ['self-confident', 10], ['self-conscious', 10], ['self-destructive', 10], - ['self-reliant', 10], ['sensitive', 10], ['sentimental', 10], ['serene', 10], ['serious', 10], - ['sexy', 10], - ['shaken', 10], ['shamed', 10], ['sheepish', 10], ['shocked', 10], ['shunned', 10], ['shy', 10], - ['sick', 10], - ['silenced', 10], ['silly', 10], ['sincere', 10], ['sinful', 10], ['skeptical', 10], ['skillful', 10], - ['slandered', 10], ['sleepy', 10], ['sluggish', 10], ['small', 10], ['smart', 10], ['smothered', 10], - ['solemn', 10], ['somber', 10], ['soothed', 10], ['sorry', 10], ['special', 10], ['spiteful', 10], - ['splendid', 10], ['spunky', 10], ['squashed', 10], ['stifled', 10], ['stimulated', 10], ['stingy', 10], - ['strained', 10], ['stressed', 10], ['stretched', 10], ['strong', 10], ['stubborn', 10], ['stumped', 10], - ['stunned', 10], ['stupid', 10], ['submissive', 10], ['successful', 10], ['suffocated', 10], - ['suicidal', 10], - ['sullen', 10], ['sunk', 10], ['super', 10], ['superior', 10], ['supported', 10], ['sure', 10], - ['surly', 10], - ['surprised', 10], ['suspenseful', 10], ['suspicious', 10], ['sympathetic', 10], ['tacky', 10], - ['tactful', 10], ['talented', 10], ['talkative', 10], ['tame', 10], ['tarnished', 10], ['tasteful', 10], - ['tearful', 10], ['teased', 10], ['tenacious', 10], ['tender', 10], ['tense', 10], ['tepid', 10], - ['terrible', 10], ['terrific', 10], ['terrified', 10], ['terrifying', 10], ['tested', 10], ['testy', 10], - ['thankful', 10], ['thoughtful', 10], ['threatened', 10], ['threatening', 10], ['thrifty', 10], - ['thrilled', 10], ['tired', 10], ['tormented', 10], ['torn', 10], ['tortured', 10], ['touched', 10], - ['tough', 10], ['tragic', 10], ['tranquil', 10], ['transformed', 10], ['trapped', 10], ['treasured', 10], - ['trembly', 10], ['tremendous', 10], ['tricked', 10], ['troubled', 10], ['trusted', 10], ['trustful', 10], - ['ugly', 10], ['unaccepted', 10], ['unappreciated', 10], ['unbalanced', 10], ['unburdened', 10], - ['uncanny', 10], ['uncomfortable', 10], ['unconcerned', 10], ['uneven', 10], ['unfit', 10], - ['unfriendly', 10], - ['united', 10], ['unjust', 10], ['unknown', 10], ['unneeded', 10], ['unpleasant', 10], ['unreal', 10], - ['unruly', 10], ['unwise', 10], ['up', 10], ['uplifted', 10], ['used', 10], ['useless', 10], - ['vacant', 10], - ['vague', 10], ['vain', 10], ['valid', 10], ['valued', 10], ['vengeful', 10], ['vexed', 10], - ['vicious', 10], - ['victimized', 10], ['victorious', 10], ['violated', 10], ['violent', 10], ['vivacious', 10], - ['vivid', 10], - ['void', 10], ['wacky', 10], ['warlike', 10], ['warm', 10], ['warmhearted', 10], ['warned', 10], - ['wary', 10], - ['wasted', 10], ['weak', 10], ['wealthy', 10], ['weary', 10], ['weird', 10], ['welcoming', 10], - ['whimsical', 10], ['whole', 10], ['wild', 10], ['willful', 10], ['wishful', 10], ['witty', 10], - ['worldly', 10], ['worried', 10], ['worse', 10], ['worthy', 10], ['wounded', 10], ['wrong', 10], - ['yearning', 10], ['yellow', 10], ['yielding', 10], ['young', 10], ['youthful', 10], ['zany', 10], - ['zealous', 10] -] diff --git a/src/novelai_python/tool/random_prompt/tag_nsfw.py b/src/novelai_python/tool/random_prompt/tag_nsfw.py deleted file mode 100644 index cd54b1a..0000000 --- a/src/novelai_python/tool/random_prompt/tag_nsfw.py +++ /dev/null @@ -1,984 +0,0 @@ -# -*- coding: utf-8 -*- -# @Time : 2024/1/26 下午2:03 -# @Author : sudoskys -# @File : nsfw.py - -nsfw = { - "pussy": [ - [ - "uncensored, pussy", - 5 - ], - [ - "uncensored, pussy, fat mons", - 2 - ] - ], - "penis": [ - [ - "uncensored, penis", - 5 - ], - [ - "uncensored, huge penis", - 5 - ], - [ - "uncensored, large penis", - 5 - ], - [ - "uncensored, small penis", - 5 - ] - ], - "undressing": [ - [ - "clothing aside", - 5 - ], - [ - "clothes down", - 5 - ], - [ - "open clothes", - 5 - ], - [ - "see-through", - 5 - ], - [ - "unbuttoned", - 5 - ], - [ - "untied", - 5 - ], - [ - "unzipped", - 5 - ], - [ - "breasts out", - 5 - ], - [ - "areola slip", - 5 - ], - [ - "nipple slip", - 5 - ], - [ - "barefoot", - 5 - ], - [ - "panties around one leg", - 5 - ], - [ - "downblouse", - 5 - ], - [ - "downpants", - 5 - ], - [ - "pantyshot", - 5 - ], - [ - "upskirt", - 5 - ] - ], - "underwear": [ - [ - "bandaid on pussy", - 5 - ], - [ - "lingerie", - 5 - ], - [ - "bra", - 5 - ], - [ - "fishnets", - 5 - ], - [ - "garter belt", - 5 - ], - [ - "panties", - 5 - ], - [ - "boyshort panties", - 5 - ], - [ - "micro panties", - 5 - ], - [ - "lowleg panties", - 5 - ], - [ - "highleg panties", - 5 - ], - [ - "thong", - 5 - ], - [ - "g-string", - 5 - ], - [ - "pearl thong", - 5 - ], - [ - "boxers", - 5 - ], - [ - "briefs", - 5 - ], - [ - "boxer briefs", - 5 - ], - [ - "crotchless panties", - 5 - ], - [ - "reverse bunnysuit", - 5 - ], - [ - "pasties", - 5 - ], - [ - "nipple rings", - 5 - ] - ], - "naked": [ - [ - "naked apron", - 5 - ], - [ - "naked bandage", - 5 - ], - [ - "naked cape", - 5 - ], - [ - "naked capelet", - 5 - ], - [ - "naked chocolate", - 5 - ], - [ - "naked cloak", - 5 - ], - [ - "naked coat", - 5 - ], - [ - "naked hoodie", - 5 - ], - [ - "naked jacket", - 5 - ], - [ - "naked overalls", - 5 - ], - [ - "naked ribbon", - 5 - ], - [ - "naked robe", - 5 - ], - [ - "naked scarf", - 5 - ], - [ - "naked sheet", - 5 - ], - [ - "naked shirt", - 5 - ], - [ - "naked suspenders", - 5 - ], - [ - "naked tabard", - 5 - ], - [ - "naked towel", - 5 - ], - [ - "nude", - 25 - ] - ], - "bdsm": [ - [ - "blindfold", - 5 - ], - [ - "gimp suit", - 5 - ], - [ - "bondage outfit", - 5 - ], - [ - "latex", - 5 - ], - [ - "monoglove", - 5 - ] - ], - "nudeExtra": [ - [ - "pubic hair", - 25 - ], - [ - "pussy juice", - 25 - ], - [ - "clitoris piercing", - 25 - ], - [ - "clitoris ring", - 25 - ], - [ - "armpits", - 25 - ], - [ - "lactation", - 25 - ], - [ - "pregnant", - 25 - ], - [ - "exhibitionism", - 25 - ], - [ - "cameltoe", - 25 - ], - [ - "covered nipples", - 25 - ], - [ - "puffy nipples", - 25 - ], - [ - "inverted nipples", - 25 - ], - [ - "nipple piercing", - 25 - ], - [ - "dark nipples", - 25 - ] - ], - "action": [ - [ - "adjusting panties", - 15 - ], - [ - "hand in panties", - 15 - ], - [ - "panty pull", - 15 - ], - [ - "panties aside", - 15 - ], - [ - "panty lift", - 15 - ], - [ - "cumdrip into panties", - 15 - ], - [ - "vibrator under panties", - 15 - ], - [ - "undressing", - 15 - ], - [ - "untying", - 15 - ], - [ - "unzipping", - 15 - ], - [ - "shirt lift", - 15 - ], - [ - "dress lift", - 15 - ], - [ - "covering privates", - 15 - ], - [ - "nude modeling", - 15 - ], - [ - "ass grab", - 15 - ], - [ - "groping", - 15 - ], - [ - "crotch grab", - 15 - ], - [ - "grabbing own breast", - 15 - ], - [ - "cum inflation", - 15 - ], - [ - "big belly", - 15 - ], - [ - "after sex", - 15 - ], - [ - "after anal", - 15 - ], - [ - "after fellatio", - 15 - ], - [ - "after masturbation", - 15 - ], - [ - "after paizuri", - 15, - [ - "flat chest" - ] - ], - [ - "after rape", - 15 - ], - [ - "bondage", - 15 - ], - [ - "humiliation", - 15 - ], - [ - "spanked", - 15 - ], - [ - "bukkake", - 15 - ], - [ - "cumdump", - 15 - ], - [ - "cumdrip", - 15 - ], - [ - "cum in mouth", - 15 - ], - [ - "cum in pussy", - 15 - ], - [ - "cum in ass", - 15 - ], - [ - "cum on body", - 15 - ], - [ - "cum on armpits", - 15 - ], - [ - "cum on ass", - 15 - ], - [ - "cum on breasts", - 15 - ], - [ - "cum on feet", - 15 - ], - [ - "cum on fingers", - 15 - ], - [ - "cum on hair", - 15 - ], - [ - "cum on stomach", - 15 - ], - [ - "cum on clothes", - 15 - ], - [ - "cum on eyewear", - 15 - ], - [ - "ejaculation", - 15 - ], - [ - "facial", - 15 - ], - [ - "public indecency", - 15 - ], - [ - "female ejaculation", - 15 - ], - [ - "peeing", - 15 - ], - [ - "sex machine", - 15 - ], - [ - "milking", - 15 - ], - [ - "breast pump", - 15 - ], - [ - "milking machine", - 15 - ], - [ - "spread legs", - 15 - ], - [ - "presenting", - 15 - ], - [ - "presenting armpit", - 15 - ], - [ - "on stomach", - 15 - ], - [ - "on back", - 15 - ], - [ - "rear view", - 15 - ], - [ - "orgasm", - 15 - ] - ], - "analForeplay": [ - [ - "anal fingering", - 15 - ], - [ - "fingering", - 15 - ], - [ - "ass grab", - 15 - ], - [ - "ass smack", - 15 - ], - [ - "covering ass", - 15 - ], - [ - "spread ass", - 15 - ], - [ - "spread anus", - 15 - ], - [ - "cum in ass", - 15 - ], - [ - "cum on ass", - 15 - ] - ], - "pussyForeplay": [ - [ - "spread pussy", - 15 - ], - [ - "masturbation", - 15 - ], - [ - "cum in pussy", - 15 - ], - [ - "cum on pussy", - 15 - ] - ], - "footForeplay": [ - [ - "footjob", - 5 - ], - [ - "licking foot", - 5 - ], - [ - "foot worship", - 5 - ], - [ - "smelling feet", - 5 - ], - [ - "paizuri", - 5, - [ - "flat chest" - ] - ], - [ - "paizuri, on back", - 5, - [ - "flat chest" - ] - ], - [ - "grabbing another's breast", - 5 - ], - [ - "handjob", - 5 - ], - [ - "torso grab", - 5 - ], - [ - "nursing handjob", - 5 - ], - [ - "breast sucking", - 5 - ], - [ - "fellatio", - 5 - ], - [ - "molestation", - 5 - ], - [ - "kiss", - 5 - ], - [ - "hugging", - 5 - ] - ], - "analSex": [ - [ - "anal", - 4 - ], - [ - "anal, doggystyle", - 4 - ], - [ - "anal, doggystyle, bent over", - 4 - ], - [ - "anal, doggystyle, top-down bottom-up", - 4 - ], - [ - "anal, spooning, on-side", - 4 - ], - [ - "anal, cowgirl position", - 4 - ], - [ - "anal, reverse cowgirl position", - 4 - ], - [ - "anal, reverse upright straddle, straddling", - 4 - ], - [ - "anal, upright straddle, straddling", - 4 - ], - [ - "anal, on back, folded", - 4 - ], - [ - "anal, missionary", - 4 - ], - [ - "anal, suspended congress", - 4 - ] - ], - "sex": [ - [ - "sex", - 5 - ], - [ - "sex, doggystyle", - 5 - ], - [ - "sex, doggystyle, bent over", - 5 - ], - [ - "sex, doggystyle, top-down bottom-up", - 5 - ], - [ - "sex, spooning, on-side", - 5 - ], - [ - "sex, cowgirl position", - 5 - ], - [ - "sex, reverse cowgirl position", - 5 - ], - [ - "sex, reverse upright straddle, straddling", - 5 - ], - [ - "sex, upright straddle, straddling", - 5 - ], - [ - "sex, on back, folded", - 5 - ], - [ - "sex, missionary", - 5 - ], - [ - "sex, suspended congress", - 5 - ], - [ - "sex, defloration", - 5 - ], - [ - "sex, gangbang", - 5 - ], - [ - "sex, stomach bulge", - 5 - ] - ], - "sexMod": [ - [ - "clothed sex", - 5 - ], - [ - "happy sex", - 5 - ], - [ - "implied sex", - 5 - ], - [ - "tentacle sex", - 5 - ], - [ - "ahegao", - 5 - ], - [ - "fucked silly", - 5 - ], - [ - "rape", - 5 - ], - [ - "femdom rape", - 5 - ] - ], - "sexActionMode": [ - [ - "bondage", - 5 - ], - [ - "femdom", - 5 - ], - [ - "assertive female", - 5 - ], - [ - "humiliation", - 5 - ], - [ - "body writing", - 5 - ], - [ - "public use", - 5 - ], - [ - "body writing", - 5 - ], - [ - "slave", - 5 - ], - [ - "cum", - 5 - ], - [ - "prostitution", - 5 - ], - [ - "netorare", - 5 - ], - [ - "voyeurism", - 5 - ], - [ - "naughty face", - 5 - ], - [ - "condom", - 5 - ], - [ - "sound effects", - 5 - ], - [ - "lactation", - 5 - ] - ], - "sexAccessories": [ - [ - "dildo", - 5 - ], - [ - "vibrator", - 5 - ], - [ - "anal beads", - 5 - ], - [ - "leash", - 5 - ], - [ - "pillory", - 5 - ], - [ - "rope", - 5 - ], - [ - "whip", - 5 - ], - [ - "gag", - 5 - ] - ], - "h": "hetero", - "yu": "yuri", - "ya": "yaoi", - "fu": "futanari", - "fwm": "futa with male", - "fwf": "futa with female", - "nw": "nsfw" -} - -if __name__ == "__main__": - - # 获取tags列表 - tags = [] - for key, value in nsfw.items(): - if not key.startswith('_') and key != 'var': - tags.extend(value) - print(tags) - - # 展开二级列表 - tags = [tag[0] for tag in tags] - print(tags) - import json - - with open('../../../../playground/cos/tag_nsfw.json', 'w') as f: - json.dump(tags, f) diff --git a/tests/test_random_prompt.py b/tests/test_random_prompt.py index d0c6930..49641af 100755 --- a/tests/test_random_prompt.py +++ b/tests/test_random_prompt.py @@ -7,64 +7,55 @@ from novelai_python.tool.random_prompt import RandomPromptGenerator -def test_generate_returns_string(): - generator = RandomPromptGenerator(nsfw_enabled=True) - result = generator.generate() - assert isinstance(result, str) - - -def test_generate_returns_non_empty_string(): - generator = RandomPromptGenerator(nsfw_enabled=True) - result = generator.generate() +def test_generate_scene_tags(): + generator = RandomPromptGenerator() + result = generator.generate_scene_tags() assert len(result) > 0 -def test_generate_returns_different_results(): - generator = RandomPromptGenerator(nsfw_enabled=True) - result1 = generator.generate() - result2 = generator.generate() +def test_generate_scene_composition(): + generator = RandomPromptGenerator() + result1 = generator.generate_scene_composition() + result2 = generator.generate_scene_composition() assert result1 != result2 -def test_generate_with_nsfw_disabled(): - generator = RandomPromptGenerator(nsfw_enabled=False) - result = generator.generate() +def test_generate_common_tags_non_nsfw(): + generator = RandomPromptGenerator() + result = generator.generate_common_tags(nsfw=False) assert 'nsfw' not in result -def test_generate_with_nsfw_enabled(): - generator = RandomPromptGenerator(nsfw_enabled=True) - result = generator.generate() +def test_generate_common_tags_nsfw(): + generator = RandomPromptGenerator() + result = generator.generate_common_tags(nsfw=True) assert 'nsfw' in result -def test_get_weighted_choice_returns_string(): - generator = RandomPromptGenerator(nsfw_enabled=True) - result = generator.get_weighted_choice([['tag1', 1], ['tag2', 2]], []) - assert isinstance(result, str) - - -def test_get_weighted_choice_returns_valid_tag(): - generator = RandomPromptGenerator(nsfw_enabled=True) - result = generator.get_weighted_choice([['tag1', 1], ['tag2', 2]], []) - assert result in ['tag1', 'tag2'] - - -def test_character_features_returns_list(): - generator = RandomPromptGenerator(nsfw_enabled=True) - result = generator.character_features('m', 'front', True, 1) +def test_generate_character(): + generator = RandomPromptGenerator() + result = generator.generate_character( + tags=["vampire", "werewolf"], + gender="f", + additional_tags="", + character_limit=1, + ) assert isinstance(result, list) -def test_character_features_returns_non_empty_list(): - generator = RandomPromptGenerator(nsfw_enabled=True) - result = generator.character_features('m', 'front', True, 1) +def test_generate_character_traits(): + generator = RandomPromptGenerator() + result = generator.generate_character_traits( + gender="f", + portrait_type="half-length portrait", + level=3 + ) assert len(result) > 0 -def test_character_features_with_different_genders(): - generator = RandomPromptGenerator(nsfw_enabled=True) - result_m = generator.character_features('m', 'front', True, 1) - result_f = generator.character_features('f', 'front', True, 1) - result_o = generator.character_features('o', 'front', True, 1) +def test_get_holiday_themed_tags(): + generator = RandomPromptGenerator() + result_m = generator.get_holiday_themed_tags() + result_f = generator.get_holiday_themed_tags() + result_o = generator.get_holiday_themed_tags() assert result_m != result_f != result_o From ee41d342245800a417af4e2b5ca9a0bac10a4f86 Mon Sep 17 00:00:00 2001 From: sudoskys Date: Wed, 25 Dec 2024 14:57:24 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=F0=9F=9A=80=20feat:=20implement=20image=20?= =?UTF-8?q?metadata=20extraction=20and=20verification?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add functionality to extract metadata from images using LSB and PNGInfo. - Implement methods to verify if images are generated by NovelAI. - Add support for handling additional metadata formats and validation. - Refactor existing code for improved error handling and validation. --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index df53d1c..d34c184 100755 --- a/README.md +++ b/README.md @@ -142,8 +142,12 @@ loop.run_until_complete(chat("Hello")) ```python from novelai_python.tool.random_prompt import RandomPromptGenerator -prompt = RandomPromptGenerator(nsfw_enabled=False).random_prompt() -print(prompt) +generator = RandomPromptGenerator() +for i in range(10): + print(generator.generate_common_tags(nsfw=False)) + print(generator.generate_scene_tags()) + print(generator.generate_scene_composition()) + print(generator.get_holiday_themed_tags()) ``` #### 📦 Run A Server From da47374a5978e6cf10ae380591ac38656fe40eaa Mon Sep 17 00:00:00 2001 From: sudoskys Date: Wed, 25 Dec 2024 14:57:47 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=F0=9F=9A=80=20feat:=20implement=20image=20?= =?UTF-8?q?metadata=20extraction=20and=20verification?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add functionality to extract metadata from images using LSB and PNGInfo. - Implement methods to verify if images are generated by NovelAI. - Add support for handling additional metadata formats and validation. - Refactor existing code for improved error handling and validation. --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index d34c184..b481863 100755 --- a/README.md +++ b/README.md @@ -23,8 +23,6 @@ the [NovelAI API service](https://api.novelai.net/docs). pip -U install novelai-python ``` -For security reasons, storing user credentials in plaintext is strongly discouraged. - All API users must adhere to the NovelAI Terms of Service: https://novelai.net/terms. **More examples can be found in the [playground](https://github.com/LlmKira/novelai-python/tree/main/playground) @@ -43,6 +41,7 @@ from novelai_python.sdk.ai.generate_image.schema import PositionMap load_dotenv() session = ApiCredential(api_token=SecretStr(os.getenv("NOVELAI_JWT"))) # pst-*** +# For security reasons, storing user credentials in plaintext is strongly discouraged. prompt = "1girl, year 2023,dynamic angle, best quality, amazing quality, very aesthetic, absurdres" From 62f745548a2635a2b2a9172c738b16ae158cd8f6 Mon Sep 17 00:00:00 2001 From: sudoskys Date: Wed, 25 Dec 2024 14:58:56 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=F0=9F=90=9B=20fix(random=5Fprompt):=20corr?= =?UTF-8?q?ect=20type=20definitions=20order=20and=20spacing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reorder type definitions for clarity and fix spacing issues in generate_scene_composition.py. --- .../random_prompt/generate_scene_composition.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/novelai_python/tool/random_prompt/generate_scene_composition.py b/src/novelai_python/tool/random_prompt/generate_scene_composition.py index 10e116f..928db10 100644 --- a/src/novelai_python/tool/random_prompt/generate_scene_composition.py +++ b/src/novelai_python/tool/random_prompt/generate_scene_composition.py @@ -3,6 +3,11 @@ from pydantic import dataclasses +type WeightedOption = List[str, int, list, list, list] +type WeightedSimpleOption = List[int] +type WeightedOptions = List[WeightedOption] +type WeightedSimpleOptions = List[WeightedSimpleOption] + cameraAnglesL = [ ["dutch angle", 12, [], [], []], ["from above", 12, ["above"], [], []], @@ -2537,17 +2542,12 @@ ["rainbow", 2, [], [], []], ] -type WeightedOption = List[str, int, list, list, list] -type WeightedSimpleOption = List[int] -type WeightedOptions = List[WeightedOption] -type WeightedSimpleOptions = List[WeightedSimpleOption] - @dataclasses.dataclass class Conditions: tags: List[str] - def add(self, v:str): + def add(self, v: str): if v not in self.tags: self.tags.append(v) @@ -2577,6 +2577,7 @@ def select_weighted_option( :param conditions: 条件 :return: 选项 """ + # 如果 conditions 的元素存在于最后两个数组中,则不会被选中 def get_fourth_array(item: WeightedOption) -> List[str]: if len(item) < 4: From 469642e4fdfc57b8c14e4384bdcd7dad447bbd95 Mon Sep 17 00:00:00 2001 From: sudoskys Date: Wed, 25 Dec 2024 15:00:59 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=F0=9F=90=9B=20fix(random=5Fprompt):=20corr?= =?UTF-8?q?ect=20type=20definitions=20order=20and=20spacing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reorder type definitions for clarity and fix spacing issues in generate_scene_composition.py. --- .../tool/random_prompt/generate_scene_composition.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/novelai_python/tool/random_prompt/generate_scene_composition.py b/src/novelai_python/tool/random_prompt/generate_scene_composition.py index 928db10..d3641e8 100644 --- a/src/novelai_python/tool/random_prompt/generate_scene_composition.py +++ b/src/novelai_python/tool/random_prompt/generate_scene_composition.py @@ -1,12 +1,12 @@ import random -from typing import List +from typing import List, Tuple from pydantic import dataclasses -type WeightedOption = List[str, int, list, list, list] -type WeightedSimpleOption = List[int] -type WeightedOptions = List[WeightedOption] -type WeightedSimpleOptions = List[WeightedSimpleOption] +WeightedOption = Tuple[str, int, list, list, list] +WeightedSimpleOption = List[int] +WeightedOptions = List[WeightedOption] +WeightedSimpleOptions = List[WeightedSimpleOption] cameraAnglesL = [ ["dutch angle", 12, [], [], []], From 104e2a3755fb1c490e1ebdb3bc0fe10c24eb9969 Mon Sep 17 00:00:00 2001 From: sudoskys Date: Wed, 25 Dec 2024 15:05:12 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E2=9C=A8=20refactor:=20update=20typing=20f?= =?UTF-8?q?or=20Union=20usage=20across=20modules?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generate_scene_composition.py | 4 +- .../tool/random_prompt/generate_scene_tags.py | 6 +-- .../tool/random_prompt/generate_tags.py | 38 +++++++++---------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/novelai_python/tool/random_prompt/generate_scene_composition.py b/src/novelai_python/tool/random_prompt/generate_scene_composition.py index d3641e8..4b201d5 100644 --- a/src/novelai_python/tool/random_prompt/generate_scene_composition.py +++ b/src/novelai_python/tool/random_prompt/generate_scene_composition.py @@ -1,5 +1,5 @@ import random -from typing import List, Tuple +from typing import List, Tuple, Union from pydantic import dataclasses @@ -2568,7 +2568,7 @@ def random_range(a, b): def select_weighted_option( - options: WeightedOptions | WeightedSimpleOptions, + options: Union[WeightedOptions, WeightedSimpleOptions], conditions: Conditions, ) -> str | int: """ diff --git a/src/novelai_python/tool/random_prompt/generate_scene_tags.py b/src/novelai_python/tool/random_prompt/generate_scene_tags.py index 6500e7b..a6dcc43 100644 --- a/src/novelai_python/tool/random_prompt/generate_scene_tags.py +++ b/src/novelai_python/tool/random_prompt/generate_scene_tags.py @@ -1,5 +1,7 @@ import random -from typing import Any, List, Optional +from typing import Any, List, Optional, Union + +type Options = List[List[Union[str, int, Optional[List]]]] viewF = [ ["front view", 6], @@ -1733,8 +1735,6 @@ ["pattern", 3], ] -type Options = List[List[str | int | Optional[List]]] - def random_range(a, b): if a == b: diff --git a/src/novelai_python/tool/random_prompt/generate_tags.py b/src/novelai_python/tool/random_prompt/generate_tags.py index f1711d0..e0f39f2 100644 --- a/src/novelai_python/tool/random_prompt/generate_tags.py +++ b/src/novelai_python/tool/random_prompt/generate_tags.py @@ -1,10 +1,12 @@ import base64 import random from datetime import datetime -from typing import List, Optional, Any +from typing import List, Optional, Any, Union from pydantic import BaseModel +type Options = List[List[Union[str, int, Optional[List]]]] + cameraAngles = [ ["dutch angle", 5], ["from above", 5], @@ -1989,22 +1991,22 @@ class NsfwDecode(BaseModel): - p: List[List[str | int | List]] - mp: List[List[str | int | List]] - n: List[List[str | int | List]] - u: List[List[str | int | List]] - nk: List[List[str | int | List]] - bd: List[List[str | int | List]] - nEx: List[List[str | int | List]] - nSM: List[List[str | int | List]] - nSA: List[List[str | int | List]] - nSP: List[List[str | int | List]] - nPM: List[List[str | int | List]] - nPA: List[List[str | int | List]] - nPP: List[List[str | int | List]] - sMod: List[List[str | int | List]] - sActMod: List[List[str | int | List]] - sT: List[List[str | int | List]] + p: List[List[Union[str, int, List]]] + mp: List[List[Union[str, int, List]]] + n: List[List[Union[str, int, List]]] + u: List[List[Union[str, int, List]]] + nk: List[List[Union[str, int, List]]] + bd: List[List[Union[str, int, List]]] + nEx: List[List[Union[str, int, List]]] + nSM: List[List[Union[str, int, List]]] + nSA: List[List[Union[str, int, List]]] + nSP: List[List[Union[str, int, List]]] + nPM: List[List[Union[str, int, List]]] + nPA: List[List[Union[str, int, List]]] + nPP: List[List[Union[str, int, List]]] + sMod: List[List[Union[str, int, List]]] + sActMod: List[List[Union[str, int, List]]] + sT: List[List[Union[str, int, List]]] h: str yu: str ya: str @@ -2035,8 +2037,6 @@ def random_range(a, b): return random.randint(a, b) -type Options = List[List[str | int | Optional[List]]] - nsfwDecode = decode_nsfw_data(nsfwData) From be9fa5ce194e47af753f15c58e01e6698690526f Mon Sep 17 00:00:00 2001 From: sudoskys Date: Wed, 25 Dec 2024 15:09:07 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=F0=9F=94=A7=20fix:=20correct=20type=20alia?= =?UTF-8?q?s=20syntax=20in=20generate=5Fscene=5Ftags.py=20and=20generate?= =?UTF-8?q?=5Ftags.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/novelai_python/tool/random_prompt/generate_scene_tags.py | 2 +- src/novelai_python/tool/random_prompt/generate_tags.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/novelai_python/tool/random_prompt/generate_scene_tags.py b/src/novelai_python/tool/random_prompt/generate_scene_tags.py index a6dcc43..a2ff81d 100644 --- a/src/novelai_python/tool/random_prompt/generate_scene_tags.py +++ b/src/novelai_python/tool/random_prompt/generate_scene_tags.py @@ -1,7 +1,7 @@ import random from typing import Any, List, Optional, Union -type Options = List[List[Union[str, int, Optional[List]]]] +Options = List[List[Union[str, int, Optional[List]]]] viewF = [ ["front view", 6], diff --git a/src/novelai_python/tool/random_prompt/generate_tags.py b/src/novelai_python/tool/random_prompt/generate_tags.py index e0f39f2..a106056 100644 --- a/src/novelai_python/tool/random_prompt/generate_tags.py +++ b/src/novelai_python/tool/random_prompt/generate_tags.py @@ -5,7 +5,7 @@ from pydantic import BaseModel -type Options = List[List[Union[str, int, Optional[List]]]] +Options = List[List[Union[str, int, Optional[List]]]] cameraAngles = [ ["dutch angle", 5], From d92c11a65b1b4fab5c89cbbe51b518027783b8b4 Mon Sep 17 00:00:00 2001 From: sudoskys Date: Wed, 25 Dec 2024 15:11:36 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=F0=9F=94=A7=20fix:=20correct=20type=20alia?= =?UTF-8?q?s=20syntax=20in=20generate=5Fscene=5Ftags.py=20and=20generate?= =?UTF-8?q?=5Ftags.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tool/random_prompt/generate_scene_composition.py | 4 ++-- src/novelai_python/tool/random_prompt/generate_scene_tags.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/novelai_python/tool/random_prompt/generate_scene_composition.py b/src/novelai_python/tool/random_prompt/generate_scene_composition.py index 4b201d5..560fc73 100644 --- a/src/novelai_python/tool/random_prompt/generate_scene_composition.py +++ b/src/novelai_python/tool/random_prompt/generate_scene_composition.py @@ -2570,7 +2570,7 @@ def random_range(a, b): def select_weighted_option( options: Union[WeightedOptions, WeightedSimpleOptions], conditions: Conditions, -) -> str | int: +) -> Union[str,int]: """ 选择一个加权选项 :param options: 权重 @@ -2609,7 +2609,7 @@ def get_fifth_array(item: WeightedOption) -> List[str]: random.shuffle(filtered_options) # 计算总权重 - def get_weight(item: str | int) -> int: + def get_weight(item: Union[str,int]) -> int: return len(item) if isinstance(item, str) else item total_weight = sum(get_weight(option[1]) for option in filtered_options) diff --git a/src/novelai_python/tool/random_prompt/generate_scene_tags.py b/src/novelai_python/tool/random_prompt/generate_scene_tags.py index a2ff81d..0d7a1d3 100644 --- a/src/novelai_python/tool/random_prompt/generate_scene_tags.py +++ b/src/novelai_python/tool/random_prompt/generate_scene_tags.py @@ -1777,7 +1777,7 @@ def generate_character_traits( """ 生成角色特性。 :param gender: 性别 (例如 'f' 表示女性)。 - :param portrait_type: word of intermediatePortraitsF | fullLengthOnlyF + :param portrait_type: word of intermediatePortraitsF or fullLengthOnlyF :param level: 等级 (影响特征和服饰数量)。 :return: 包含 tags 和 flags。 """