この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、ソン・ヨンジンです。
NAVERの翻訳サービスpapagoのオープンAPIを使ってAPI GatewayとLambdaでSlackのアプリを作成してみました。
papagoは?
papagoはNAVER無料で提供する機械翻訳サービスで、NAVER LABSが独自開発した人工神経網(Artificial Neural Network)ベースの翻訳サービスです。
使用可能な言語は韓国語、英語、日本語、中国語、フランス語、スペイン語、ベトナム語、タイ語、インドネシア語、ロシア語、ドイツ語、イタリア語です。
韓国では翻訳サービスとしてGoogle translaterより頻繁に使われています。
構成
構成は次になります
使ったサービスは全部5つです。サービスと役割は次となります。
- Slack : エンコードされたURLを送信する
- Amazon API Gateway : エンコードされたURLをJSONに変換しLambdaへ送る
- Amazon Comprehend : テキストからどんな言語かを確認してLanguageCodeを返す
- papago API : テキストとSource Language, Target Languageで翻訳したテキストを返す
- AWS Lambda : JSONデータをParseしてテキストをComprehendとpapago APIに送って翻訳されたテキストをSlackにPOSTする
papago API
papago APIのレファレンスはここでみる事が出来ます。(韓国語のみ)
papago APIを使うにはアプリケーション登録が必要になります。1日10000文字まで無料で翻訳する事ができます。
登録するとAPIコールに必要なClient IDとClient Secretが発給されます。
Lambda
LambdaのコードはPython3.7で作成しました。コードの内容は次になります。
from botocore.vendored import requests
import boto3
import json
def create_slack_payload(text):
return {
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": text
}
}
]
}
def get_translate(text):
client_id = "?????????????" # papago API Client ID
client_secret = "?????????????" # papago API Client Secret
header = {"X-Naver-Client-Id":client_id,
"X-Naver-Client-Secret":client_secret}
url = "https://openapi.naver.com/v1/papago/n2mt" # API url
client = boto3.client('comprehend')
res = client.detect_dominant_language(Text = text)
source = res['Languages'][0]['LanguageCode'] # get LanguageCode for source language
print("source : ", source)
data = {'text' : text,
'source' : source,
'target': 'ko'} # translate to Korean
response = requests.post(url, headers=header, data=data)
rescode = response.status_code
if(rescode==200):
t_data = response.json()
print(t_data['message']['result']['translatedText'])
return t_data['message']['result']['translatedText']
else:
print("n2mt Error Code:" , rescode)
def lambda_handler(event, context):
msg = event['message']['text']
response_url = event['response_url']
print("original text:" + msg)
print("response_url:" + response_url)
print(json.dumps(create_slack_payload(msg)))
translated_text = get_translate(msg)
print("translated text:" + translated_text)
r = requests.post(response_url, data=json.dumps(create_slack_payload(translated_text))) # post to slack
return r.json()
テストはJSON形式に変換されたSlackメッセージです。
{
"type": "message_action",
"token": "ABCDEFGHIJKabcdefghijk",
"action_ts": "123456789.012345",
"team": {
"id": "ABCDE12345",
"domain": "slack-domain"
},
"user": {
"id": "ZZAABBCC12",
"name": "username"
},
"channel": {
"id": "ABCDEFG123",
"name": "directmessage"
},
"callback_id": "callback_id",
"trigger_id": "123412341234.123412341234.12341234asdf1234asdf",
"message_ts": "123412341234.0000000",
"message": {
"client_msg_id": "a1b2c3-a123-b456-b631-1191f49ab175",
"type": "message",
"text": "こんにちは!このメッセージを韓国語にしたいです!",
"user": "ZZAABBCC12",
"ts": "123412341234.0000000",
"team": "ABCDEFG1234"
},
"response_url": "https://hooks.slack.com/app/ABCDE/12312341234/12341234asdfaf"
}
テストをする前にroleでComprehendReadOnlyをポリシーをアタッチする必要があります。
API Gateway
REST APIを作成します。
[アクション] -> [メソッドの作成]で[POST]メソッドを作成します。
作成したLambda関数を選びます。
エンコードされたURLデータをJSONに変換するために、マッピングテンプレートを作成する必要があります。
[統合リクエスト] -> [マッピングテンプレート]で次のように書きます。
application/x-www-form-urlencoded
#set ($test = $input.body.substring(0,8))
#if ($test == "payload=")
#set ($encodedJSON = $input.body.substring(8))
$util.urlDecode(${encodedJSON})
#end
次に[アクション] -> [APIのデプロイ]でデプロイしてステージを指定します。
作られたURLをSlack APIで作るアプリに使います。
Slack app
https://api.slack.com/appsでアプリを作成できます。
[Create an App]でアプリの名前とWorkspaceを決めたら、[Interactivity & Shortcuts]でスイッチをOnにしてAPI Gatewayで作られたURLを[Request URL]に入れます。
[Create New Shortcut] -> [On messages]で見えるボタンの名前と説明、Callback IDを決めます。
[Save Chances]でセーブしたらSlackにショットカットが作られます。
こんな感じで翻訳したメッセージが自分だけみる事ができます。
感想
実は同期の石橋さんが先に作ったアプリで、ただ韓国語の翻訳性能が満足できなかったので翻訳のAPIをpapago APIにしたものです。でも実際に作ってみればすごく勉強ができて良かったと思いました。Lambdaがどんなサービスかは頭の中では知っていましたけど、今回で作りながらもっと理解できたものではないかなって思います。
レファレンス
API GatewayとLambdaでSlack翻訳アプリを作成してみました