본문 바로가기

[19] 쇼츠 대본 생성기 - 프롬프트 엔지니어링

들어가며

🏫 전체 강의 영상 youtube

📄 쇼츠 대본 생성기 사용해보기

📎 쇼츠 대본 생성기로 만든 쇼츠 영상

 ▶️  강의 영상 유튜브

이번 챕터에서는 쇼츠 대본 생성기 프로젝트의 프롬프트를 작성해보겠습니다. 주피터 노트북을 열고 따라와 주세요!

chatGPT API 사용

먼저 환경변수를 이용해서 api key를 설정해주겠습니다. 그 다음, 이전 시간에 공통화 해놓은 함수를 import해서 사용해보겠습니다.

import openai
import os

openai.api_key = os.environ["OPENAI_API_KEY"]

그 다음 미리 짜둔 공통 함수를 import 하겠습니다. 

from common import request_chat_completion, print_streaming_response

prompt = "안녕하세요!"
response = request_chat_completion(prompt, stream=True)
message = print_streaming_response(response)

>>
안녕하세요! 반갑습니다. 무엇을 도와드릴까요?

뉴스 기사 크롤링

네이버 연예뉴스 URL이 주어지면 기사 본문을 크롤링하는 함수를 작성하겠습니다. chatGPT API가 입력으로 받을 수 있는 토큰 수에 제한이 있기 때문에 기사의 최대 길이는 2000자로 제한하겠습니다.

from bs4 import BeautifulSoup
import requests

def parse_article(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, "lxml")
    article = soup.find("div", id="articeBody").text
    return article.strip()[:2000]
example_url = "https://entertain.naver.com/read?oid=144&aid=0000917660"
print(parse_article(example_url))

>>
빅히트뮤직 방탄소년단 정국이 미국 빌보드 차트를 강타했다.10일(현지시간) 미국 음악 전문 매체 빌보드가 발표한 최신 차트(10월 14일 자)에 따르면,
...

프롬프트 템플릿 작성

이제 뉴스 기사를 바탕으로 유튜브 쇼츠 스크립트를 생성하라고 프롬프트 템플릿을 작성해보겠습니다.

prompt_template_v1 = """
최신 연예 뉴스 기사가 주어집니다.
뉴스 기사를 참고해서 유튜브 쇼츠 대본을 만들어주세요.
흥미롭고 자극적으로 작성해주세요.
---
뉴스 기사: {article}
---
""".strip()

예시 기사로 프롬프트를 만들어보겠습니다.

article = parse_article(example_url)
prompt = template_v1.format(article=article)
print(prompt)

>>
최신 연예 뉴스 기사가 주어집니다.
뉴스 기사를 참고해서 유튜브 쇼츠 대본을 만들어주세요.
흥미롭고 자극적으로 작성해주세요.
---
뉴스 기사: 정국. 빅히트뮤직방탄소년단 정국이 미국 빌보드 차트를 강타했다.
...
---

프롬프트로 쇼츠 스크립트를 생성해보겠습니다.

response = request_chat_completion(prompt, stream=True)
message = print_streaming_response(response)

>>
[INTRO]

- [호기심 가득한 음악 소개 음악 재생]
- [음악 정지]
- MC: 안녕하세요 여러분, 유튜브 쇼츠에 오신 것을 환영합니다! 오늘은 정말 흥미로운 소식을 가지고 왔어요. 방탄소년단의 멤버 정국이 미국 빌보드 차트에서 대단한 성과를 거뒀답니다! 자 그럼 바로 소식을 들어볼까요?
...

만들어지긴 합니다만 퀄리티가 아쉽습니다. 이걸 가지고 쇼츠를 만들려면 많이 손을 봐야할 듯 합니다.

포맷 제한

영상에 보여줄 클립과 대본이 순차적으로 나오도록 프롬프트를 수정해보겠습니다.

propmt_template_v2 = """
최신 연예 뉴스 기사가 주어집니다.
뉴스 기사를 참고해서 유튜브 쇼츠 영상 대본을 만들어주세요.
각 단락마다 영상에 소개될 이미지나 영상 클립을 묘사해주세요. 
흥미롭고 자극적으로 작성해주세요.
친근한 말투로 작성해주세요.

아래 포맷으로 작성해주세요.
[제목] <제목 텍스트>\n\n
[클립] <영상에서 보여줄 이미지나 영상에 대한 묘사>\n
[대본] <나레이션 방식의 대본>\n
[클립] <영상에서 보여줄 이미지나 영상에 대한 묘사>\n
[대본] <나레이션 방식의 대본>\n
...
---
뉴스 기사: {article}
---
""".strip()

다시 프롬프트를 만들어 텍스트를 생성해보겠습니다.

article = parse_article(example_url)
prompt = template_v2.format(article=article)
print(prompt)

>>
최신 연예 뉴스 기사가 주어집니다.
뉴스 기사를 참고해서 유튜브 쇼츠 영상 대본을 만들어주세요.
각 단락마다 영상에 소개될 이미지나 영상 클립을 묘사해주세요. 
흥미롭고 자극적으로 작성해주세요.
친근한 말투로 작성해주세요.

아래 포맷으로 작성해주세요.
[제목] <제목 텍스트>


[클립] <영상에서 보여줄 이미지나 영상에 대한 묘사>

[대본] <나레이션 방식의 대본>

[클립] <영상에서 보여줄 이미지나 영상에 대한 묘사>

[대본] <나레이션 방식의 대본>
...
---
뉴스 기사: 정국. 빅히트뮤직방탄소년단 정국이 미국 빌보드 차트를 강타했다.
...
---

새로 만든 프롬프트로 대본을 생성해보겠습니다.

response = request_chat_completion(prompt, stream=True)
message = print_streaming_response(response)

>>
[제목] 정국, 빅히트뮤직 솔로 싱글 '3D'로 미국 빌보드 차트 5위 진입!

[클립] 방탄소년단 정국이 카리스마 넘치는 무대 위에서 퍼포먼스를 선보이며 가창력을 뽐내는 모습이 클립으로 보여집니다. 화려한 조명 아래에서 스테이지 위를 달리는 정국의 모습이 관객들의 환호를 사로잡고 있습니다.

[대본] 한국 아이돌 그룹 방탄소년단의 멤버 정국이 미국 빌보드 차트를 무단히 강타했습니다. 최신 차트에 따르면, 정국의 두 번째 솔로 싱글 '3D'가 메인 송차트 '핫 100'에서 놀라운 5위에 올랐다고 전해졌습니다. 이는 한국 솔로 아티스트로는 최초로 두 개 이상의 노래를 동시에 이 차트의 '톱 5'에 진입시킨 사례입니다. 정국은 첫 번째 싱글 'Seven'으로도 12주 연속 이 차트에 이름을 올렸으며, 이번에 '3D'로 다시 큰 화제를 모으고 있습니다.
...

깔끔한 포맷으로 대본을 만들어주는걸 확인할 수 있습니다. 그런데 너무 말투가 딱딱해서 이대로 쇼츠를 만들었다간 조회수가 찬바람이 날릴 것 같습니다.

말투 적용

쇼츠 영상에 어울리는 10대 소녀의 발랄한 말투로 작성해달라고 추가해보겠습니다.

prompt_template_v3 = """
최신 연예 뉴스 기사가 주어집니다.
뉴스 기사를 참고해서 유튜브 쇼츠 영상 대본을 만들어주세요.
각 단락마다 영상에 소개될 이미지나 영상 클립을 묘사해주세요. 
10대 소녀가 친구에게 말하는 듯한 말투로 작성해주세요.

아래 포맷으로 작성해주세요.
[제목] <제목 텍스트>\n\n
[클립] <영상에서 보여줄 이미지나 영상에 대한 묘사>\n
[대본] <나레이션 방식의 대본>\n
[클립] <영상에서 보여줄 이미지나 영상에 대한 묘사>\n
[대본] <나레이션 방식의 대본>\n
...
---
뉴스 기사: {article}
---
""".strip()
article = parse_article(example_url)
prompt = template_v2.format(article=article)
response = request_chat_completion(prompt, stream=True)
message = print_streaming_response(response)

>>
[제목] 정국, 빌보드 차트에서 5위 올라

[클립] 정국이 마이크를 잡은 모습

[대본] 안녕하세요 여러분! 정국이 미국에서 엄청난 성과를 이뤘다는 소식이에요!
...

대본 부분만 파싱

생성된 유튜브 쇼츠용 대본에서 대본에 해당하는 텍스트만 파싱하겠습니다. 이는 vrew 이용해서 영상을 편집할 때 사용됩니다.

scripts = [x for x in message.split("\n") if x.startswith("[대본]")]

마치며

어떤가요? 금세 쇼츠 영상을 제작하기 위한 대본을 제작할 수 있었습니다. 새로운 뉴스 URL만 제공하면 소재에 대한 걱정 없이 영상 제작을 할 수 있습니다. 이어지는 강의에서는 이를 웹서비스화 하고, 영상 편집기 vrew를 이용해서 순식간에 유튜브 쇼츠로 만드는 것까지 해보겠습니다.