character_portrait.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import os
  2. import json
  3. import asyncio
  4. from typing import Optional, Dict
  5. from taskflow import FileIOHandler
  6. from api_modules.ark_image_client_async import AsyncArkImageClient
  7. from taskflow import get_logger
  8. io_handler = FileIOHandler()
  9. logger = get_logger("examples.video_create.mcps.character_portrait")
  10. prompt_portrait = \
  11. """
  12. 根据以下描述生成角色{identifier}的全身三视图肖像,背景为纯白色。从左往右依次为角色{identifier}的正面、侧面、背面;尽可能占满画面。
  13. 角色描述:{features}
  14. 风格:{style}
  15. 保持人物身材比例协调性,不要出现畸形。
  16. """
  17. prompt_refer_portrait = \
  18. """
  19. 请生成图中人物的全身三视图肖像,背景为纯白色,从左往右依次为角色{identifier}的正面、侧面、背面;尽可能占满画面。
  20. 风格:{style}
  21. 保持人物身材比例协调性,不要出现畸形。
  22. """
  23. async def gen_single_character_portrait(
  24. client: AsyncArkImageClient,
  25. character: dict,
  26. size: Optional[str] = "2048x2048",
  27. refer_image: Optional[list[str]] = None,
  28. style: Optional[str] = None
  29. ) -> str:
  30. features = "(静态特征)" + character.get("static_features", "") + ";(动态特征)" + character.get("dynamic_features", "")
  31. if refer_image is not None:
  32. prompt = prompt_refer_portrait.format(identifier=character["identifier_in_scene"], style=style)
  33. else:
  34. prompt = prompt_portrait.format(identifier=character["identifier_in_scene"], features=features, style=style)
  35. response = await client.generate_image(prompt=prompt, size=size, reference_image=refer_image)
  36. image_url = client.get_image_url(response)
  37. return image_url
  38. async def gen_character_portrait(
  39. characters: dict,
  40. size: Optional[str] = "2048x2048",
  41. refer_image: Optional[list[str]] = None,
  42. style: Optional[str] = None
  43. ) -> list[str]:
  44. image_urls = []
  45. for character in characters["characters"]:
  46. image_url = await gen_single_character_portrait(client=client, character=character, size=size, refer_image=refer_image, style=style)
  47. image_urls.append(image_url)
  48. return image_urls
  49. if __name__ == "__main__":
  50. json_file = "./output/run_20251215_164241/step3_characters.json"
  51. with open(json_file, "r", encoding="utf-8") as f:
  52. characters = json.load(f)
  53. character = characters["characters"][1]
  54. print(character)
  55. async def main():
  56. async with AsyncArkImageClient() as client:
  57. image_url = await gen_single_character_portrait(client=client, character=character, refer_image=None, style="写实")
  58. print(image_url)
  59. asyncio.run(main())