Spaces:
Running
Running
import pickle | |
from pathlib import Path | |
import os | |
import requests | |
import tqdm | |
def generate_image(prompt, api_key: str, n=1, size="1024x1024"): | |
""" | |
Generates an image using OpenAI's DALL-E API. | |
:param prompt: The prompt to generate an image for. | |
:param api_key: Your OpenAI API key. | |
:param n: The number of images to generate. | |
:param size: The size of the generated images. | |
:return: The response from the API call. | |
""" | |
headers = { | |
"Content-Type": "application/json", | |
"Authorization": f"Bearer {api_key}" | |
} | |
payload = { | |
"model": "dall-e-3", | |
"prompt": prompt, | |
"n": n, | |
"size": size | |
} | |
response = requests.post("https://api.openai.com/v1/images/generations", | |
headers=headers, | |
json=payload) | |
return response | |
def get_prompt(persona: dict): | |
prompt = f"""A character named {persona['name']} is a {persona['age']} years old. The basic information of this character is as follows: | |
- Name: {persona['name']} | |
- Age: {persona['age']} | |
- Gender: {persona['gender']} | |
- Routine: {persona['routine']} | |
- Personality: {', '.join(persona['personality'])} | |
- Occupation: {persona['occupation']} | |
- Thoughts: {persona['thoughts']} | |
- Lifestyle: {persona['lifestyle']} | |
Please generate a full-face photo of this character. | |
""" | |
return prompt | |
def get_persona_avatar_bytes(persona: dict, api_key: str) -> bytes: | |
prompt = get_prompt(persona) | |
response = generate_image(prompt, api_key) | |
if response.status_code == 200: | |
# 这里可以添加代码来处理响应体,例如保存图像或进一步的处理 | |
image_data = response.json()['data'] | |
assert len(image_data) == 1 | |
image_url = image_data[0]['url'] | |
# download image | |
image_response = requests.get(image_url) | |
image = image_response.content | |
return image | |
else: | |
print(f"Failed to generate image: {response.status_code} - {response.text}") | |
def generate_for_cache(api_key: str): | |
root_path = Path("static/exist_characters") | |
character_dirs = os.listdir(root_path) | |
character_dirs = [root_path / character_dir for character_dir in character_dirs] | |
for character_dir in tqdm.tqdm(character_dirs): | |
character_path = character_dir / f"{character_dir.name}.pkl" | |
character_data = pickle.load(open(character_path, 'rb')) | |
image_path = character_dir / f"avatar.jpg" | |
image_bytes = get_persona_avatar_bytes(character_data['persona'], api_key) | |
if image_bytes: | |
with open(image_path, 'wb') as f: | |
f.write(image_bytes) | |
if __name__ == "__main__": | |
api_key = os.getenv("OPENAI_API_KEY") | |
generate_for_cache(api_key) | |