character_portraits_generate.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import os
  2. import json
  3. import asyncio
  4. from typing import Optional
  5. from utils.tools import string_to_json, save_json_file
  6. from tools.banana_pro import generate_image_from_prompt_and_images
  7. # from tools.gemini import generate_image_from_prompt_and_images
  8. from tools.text_generator import media_captioner
  9. from tools.image_generator import image_generator
  10. prompt_front = \
  11. """
  12. 根据以下描述生成角色{identifier}的全身正面肖像,背景为纯白色。角色应位于画面中央,占据画面大部分空间。目光直视前方,双臂自然垂于身体两侧。表情自然。
  13. 特征:{features}
  14. 风格:{style}
  15. """
  16. prompt_side = \
  17. """
  18. 根据提供的正面肖像生成角色{identifier}的全身侧面肖像,背景为纯白色。角色应位于图像中央,占据画面大部分空间。面向左侧。自然站立,双臂放松垂于身体两侧。
  19. """
  20. prompt_back = \
  21. """
  22. 根据提供的正面肖像生成角色{identifier}的全身背面肖像,背景为纯白色。角色应位于图像中央,占据画面大部分空间。不应显示任何面部特征。自然站立,双臂放松垂于身体两侧。
  23. """
  24. class CharacterPortraitsGenerator:
  25. def __init__(self):
  26. pass
  27. def generate_front_portrait(
  28. self,
  29. character: dict,
  30. refer_image_path: list[str] = None,
  31. style: Optional[str] = None
  32. ):
  33. features = "(静态特征)" + character.get("static_features", "") + ";(动态特征)" + character.get("dynamic_features", "")
  34. prompt = prompt_front.format(identifier=character["identifier_in_scene"], features=features, style=style)
  35. # result = await image_generator.generate_without_refer(
  36. # prompt=prompt,
  37. # )
  38. # result.save_url("./output_front.png")
  39. result = generate_image_from_prompt_and_images(
  40. prompt=prompt,
  41. image_paths=refer_image_path if refer_image_path else []
  42. )
  43. return result
  44. def generate_side_portrait(
  45. self,
  46. character: dict,
  47. front_image_path: list[str],
  48. ):
  49. prompt = prompt_side.format(identifier=character["identifier_in_scene"])
  50. print(f"参考图片:{front_image_path}")
  51. # result = await image_generator.generate(
  52. # prompt=prompt,
  53. # image_url=front_image_path
  54. # )
  55. # result.save_url("./output_side.png")
  56. result = generate_image_from_prompt_and_images(
  57. prompt=prompt,
  58. image_paths=front_image_path
  59. )
  60. return result
  61. def generate_back_portrait(
  62. self,
  63. character: dict,
  64. front_image_path: list[str],
  65. ):
  66. prompt = prompt_back.format(identifier=character["identifier_in_scene"])
  67. print(f"参考图片:{front_image_path}")
  68. # result = await image_generator.generate(
  69. # prompt=prompt,
  70. # image_url=front_image_path
  71. # )
  72. # result.save_url("./output_back.png")
  73. result = generate_image_from_prompt_and_images(
  74. prompt=prompt,
  75. image_paths=front_image_path
  76. )
  77. return result
  78. def generate_full_portraits(
  79. self,
  80. character: dict,
  81. style: Optional[str] = None
  82. ):
  83. # front_portrait = await self.generate_front_portrait(character, style)
  84. # side_portrait = await self.generate_side_portrait(character, [front_portrait.data])
  85. # back_portrait = await self.generate_back_portrait(character, [front_portrait.data])
  86. front_portrait = self.generate_front_portrait(character, style)
  87. side_portrait = self.generate_side_portrait(character, [front_portrait.data])
  88. back_portrait = self.generate_back_portrait(character, [front_portrait.data])
  89. return {
  90. "front_portrait": front_portrait,
  91. "side_portrait": side_portrait,
  92. "back_portrait": back_portrait
  93. }
  94. character_portraits_generator = CharacterPortraitsGenerator()
  95. if __name__ == "__main__":
  96. with open("characters.json", "r", encoding="utf-8") as f:
  97. characters = json.load(f)
  98. character = characters["characters"][0]
  99. # front_image_url = asyncio.run(character_portraits_generator.generate_front_portrait(character, style="写实"))
  100. # side_image_url = asyncio.run(character_portraits_generator.generate_side_portrait(character, [front_image_url.data]))
  101. # back_image_url = asyncio.run(character_portraits_generator.generate_back_portrait(character, [front_image_url.data]))
  102. # print(front_image_url, side_image_url, back_image_url)
  103. full_portraits = asyncio.run(character_portraits_generator.generate_full_portraits(character, style="写实"))
  104. print(full_portraits)