Papago NMT API를 이용하여 자동번역 카카오챗봇 만들기

안녕하세요.

네이버의 Papago NMT API를 이용하여 자동번역 카카오톡 챗봇을 구현해 보겠습니다.

사전 준비

카카오톡 OBT 신청

개발 환경

Goorm IDE, Flask, Python, Kakaotalk, Naver API


1. Naver Developers App 생성

https://developers.naver.com/products/nmt/

우선 위 링크에 들어가서 오픈 API이용 신청을 클릭합니다.

이후 사용 API가 Papago 번역이 맞는지 확인하시고,

비로그인 오픈 API서비스 환경에서 Web설정을 선택하시고

웹서비스 url은 우선 http://naver.com 등 아무 url이나 적어줍니다.

추후에 스킬서버 url과 같은 url을 입력해주시면 됩니다.

(사실 이 기능이 뭔지 잘 모르겠습니다.)

생성이 완료 되었다면, 어플리케이션 정보에 가셔서 Client ID와 Client Secret을 메모장에 복사붙여넣기 해줍니다.


2. Goorm IDE API 서버 생성

2020/05/30 - [Programming] - Teachable Machine Model과 카카오 챗봇 연동시키기

Goorm IDE에 로그인하시고, 새 컨테이너를 flask stack으로 생성해 줍니다.

위 링크와 동일하게 진행하시고, app.py와 papago.py를 만들어줍니다.

app.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import flask
from papago import papago

app = flask.Flask(__name__)


@app.route("/param", methods=["POST"])
def param():

req = flask.request.get_json()
global lang_from
lang_from = req['value']['origin']
global lang_to
lang_to = req['value']['origin']
print(req)


@app.route("/translate", methods=["POST"])
def translate():

req = flask.request.get_json()

txt = req['userRequest']['utterance']
req['contexts'][0]['lifespan'] = 1
lang_from = req['contexts'][0]['params']['대상언어']['value']
lang_to = req['contexts'][0]['params']['번역언어']['value']

ret = papago(txt, lang_from, lang_to)

print(req)
res = {
"version": "2.0",
"template": {
"outputs": [
{
"simpleText": {
"text": ret
}
}
]
}
}
print(res)
return flask.jsonify(res)

if __name__ == "__main__":
app.run(host='0.0.0.0')

papago.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import urllib.request
import json


def select_lang(lang_from, lang_to):
if lang_from == '한국어':
source = 'ko'
elif lang_from == '영어':
source = 'en'
elif lang_from == '독일어':
source = 'de'
elif lang_from == '러시아어':
source = 'ru'
elif lang_from == '프랑스어':
source = 'fr'
else:
source = 'en'
if lang_to == '한국어':
target = 'ko'
elif lang_to == '영어':
target = 'en'
elif lang_to == '독일어':
target = 'de'
elif lang_to == '러시아어':
target = 'ru'
elif lang_to == '프랑스어':
target = 'fr'
else:
target = 'ko'
return (source, target)

def papago(txt, lang_from, lang_to):
client_id = "YOUR_CLIENT_ID" # 개발자센터에서 발급받은 Client ID 값
client_secret = "YOUR_CLIENT_SECRET" # 개발자센터에서 발급받은 Client Secret 값

encText = urllib.parse.quote(txt)
source, target = select_lang(lang_from, lang_to)
data = "source=" + source + "&target=" + target + "&text=" + encText

url = "https://openapi.naver.com/v1/papago/n2mt"

request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id", client_id)
request.add_header("X-Naver-Client-Secret", client_secret)

response = urllib.request.urlopen(request, data=data.encode("utf-8"))
rescode = response.getcode()

if (rescode != 200):
print("Error Code:" + rescode)
return 'Cannot translate'

response_body = response.read().decode('utf-8')
res = json.loads(response_body)

return (res['message']['result']['translatedText'])

papago.py에서 client_id와 client_secret 부분에 메모장에 복사해두었던 naver app의 아이디와 시크릿코드를 입력합니다.

코드진행은 이렇습니다.

  1. 유저가 카카오톡으로 발화를 보냄
  2. 발화가 POST요청으로 들어오면 request를 파싱하고, papago 함수를 실행
  3. encText에 대해서 source언어를 target언어로 번역 후 번역된 message를 return
  4. return value를 response의 text로 보냄.

app.py에서 request를 받을 때 나타나는 [‘context’]는 아래 카카오 오픈빌더 부분에서 다루도록 하겠습니다.

여기까지 진행이 되셨다면,

포트포워딩 후 명령어를 메모장에 복사 붙여넣기 해줍니다.


3. 카카오 챗봇 설정

2020/05/30 - [Programming] - Teachable Machine Model과 카카오 챗봇 연동시키기

위의 내용과 동일하게 채널을 생성해 주고, 오픈빌더에 접속합니다.

스킬탭으로 가서 번역 스킬을 만들어줍니다.

포트포워딩 후 복사해놨던 명령어를 스킬서버 url에 붙여넣기 하고 저장을 눌러줍니다.

이번 챗봇은 시나리오 연결을 살짝 복잡하게 꾸며봤습니다.

저는 웰컴블록과 폴백블록을 통해서 번역언어를 선택하도록 할 것이고,

번역언어 선택과 번역탈출, 번역 세 개의 시나리오로 구성해보았습니다.

source 언어와 target 언어를 파라미터로 입력받고 그 두 개의 파라미터를 스킬서버로 보낼 것입니다.

이 때 context의 역할이 중요해집니다.

위와 같이 번역언어를 선택하는 블록에서

대상언어와 번역언어라는 두 개의 파라미터를 만들어준 후에

봇 응답을 받아주고,

저 응답이 나오는 동시에 스킬을 진행할 것입니다.

이를 위해서는 컨텍스트를 연결해주어야 합니다.

컨텍스트를 연결해주면 바로연결 버튼 등을 통해 블록을 연결해주지 않더라도

맥락이 실행되면 자동으로 다음 블록이 실행되게 됩니다.

따라서 파라미터와 같이 새로운 스킬블록으로 넘겨줄 수 있는 것이죠.

코드에서 lifespan을 1로 할당해주는 이유는

컨텍스트는 0회-10회의 입력밖에 받지 못하기 때문입니다.

우측 상단에 점 세 개 표시를 누르게 되면 컨텍스트 설정 버튼이 나타납니다.

번역언어 선택 블록에서 output 컨텍스트에 translate라는 맥락을 만들어줍니다.

번역 블록에서는 봇 응답을 스킬데이터 사용으로 설정해주고,

input 컨텍스트에 번역언어 선택 블록에서 만든 translate라는 맥락을 연결시켜 줍니다.

발화가 없는 번역 블록이 실행되면 context의 lifespan이 계속 1로 초기화되기 때문에,

탈출 블록이 없으면 api가 계속해서 호출됩니다.

따라서 번역탈출 블록에 패턴 발화를 입력해주고,

봇 응답에 다시 번역언어 선택 블록으로 돌아갈 수 있게 구성해 주었습니다.

따라서 본 봇은

웰컴 블록 실행 -> 번역언어선택 블록 -> 번역 블록 (무한루프)

탈출 블록이 실행되었다면 번역언어선택 블록 -> 번역 블록 (반복)

위와 같은 방식으로 동작하게 됩니다.

여기까지 완료되었다면, 배포를 하신 후에 생성한 채널과 대화를 시작합니다.

잘 작동하는 것을 확인할 수 있습니다 ^^

Papago NMT API를 이용하여 자동번역 카카오챗봇 만들기

https://l-yohai.github.io/auto-translated-chatbot-using-papago-api/

Author

Yohan Lee

Posted on

2020-06-06

Updated on

2021-08-22

Licensed under

댓글