ㅁ 개요
O 프로그램 소개
- 이번 글은 이전글([분류 전체보기] - [업그레이드][프로젝트] AI를 이용하여 음성으로 블로그 글 무한 생성하기 - 2.chatGPT로 자동으로 블로그 글쓰기)에 이은 4번째 마지막 글로 이전 글들의 내용을 종합하여, 음성으로 AI에게 블로그 제목만 알려주면 무한으로 블로그 글을 포스팅하는 방법에 대하여 알아보겠습니다.
O 완성된 프로그램 실행 화면
1.프로그램을 실행하면 아래와 같이 실행됩니다.
프로그램을 실행하면 AI가 음성으로 블로그 제목을 물어보는데, 저는 '인공지능의 미래'로 요청하였습니다.
글쓰기 AI는 노션AI, chatGPT3.0, chatGPT3.5 3가지 중 하나를 알아서 랜덤하게 선택 후 실행됩니다.
그 후 모든 내용을 자동으로 진행하고 있습니다.
![](https://blog.kakaocdn.net/dn/cwaykW/btsakicFK6f/RouDFvbvZxIS38P9woAlg1/img.png)
2. 프로그램 완료 후 블로그에 가서 확인 결과 잘 생성된 것을 볼 수 있습니다.
![](https://blog.kakaocdn.net/dn/BkpUm/btsaiaTOc0W/vFDpa3JQOFgkTqQ73FwZZk/img.png)
3. 클릭 후 내용을 보니
![](https://blog.kakaocdn.net/dn/T79bR/btsak3mf94e/Up4SInpzGKVUvuuDLVVvM1/img.png)
그럭 저럭 내용도 괜찮 습니다.
![](https://blog.kakaocdn.net/dn/bkIeEp/btsatV1Y4xd/aemfGmptDAAGvsrXK4iTJk/img.png)
ㅁ 세부 내용
O 완성된 소스
소스명 : 1.py
from notionai import NotionAI # pip install --upgrade notionai-py
from tistory import Tistory # pip install tistory
import openai # pip install openai
import markdown # pip install markdown
from translate import Translator # pip install translate
import requests
import urllib.request
from config import *
import time
import random
# 카카오 칼로 APIdlm REST API 호출, 이미지 파일 처리에 필요한 라이브러리
import json
import io
import base64
from PIL import Image
from datetime import datetime
import os
# 음성번역관련 구글 모듈
import speech_recognition as sr
from gtts import gTTS
import os
import time
import playsound
now=datetime.now()
date_ = str(now.year)+"-"+str(now.month)+"-"+str(now.day)+"-"+str(now.hour)+"-"+str(now.minute)
createImg = date_+"_img.png"
###################
# 0. Prepare APIs #
###################
openai.api_key = OPENAI_API_KEY
notion_ai = NotionAI(NOTION_TOKEN, NOTION_SPACE_ID)
ts = Tistory(BLOG_URL, CLIENT_ID, CLIENT_SECRET)
ts.access_token = ACCESS_TOKEN
openai.api_key = OPENAI_API_KEY
translator = Translator(from_lang='ko', to_lang='en')
######################################################
#-----------------------------------
# text To Voice
def textToVoice(text):
tts = gTTS(text=text, lang='ko')
filename='voice3.mp3'
tts.save(filename) # 파일을 만들고,
playsound.playsound(filename) # 해당 음성파일을 실행(즉, 음성을 말함)
os.remove(filename)
#-----------------------------------
# mike To Speech
def voiceToText():
r = sr.Recognizer()
with sr.Microphone() as source:
print("say something: ")
audio = r.listen(source)
said = " "
try:
said = r.recognize_google(audio, language="ko-KR")
print("Your speech thinks like: ", said)
except:
pass
time.sleep(3)
# except Exception as e:
# print("Exception: " + str(e))
return said
#-----------------------------------
# 이미지 생성하기 요청
def t2i(text, batch_size=1):
r = requests.post(
'https://api.kakaobrain.com/v1/inference/karlo/t2i',
json = {
'prompt': {
'text': text,
'batch_size': batch_size
}
},
headers = {
'Authorization': f'KakaoAK {REST_API_KEY}',
'Content-Type': 'application/json'
}
)
# 응답 JSON 형식으로 변환
response = json.loads(r.content)
return response
# Base64 디코딩 및 변환
def stringToImage(base64_string, mode='RGBA'):
imgdata = base64.b64decode(str(base64_string))
img = Image.open(io.BytesIO(imgdata)).convert(mode)
return img
#-----------------------------------
# 글쓰기 : notionAI
def writePostbyNotion():
# print('[1] notionAI가 글 쓰는 중...')
content = notion_ai.blog_post(f'write a blog about {TOPIC}').strip()
TOPIC = content.split('\n')[0].replace('#', '').strip()
return content
#-----------------------------------
# 글쓰기 : chatGPT3.5
def writePostbyChatGPT35():
# chatGPT 3.5(유료)
messages = [
{'role': 'system', 'content': 'You are a helpful assistant.'},
{'role': 'user', 'content': TOPIC+' 로 블로그 글 1000자 내외로 간결하고 포인트있게 써줘'},
]
response = openai.ChatCompletion.create(
model='gpt-3.5-turbo',
messages=messages
)
time.sleep(5)
# print(response)
content = str(response['choices'][0]['message']['content']).strip()
return content
#-----------------------------------
# 글쓰기 : chatGPT3.0
def writePostbyChatGPT30():
# chatGPT 3.0(유료)
response = openai.Completion.create(
model="text-davinci-003",
prompt=TOPIC,
temperature=1,
max_tokens=4000
)
time.sleep(5)
content = str(response['choices'][0]['text']).strip()
# print(content)
return content
######################################################
while True:
textToVoice("만들 블로그 제목을 알려주세요")
TOPIC = voiceToText()
print(TOPIC)
if '굿바이' in TOPIC:
textToVoice("chatGPT를 종료합니다.")
print("chatGPT를 종료합니다.")
break
writePost_L = ['노션', '챗GTP3.5', '챗GPT3.0']
writePost = random.randrange(0,2)
print("랜덤 글쓰기: ", writePost, " 번 ", writePost_L[writePost])
print('[1] '+writePost_L[writePost]+' AI가 글 만드는 중...')
textToVoice(writePost_L[writePost]+" AI가 글 만드는 중입니다")
# TOPIC = 'AI와 공존하는 방법'
########################
# 1. random Write a blog post #
########################
# writePost = 1
if writePost == 0:
content = writePostbyNotion()
print(content)
elif writePost == 1:
content = writePostbyChatGPT35()
print(content)
elif writePost == 2:
content = writePostbyChatGPT30()
print(content)
else:
print("무언가 이상합니다. 확인이 필요합니다. 글쓰기를 중단합니다.")
title = TOPIC
print(f'[*] 제목: {title}')
translation = translator.translate(title)
print(f'[*] 영문 제목: {translation}')
#######################
# 2. Generate a image #
#######################
print('[2] 카카오 칼로 API가 서버에 이미지 생성 및 로컬에 저장하는 중...')
textToVoice("카카오 칼로 API가 서버에 이미지 생성 및 로컬에 저장하는 중입니다")
# 이미지 생성하기 REST API 호출
response = t2i(translation, 1)
# print(response)
# 응답의 첫 번째 이미지 생성 결과 출력하기
img_path = f'imgs/{TOPIC}.png'
result = stringToImage(response.get("images")[0].get("image"), mode='RGB')
result.save(img_path)
# result.show()
#######################
## 3. Upload a image ##
#######################
print('[3] 생성한 이미지를 티스토리 이미지 서버에 업로드 하는 중...')
textToVoice("생성한 이미지를 티스토리 이미지 서버에 업로드 하는 중입니다.")
files = {'uploadedfile': open(img_path, 'rb')}
params = {'access_token': ACCESS_TOKEN, 'blogName': ts.blog_name, 'targetUrl': BLOG_URL, 'output':'json'}
res_upload = requests.post('https://www.tistory.com/apis/post/attach', params=params, files=files)
print(res_upload)
# replacer = res_upload.json()['tistory']['replacer']
# print(replacer, type(replacer),"++++++++++++++++++++++++")
imgurl = res_upload.json()['tistory']['url']
# print(imgurl, type(imgurl),"++++++++++++++++++++++++")
#
<class 'str'> ++++++++++++++++++++++++
#######################
# 4. Write a new post #
#######################
print('[4] 티스토리 내 블로그에 포스팅 업로드 하는 중...')
textToVoice("티스토리 내 블로그에 포스팅 업로드 하는 중입니다.")
# content = f"""
# <p>{replacer}</p>
# {content}
# """
# content1 = "<img src='https://blog.kakaocdn.net/dn/bXabVT/btsaiqvMclf/KQOxk6HzQs4EO56bfJ1Bu1/img.png' alt='AI Image'>"
content1 = '<img src='+imgurl+' >'
content2 = f"""
{content}
"""
content = content1 + content2
html = markdown.markdown(content)
res_post = ts.write_post(
title=title,
content=html,
visibility='3', # 발행상태 (0: 비공개 - 기본값, 1: 보호, 3: 발행)
acceptComment='1') # 댓글 허용 (0, 1 - 기본값)
print(res_post)
print(f"[*] 내 티스토리 블로그 포스팅 완료! {res_post['tistory']['url']}")
time.sleep(20)
O 주요 내용
- 이전 포스팅의 내용과 많이 유사하므로 다른 내용 위주로 간략하게 살펴 보겠습니다.
자세한 내용은 이전 포스팅 참조
[파이썬 프로젝트 및 응용/AI(인공지능)로 블로그 자동 포스팅 하기] - [프로젝트] AI(인공지능)로 블로그 자동 포스팅 하기 - 1.소개편
1. 관련 모듈을 임포트 해줍니다.
2. 각 AI의 API를 사용하기 위해서 API키를 준비해 줍니다.
그리고 안내를 위해 텍스트를 음성으로 바꿔주는 함수를 정의 하였습니다.
3. 마찬가지로 음성을 텍스트로 바꿔주는 함수를 만들었습니다.
4. 카카로 칼로AI로 이미지를 생성하기 이해서 아래와 같이 관련 함수를 코딩합니다.
5. 블로그 글을 쓸때 여러 AI를 사용하기 위해서 각 각의 함수로 정의해 놓습니다.
6. 메인 코드에서는 글을 쓰는 AI를 랜덤하게 선택하기 위해서 random모듈의 randrange()함수를 이용하였습니다.
7.위의 코드의 결과 값(0~2)에 따라 if문으로 AI를 선택해 줍니다.
8. 하단에 코드(line 234)에서 로컬의 이미지를 업로드 후 받은 리턴 값 중 replacer가 아닌 이미지url 주소로 받았습니다.
이는 replacer 코드로 받고 content에 내용을 포함하는 경우 이미지 내에 <p>태그와 일부 글자가 포함되는 오류가 발생하여 이미지 url 주소로 처리하였습니다.
9. 마지막으로 이미지와 텍스트를 합쳐서 html 형식으로 만든 후 티스토리 블로그에 게시 하였습니다.
ㅁ 정리
O 우리가 배운 내용
이것으로 'AI를 이용하여 음성으로 블로그 글 무한 생성하기' 업그레이드 편을 모두 마칩니다.
댓글과 하트는 제가 이글을 지속할 수 있게 해주는 힘이 됩니다.
위의 내용이 유익하셨다면, 댓글과 하트 부탁드립니다.
감사합니다.
※ 추가적인 정보는 아래 유튜브 영상에서 해당 내용을 더욱 자세히 보실 수 있습니다.