Raspberry Pi s displejem TFT ILI9143 - zobrazení ilustrace podle počasí vygenerované pomocí Chat GPT

15.12.2023 Raspberry Pi #raspberrypi #tft #gpt

Prostřednictvím vydání svého API otevřel OpenAI možnosti ChatGPT všem. Nyní lze bez problémů integrovat výkon ChatGPT do vaší aplikace. Příklad ukazuje, jak využít API Chat GPT pro zobrazení vygenerované ilustrace podle aktuálního počasí .


Abyste mohli začít používat ChatGPT API, musíte nejprve získat klíče OpenAI API. Zaregistrujte se nebo se přihlaste na oficiální platformu OpenAI.

Jakmile jste přihlášeni, klikněte na kartu Osobní v pravé horní části. Z rozbalovací nabídky vyberte možnost Zobrazit klíče API a zobrazí se klíče API na stránce vygenerujete klíč API.Vytvořit nový tajný klíč. Kliknutím na tlačítko.

Klíč nebudete moci znovu zobrazit, proto jej uložte na bezpečném místě.

Prerekvizity:

  1. Zapojení TFT displeje s Raspbery Pi.
  2. Základy používání ChatGPT API.

Programový kód - Python

import requests
from bs4 import BeautifulSoup
from openai import OpenAI
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import urllib.request

import Adafruit_ILI9341 as TFT
import Adafruit_GPIO as GPIO
import Adafruit_GPIO.SPI as SPI

# URL adresa stránky s počasím
url = 'https://weather.com/en-GB/pocasi/dnes/l/EZXX0012:1:EZ'

# Stáhnout stránku
response = requests.get(url)

# API klíče
OPENAI_API_KEY ="YOUR_API_KEY"

# Nastavení OpenAI klíče
client = OpenAI(api_key=OPENAI_API_KEY)

def Chat_GPT(api_key, query):
    messages = [
        {
            "role": "system",
            "content": "You are a very creative and interesting writer."
        },
        {
            "role": "user",
            "content": query
        }
    ]
    try:
        response = client.chat.completions.create(
            model = "gpt-3.5-turbo",
            temperature = 0.2,
            max_tokens = 50,
            messages = messages)
        return response.choices[0].message.content.strip()
    except Exception as e:
        print(f"Chyba při volání OpenAI API: {e}")
        return None

def dall_e2(prompt):
    response = client.images.generate(prompt=prompt,
            n=1,
            size="256x256")
    image_url = response.data[0].url
    urllib.request.urlretrieve(image_url, "image.png")

    im = Image.open("image.png")
    im_resized = im.resize((240, 240))
    im_resized = im_resized.convert('RGB')
    im_resized.save("image_resized.png", format="png")

def getWeather(url):
    weather = {}
    # Vytvoření objektu BeautifulSoup pro analýzu HTML.
    soup = BeautifulSoup(response.text, 'html.parser')

    # Nalezení elementu s aktuálním počasím.
    weather_element = soup.find('div', class_='CurrentConditions--CurrentConditions--1XEyg')

    # Získání informací o počasí.
    weather['location'] = weather_element.find('h1', class_='CurrentConditions--location--1YWj_').get_text()
    weather['temperature'] = weather_element.find('span', class_='CurrentConditions--tempValue--MHmYY').get_text()
    weather['condition'] = weather_element.find('div', class_='CurrentConditions--phraseValue--mZC_p').get_text()
    weather['locForPrint'] = weather['location'].split(",") # Získat pouze město

    # Výpis informací o počasí
    print(f"Weather in {weather['location']}")
    print(f"Temperature: {weather['temperature']}")
    print(f"State of the weather: {weather['condition']}")

    return weather

weatherResult = getWeather(url)

query = f"The current weather in {weatherResult['location']} is {weatherResult['condition'].lower()} with a temperature of {weatherResult['temperature']}. Can you create a creative story in this situation in two sentences?"
story = Chat_GPT(OPENAI_API_KEY, query)
print(story)

dall_e2("A painting realistic photo of a story: " + story)

# Raspberry Pi konfigurace.
DC = 18
RST = 23
SPI_PORT = 0
SPI_DEVICE = 0

# Vztvoření TFT instance třídy.
disp = TFT.ILI9341(DC, rst=RST, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=64000000))

# Inicializace displaye.
disp.begin()

# Otevření obrázku.
print ('Loading image...')
image = Image.open('image_resized.png')

# Změna velikosti obrázku.
#image = image.rotate(90).resize((240, 320))

# Vykreslení obrázku.
print ('Drawing image')
#disp.display(image)

# Vytvoření nového obrázku s prostorem pro text
new_height = image.height + 30  # přidat prostor pro text
new_image = Image.new("RGB", (image.width, new_height), "white")

# Umístění původního obrázku na nový obrázek
new_image.paste(image, (0, 0))

# Přidání textu
new_image.paste(image, (0, 0))
draw = ImageDraw.Draw(new_image)
font = ImageFont.load_default()  # nebo použijte vlastní font
text = f"{weatherResult['locForPrint'][0]}, {weatherResult['condition']}, {weatherResult['temperature']}" 
text_x = 15  # Pozice X pro text
text_y = image.height + 5  # Pozice Y pro text (pod obrázkem)
draw.text((text_x, text_y), text, font=font, fill="black")

resized_image = new_image.resize((240, 320))
disp.display(resized_image)

Základem programového kódu jsou tři funkce:

  1. getWeather - získává aktuální počasí z URL stránky stažením html obsahu a následně rozparsování zdrojového kódu podle konkrétních elementů. Tím se se získá lokalita, definice počasí, teplota. Tato data jsou použity jako doplňující informace pro dotaz na ChatGPT.
  2. Chat_GPT - funkce pro komunikaci s Caht GPT, kdy na základě složeného dotazu dojde k vygenerování nového dotazu ve formě uměleckého textu určeného pro generování obrázku.
  3. dall_e2 - na základě dotazu vygenerovaného ve funkci Chat_GPT dojde k vygenerování obrázku. Je vrácena jeho adresa a uložen do lokálního uložiště.

Následně již dojde pouze k úpravě obrázku a k zobrazení na displeji spolu s informacemi o lokalitě, stavu počasí a teplotě.