Profile picture

[Python] 칼로(Karlo) API로 이미지 생성하기

JaehyoJJAng2024년 02월 22일

▶︎ Karlo

Karlo는 카카오에서 개발한 이미지 생성 AI이다.

GPT의 Dalle와 비슷하게 텍스트만으로 AI 이미지를 생성해볼 수 있다.

또한, 일일 Quota(사용량 제한)가 적용되어 있기 때문에 무료로 무한정 사용할 수 있는 것은 아니다.

적용 한도는 https://developers.kakao.com/docs/latest/ko/getting-started/quota에서 자세하게 확인이 가능하다.
image


▶︎ 시작하기

칼로 각 API는 적용 가능한 모델 버전이 존재하며, version으로 적용할 모델 버전을 선택할 수 있다.
image


‣ API 키 발급

Karlo API를 사용하기 위해서는 KAKAO API 키를 발급 받아야 한다.

아래의 카카오 개발자 사이트로 들어가 로그인을 해주자.
https://developers.kakao.com/console/app


그리고 내 애플리케이션 탭으로 들어가 새로운 애플리케이션을 추가하자.
image
대충 입력하고 저장해주도록 하자.
그리고나서 리스트에 추가된 앱 이름을 누르면 앱 키 4개가 발급된 것을 볼 수 있을 것이다.
(네이티브 앱 키, Rest API 키, Javascript 키, Admin 키)

우리는 Karlo API를 사용하는데 필요한 REST API 키만 복사하여 어딘가에 붙여넣도록 하자.


‣ API 사용방법


API 호출에 필요한 파라메터들은 위 Docs에서 자세하게 알아볼 수 있다.

여기서 우리는 아주 간단한 이미지 생성 코드를 작성해볼 것이다.


먼저 코드를 구동하는데 필요한 패키지들을 다운로드 받기 위해 아래 명령어를 실행해주도록 하자.

pip install requests, python-dotenv, image

메인코드를 작성해보자.
아래 코드는 카카오 공식 Docs에서 그대로 가져와 조금 수정한 것이다.

carlo.py

# REST API 호출, 이미지 파일 처리에 필요한 라이브러리
import urllib.request
import requests
import json
import urllib
import os
from PIL import Image
from dotenv import load_dotenv
from googletrans import Translator

def get_environment(dotenv_path: str='.env') -> str:
  load_dotenv(dotenv_path=dotenv_path)
  return os.getenv('KARLO_API_KEY')

class Karlo():
    def __init__(self) -> None:
        self.api_key: str = get_environment()
        self.google = Translator()
    
    def create_image(self, prompt: str, negative_prompt: str) -> dict[str,str|list]:
        r = requests.post(
            'https://api.kakaobrain.com/v2/inference/karlo/t2i',
            json = {
                "version": "v2.1", 
                "prompt": prompt,
                "negative_prompt": negative_prompt, 
                "height": 1024,
                "width": 1024
            },
            headers = {
                'Authorization': f'KakaoAK {self.api_key}',
                'Content-Type': 'application/json'
            }
        )
        # 응답 JSON 형식으로 변환
        response = json.loads(r.content)
        return response
  
    def translate_text(self, ko_messages: str) -> str:
        result: str = self.google.translate(text=ko_messages, dest='en')
        return result.text
    
    def save_image(self, response: dict[str,str|list]) -> None:
        result = Image.open(urllib.request.urlopen(response.get('images')[0].get('image')))
        result.save(fp='ai_image.png', format='PNG')

def main() -> None:
    # Create instance 
    karlo: Karlo = Karlo()
    
    # 프롬프트 지정
    ko_prompt: str = '너가 생각하는 미래의 공상 과학 배경을 그려줘.'
    negative_prompt: str = '' # 이미지 변환 시 제외할 요소 지정
    
    # 프롬프트 번역
    prompt: str = karlo.translate_text(ko_messages=ko_prompt)
    
    # 이미지 생성
    response = karlo.create_image(prompt=prompt, negative_prompt=negative_prompt)
    
    # 이미지 다운로드
    karlo.save_image(response=response)

if __name__ == '__main__':
    main()

response의 응답 값은 아래와 같다.

{'id': '1b010bcbae50b5e4', 'model_version': 'v2.1.1.prod', 'images': [{'id': 'a2FybG8tdHJpdG9uLXYyLjEuMS04NGZkOWNkNTQ1LXF0bGo2-1957bff0-fc01-4ba9-90e1-60676e2e6111', 'image': 'https://mk.kakaocdn.net/dna/karlo/image/2024-02-22/15/1957bff0-fc01-4ba9-90e1-60676e2e6111.webp?credential=smxRqiqUEJBVgohptvfXS5JoYeFv4Xxa&expires=1713769140&signature=m4oaGyebkCPPwzt5zhVpqZKcfh4%3D', 'seed': 3364928144, 'nsfw_content_detected': None, 'nsfw_score': None}]}

‣ 결과물

아래 이미지는 위 코드를 기반으로 '너가 생각하는 미래의 공상 과학 배경을 그려줘.' 라는 질문을 던졌을 때 생성된 이미지이다.
image


Loading script...