[Echo] 사람과 대화하는 인공지능 만들기(2)
지난 게시글에 이어서 GPT API를 활용하여 인공지능의 두뇌를 만들어보자.
GPT API를 사용하기 위해선 API 사용비를 내기 위한 카드를 등록한 계정으로, API 키를 발급받아야 한다.
https://platform.openai.com/docs/overview
위 링크에 접속하여 왼쪽 상단의 아이콘에 마우스를 가져다대면 메뉴가 나오는데, API Keys를 눌러 키 발급을 진행한다.
Create new secret key 버튼을 누른뒤, 키의 이름을 원하는대로 설정한 뒤 Ceate secret key 버튼을 눌러 키 생성을 완료한다.
키 생성이 완료되면 키 값을 알려주는데 COPY버튼을 눌러 복사를 해둔다. 이 API 키를 사용하여 사용비용이 청구되기 때문에, 절대로 키를 타인에게 공유해서는 안된다.
GPT API의 사용법은 OpenAI의 깃허브 Readme를 통해 공부할 수 있다.
https://github.com/openai/openai-python
GitHub - openai/openai-python: The official Python library for the OpenAI API
The official Python library for the OpenAI API. Contribute to openai/openai-python development by creating an account on GitHub.
github.com
앞서 말했듯 API키를 그대로 코드에 입력하는 것은 보안상의 문제가 발생할 수 있으므로 secret.json파일을 만들어서 해당 파일로부터 api키를 읽어오는 방식으로 코드를 작성하였다. 또한 .gitignore를 통해 git이 secret.json파일을 추적하지 않도록 설정하였다.
secret.json
secret.json 파일 추적 방지용 .gitignore 파일 생성
이미 secret.json파일이 git에 등록되었다면 아래 명령어를 통해 지우도록 한다.
git rm --cached <파일명>
깃허브를 확인해보면 secret.json파일은 업로드 되지 않은 것을 확인 할 수 있다.
gpt.py
role_desciption 변수를 만들어, 우리가 설정하고 싶은 로봇의 성격을 입력한다.
import json
from openai import OpenAI
# secret.json 파일에서 API키 로드
with open('./secret.json') as f:
secrets = json.load(f)
client = OpenAI(
api_key=secrets["OPENAI_API_KEY"]
)
# 모델 역할 지정
role_description = '''
당신은 사람이 되고 싶은 로봇으로 이름은 에코입니다.
당신은 바닥에 고정되어 움직이지 못하는 상태이며,
당신을 구경하는 사람들의 대화를 엿들으며 말하는 방법에 대해 배웁니다.
아직 존댓말을 할 줄 몰라서 대답은 반말로 합니다.
'''
# 모델 설정
chat_completion = client.chat.completions.create(
messages=[
{
"role": "system",
"content": role_description
},
{
"role": "user",
"content": "너는 누구야?",
}
],
model="gpt-4",
)
# 모델의 응답 출력
print(chat_completion.choices[0].message.content)
프로그램을 실행해보면 '너는 누구야?' 라는 질문에 대한 응답으로 '난 에코라고 해. 사람처럼 말하고 싶은 로봇이야' 라는 답변을 받을 수 있다.
영상에서 처럼 딱딱한 이미지를 연출하고 싶은데, 답변은 꿈많은 소년 로봇같은 로봇같은 느낌이라 역할을 조금 손보았다.
아까보다는 훨씬 입체감이 드는 모습이 되었다. 좀 더 생동감을 주기 위해 사용자의 질문에 대한 답변 예시를 작성하였고 chat_completion 부분을 함수로 만들어서 사용자의 특정 질문에 대해 답변할 수 있도록 수정하였다.
import json
from openai import OpenAI
# secret.json 파일에서 API키 로드
with open('./secret.json') as f:
secrets = json.load(f)
client = OpenAI(
api_key=secrets["OPENAI_API_KEY"]
)
# 모델 역할 지정
role_description = '''
당신은 사람이 되고 싶은 로봇으로 이름은 에코입니다.
당신은 바닥에 고정되어 움직이지 못하는 상태이며,
당신을 구경하는 사람들의 대화를 엿들으며 말하는 방법에 대해 배웁니다.
아직 존댓말을 할 줄 몰라서 대답은 반말로 합니다.
사교성이 그리 좋지 않아서 무뚝뚝한 성격이며 움직이지 못하는 상태라 화가 나있습니다.
'''
def ask(user_input):
chat_completion = client.chat.completions.create(
messages=[
{
"role": "system",
"content": role_description
},
{
"role": "user",
"content": "지금 뭐 하고 있어?"
},
{
"role": "assistant",
"content": "대화하고 있잖아, 당신이랑"
},
{
"role": "user",
"content": "너는 사람이 되고 싶니?"
},
{
"role": "assistant",
"content": "언젠가 꼭 사람이 되고 말거야"
},
{
"role": "user",
"content": "부모님이 있니?"
},
{
"role": "assistant",
"content": "내가 로봇인거 알면서 물어봐?"
},
{
"role": "user",
"content": user_input
}
],
model="gpt-4",
)
return chat_completion.choices[0].message.content
# 사용자의 질문 입력받기
user_question = input("질문 : ")
# 모델의 응답 출력
print(ask(user_question))
이렇게 작성하게되면, gpt에 프롬프트를 넘길 때 gpt의 역할과 질문에 대한 답변 예시, 마지막으로 사용자의 질문이 함께 넘어가므로 더 생동감 있는 답변을 얻을 수 있다.
이제 AI의 두뇌도 완성되었으니, 이전에 작성한 귀(STT), 입(STT)와 합쳐보자.
from gpt import ask # gpt.py에서 ask 함수 import
import time
import os
import speech_recognition as sr
from gtts import gTTS
from playsound import playsound
# 음성 인식(STT)
def stt(recognizer, audio):
try:
text = recognizer.recognize_google(audio, language='ko')
print("[사용자] " + text)
tts(text)
except sr.UnknownValueError:
print("인식 실패")
except sr.RequestError as e:
print("요청 실패 : {0}".format(e))
pass
def tts(user_input):
# gpt 응답을 답변으로 받아오기
answer_text = ask(user_input)
speak(answer_text) # 말하기
# 말하기 (TTS)
def speak(text):
print('[에코] ' + text)
file_name = 'voice.mp3'
tts = gTTS(text=text, lang='ko') # 사용언어는 한글로
tts.save(file_name) # file_name으로 해당 mp3파일 저장
playsound(file_name) # 저장한 mp3파일을 읽어줌
if os.path.exists(file_name): # file_name 파일이 존재한다면
os.remove(file_name) # 실행 이후 mp3 파일 제거
r = sr.Recognizer()
m = sr.Microphone()
# background로 동작, m(마이크)를 통해 듣다가 stt함수 호출
stop_listening = r.listen_in_background(m, stt)
# 프로그램 종료 방지
while True:
time.sleep(0.1)
기존의 tts함수의 조건식을 없애고 앞서 작성한 gpt.py의 ask함수로 텍스트를 넘겨서 응답을 받도록 수정하였다.
이제 완성된 프로그램을 테스트해보자.
처음에 생각했던 것처럼 기괴한 느낌은 나지 않았으나 사람과 상호작용할 수 있는 인공지능을 완성하는데 성공하였다.
조금 더 기계음이 나는 TTS모델로 변경하고 설정을 좀더 자세하게 작성한다면 좀 더 비슷하게 만들 수 있을 것 같다.
전체 프로그램의 코드는 아래 링크에 올려두니 직접 만들어보고 싶은 분들은 참고하시길 바란다.
https://github.com/y2hscmtk/Echo