조현아

text-to-speech and add languages

Showing 1 changed file with 643 additions and 88 deletions
var express = require("express");
const line = require("@line/bot-sdk");
var request = require("request");
var express = require('express');
const line = require('@line/bot-sdk');
var request = require('request');
const AWS = require('aws-sdk');
const fs = require('fs');
var app = express();
const config = require("./config.js");
const config = require('./config');
var translate_api_url = "https://openapi.naver.com/v1/papago/n2mt"; //번역 api_url
var languagedetect_api_url = "https://openapi.naver.com/v1/papago/detectLangs"; //언어감지 api_url
const Polly = new AWS.Polly({
signatureVersion: 'v4',
region: 'ap-northeast-2',
accessKeyId: config.aws_config.aws_access_key_id,
secretAccessKey: config.aws_config.aws_secret_access_key
});
//번역 api_url
var translate_api_url = 'https://openapi.naver.com/v1/papago/n2mt';
//언어감지 api_url
var languagedetect_api_url = 'https://openapi.naver.com/v1/papago/detectLangs';
var language = "en";
var voice = false;
//eng grammar check
var EnGrammarCheck_api_url = 'https://api.textgears.com/check.php';
// about the middleware, please refer to doc
app.get("/", function(req, res) {
res.send("!");
// create LINE SDK client
const client = new line.Client(config.line_config);
const {LineClient} = require('messaging-api-line');
//replyAudio 지원
const voice_client = LineClient.connect({
accessToken: config.line_config.channelAccessToken,
channelSecret: config.line_config.channelSecret
});
// register a webhook handler with middleware
app.post("/webhook", line.middleware(config.line_config), (req, res) => {
// res.status(200).end();
Promise.all(req.body.events.map(handleEvent)).then(result =>
res.json(result)
);
// serve static files
app.use(express.static('public'));
// create Express app
// about Express itself: https://expressjs.com/
app.get("/upload", function (req, res) {
res.render("upload");
});
const client = new line.Client(config.line_config);
//event handler
app.post("/webhook", line.middleware(config.line_config), (req, res) => {
// res.status(200).end();
Promise.all(req.body.events.map(handleEvent)).then(result =>
res.json(result)
);
});
function handleEvent(event) {
console.log("event.message.text");
if (event.type !== "message" || event.message.type !== "text") {
console.log("2");
// ignore non-text-message event
return Promise.resolve(null);
}
return new Promise(function(resolve, reject) {
console.log("3");
//언어 감지 option
var detect_options = {
url: languagedetect_api_url,
form: { query: event.message.text },
headers: config.naver_header
};
//papago 언어 감지
request.post(detect_options, function(error, response, body) {
console.log("4");
console.log(response.statusCode);
if (!error && response.statusCode == 200) {
var detect_body = JSON.parse(response.body);
var source = "";
var target = "";
var result = { type: "text", text: "" };
//언어 감지가 제대로 됐는지 확인
console.log(detect_body.langCode);
//번역은 한국어->영어 / 영어->한국어만 지원
if (detect_body.langCode == "ko" || detect_body.langCode == "en") {
console.log("5");
source = detect_body.langCode == "ko" ? "ko" : "en";
target = source == "ko" ? "en" : "ko";
//papago 번역 option
var options = {
url: translate_api_url,
// 한국어(source : ko), 영어(target: en), 카톡에서 받는 메시지(text)
form: { source: source, target: target, text: event.message.text },
if (event.type !== 'message' || event.message.type !== 'text') {
// ignore non-text-message event
return Promise.resolve(null);
}
return new Promise(function (resolve, reject) {
//언어 감지 option
var detect_options = {
url: languagedetect_api_url,
form: {'query': event.message.text},
headers: config.naver_header
};
// Naver Post API
request.post(options, function(error, response, body) {
// Translate API Success
if (!error && response.statusCode == 200) {
// JSON
var objBody = JSON.parse(response.body);
// Message 잘 찍히는지 확인
result.text = objBody.message.result.translatedText;
console.log(result.text);
//번역된 문장 보내기
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
};
//papago 언어 감지
request.post(detect_options, function (error, response, body) {
console.log(response.statusCode);
if (!error && response.statusCode == 200) {
console.log(event);
var detect_body = JSON.parse(response.body);
var source = '';
var target = '';
var result = {type: 'text', text: ''};
var send = {};
//언어 감지가 제대로 됐는지 확인
console.log(detect_body.langCode);
switch (event.message.text) {
case "영어":
if (detect_body.langCode == "ko" || detect_body.langCode == "en") {
language = "ja";
source = detect_body.langCode == "ko" ? "ko" : "en";
target = source == "ko" ? "en" : "ko";
//papago 번역 option
var options = {
url: translate_api_url,
form: {source: source, target: target, text: event.message.text},
headers: config.naver_header
};
request.post(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
// JSON
var objBody = JSON.parse(response.body);
// Message 잘 찍히는지 확인
result.text = objBody.message.result.translatedText;
console.log(result.text);
//번역된 문장 보내기
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
});
} else {
result.text =
"언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 영어만 가능합니다.";
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
break;
case "일본어":
if (detect_body.langCode == "ko" || detect_body.langCode == "ja") {
language = "ja";
source = detect_body.langCode == "ko" ? "ko" : "ja";
target = source == "ko" ? "ja" : "ko";
//papago 번역 option
var options = {
url: translate_api_url,
form: {source: source, target: target, text: event.message.text},
headers: config.naver_header
};
request.post(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
// JSON
var objBody = JSON.parse(response.body);
// Message 잘 찍히는지 확인
result.text = objBody.message.result.translatedText;
console.log(result.text);
//번역된 문장 보내기
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
});
} else {
result.text =
"언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 일본어만 가능합니다.";
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
break;
case '중국어':
if (detect_body.langCode == "ko" || detect_body.langCode == "zh-CN") {
language = "zh-CN";
source = detect_body.langCode == "ko" ? "ko" : "zh-CN";
target = source == "ko" ? "zh-CN" : "ko";
//papago 번역 option
var options = {
url: translate_api_url,
form: {source: source, target: target, text: event.message.text},
headers: config.naver_header
};
request.post(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
// JSON
var objBody = JSON.parse(response.body);
// Message 잘 찍히는지 확인
result.text = objBody.message.result.translatedText;
console.log(result.text);
//번역된 문장 보내기
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
});
} else {
result.text =
"언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 중국어만 가능합니다.";
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
break;
case '스페인어':
if (detect_body.langCode == "ko" || detect_body.langCode == "es") {
language = "es";
source = detect_body.langCode == "ko" ? "ko" : "es";
target = source == "ko" ? "es" : "ko";
//papago 번역 option
var options = {
url: translate_api_url,
form: {source: source, target: target, text: event.message.text},
headers: config.naver_header
};
request.post(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
// JSON
var objBody = JSON.parse(response.body);
// Message 잘 찍히는지 확인
result.text = objBody.message.result.translatedText;
console.log(result.text);
//번역된 문장 보내기
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
});
} else {
result.text =
"언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 스페인어만 가능합니다.";
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
break;
case '독일어':
if (detect_body.langCode == "ko" || detect_body.langCode == "de") {
language = "de";
source = detect_body.langCode == "ko" ? "ko" : "de";
target = source == "ko" ? "de" : "ko";
//papago 번역 option
var options = {
url: translate_api_url,
form: {source: source, target: target, text: event.message.text},
headers: config.naver_header
};
request.post(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
// JSON
var objBody = JSON.parse(response.body);
// Message 잘 찍히는지 확인
result.text = objBody.message.result.translatedText;
console.log(result.text);
//번역된 문장 보내기
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
});
} else {
result.text =
"언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 독일어만 가능합니다.";
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
break;
case '프랑스어':
if (detect_body.langCode == "ko" || detect_body.langCode == "fr") {
language = "fr";
source = detect_body.langCode == "ko" ? "ko" : "fr";
target = source == "ko" ? "fr" : "ko";
//papago 번역 option
var options = {
url: translate_api_url,
form: {source: source, target: target, text: event.message.text},
headers: config.naver_header
};
request.post(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
// JSON
var objBody = JSON.parse(response.body);
// Message 잘 찍히는지 확인
result.text = objBody.message.result.translatedText;
console.log(result.text);
//번역된 문장 보내기
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
});
} else {
result.text =
"언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 프랑스어만 가능합니다.";
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
break;
case '러시아어':
if (detect_body.langCode == "ko" || detect_body.langCode == "ru") {
language = "ru";
source = detect_body.langCode == "ko" ? "ko" : "ru";
target = source == "ko" ? "ru" : "ko";
//papago 번역 option
var options = {
url: translate_api_url,
form: {source: source, target: target, text: event.message.text},
headers: config.naver_header
};
request.post(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
// JSON
var objBody = JSON.parse(response.body);
// Message 잘 찍히는지 확인
result.text = objBody.message.result.translatedText;
console.log(result.text);
//번역된 문장 보내기
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
});
} else {
result.text =
"언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 러시아어만 가능합니다.";
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
break;
case '태국어':
if (detect_body.langCode == "ko" || detect_body.langCode == "th") {
language = "th";
source = detect_body.langCode == "ko" ? "ko" : "th";
target = source == "ko" ? "th" : "ko";
//papago 번역 option
var options = {
url: translate_api_url,
form: {source: source, target: target, text: event.message.text},
headers: config.naver_header
};
request.post(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
// JSON
var objBody = JSON.parse(response.body);
// Message 잘 찍히는지 확인
result.text = objBody.message.result.translatedText;
console.log(result.text);
//번역된 문장 보내기
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
});
} else {
result.text =
"언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 태국어만 가능합니다.";
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
break;
case '인도네시아어':
if (detect_body.langCode == "ko" || detect_body.langCode == "id") {
language = "id";
source = detect_body.langCode == "ko" ? "ko" : "id";
target = source == "ko" ? "id" : "ko";
//papago 번역 option
var options = {
url: translate_api_url,
form: {source: source, target: target, text: event.message.text},
headers: config.naver_header
};
request.post(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
// JSON
var objBody = JSON.parse(response.body);
// Message 잘 찍히는지 확인
result.text = objBody.message.result.translatedText;
console.log(result.text);
//번역된 문장 보내기
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
});
} else {
result.text =
"언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 인도네시아어만 가능합니다.";
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
break;
case '베트남어':
if (detect_body.langCode == "ko" || detect_body.langCode == "vi") {
language = "vi";
source = detect_body.langCode == "ko" ? "ko" : "vi";
target = source == "ko" ? "vi" : "ko";
//papago 번역 option
var options = {
url: translate_api_url,
form: {source: source, target: target, text: event.message.text},
headers: config.naver_header
};
request.post(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
// JSON
var objBody = JSON.parse(response.body);
// Message 잘 찍히는지 확인
result.text = objBody.message.result.translatedText;
console.log(result.text);
//번역된 문장 보내기
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
});
} else {
result.text =
"언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 베트남어만 가능합니다.";
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
break;
case '[언어를 변경합니다]':
send = {
'message': {
"type": "text",
"text": "언어를 선택하세요.",
"quickReply": {
"items": [{
"type": "action",
"action": {
"type": "message",
"label": "영어",
"text": "영어"
}
},
{
"type": "action",
"action": {
"type": "message",
"label": "일본어",
"text": "일본어"
}
},
{
"type": "action",
"action": {
"type": "message",
"label": "중국어",
"text": "중국어"
}
},
{
"type": "action",
"action": {
"type": "message",
"label": "스페인어",
"text": "스페인어"
}
},
{
"type": "action",
"action": {
"type": "message",
"label": "독일어",
"text": "독일어"
}
},
{
"type": "action",
"action": {
"type": "message",
"label": "프랑스어",
"text": "프랑스어"
}
},
{
"type": "action",
"action": {
"type": "message",
"label": "러시아어",
"text": "러시아어"
}
},
{
"type": "action",
"action": {
"type": "message",
"label": "태국어",
"text": "태국어"
}
},
{
"type": "action",
"action": {
"type": "message",
"label": "인도네시아어",
"text": "인도네시아어"
}
},
{
"type": "action",
"action": {
"type": "message",
"label": "베트남어",
"text": "베트남어"
}
}
]
}
}
}
console.log("response_status");
console.log(response.statusCode);
if (!error && response.statusCode == 200) {
client
.replyMessage(event.replyToken, send.message)
.then(resolve)
.catch(reject)
}
break;
case '[음성 듣기]':
var message = {type: 'text', text: ''};
if (voice) {
voice = false;
message.text = '음성 듣기 off'
} else {
voice = true;
message.text = '음성 듣기 on'
}
client
.replyMessage(event.replyToken, message)
.then(resolve)
.catch(reject);
break;
case '[문법을 검사합니다]':
break;
default: //영어로 번역
if (!voice) {
if (detect_body.langCode == "ko" || detect_body.langCode == language) {
source = detect_body.langCode == "ko" ? "ko" : language;
target = source == "ko" ? language : "ko";
//papago 번역 option
var options = {
url: translate_api_url,
// 한국어(source : ko), 영어(target: en), 카톡에서 받는 메시지(text)
form: {source: source, target: target, text: event.message.text},
headers: config.naver_header
};
request.post(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
// JSON
var objBody = JSON.parse(response.body);
// Message 잘 찍히는지 확인
result.text = objBody.message.result.translatedText;
console.log(result.text);
//번역된 문장 보내기
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
});
} else {
result.text =
"언어를 감지할 수 없습니다.";
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
} else //음성 듣기 on
{
if (detect_body.langCode == "en") {
let params = {
'Text': event.message.text,
'OutputFormat': 'mp3',
'VoiceId': 'Matthew'
};
console.log(params);
Polly.synthesizeSpeech(params, (err, data) => {
if (err) {
console.log(err);
} else if (data) {
if (data.AudioStream instanceof Buffer) {
fs.writeFile("public/speech.m4a", data.AudioStream, function (err) {
if (err) {
return console.log(err);
}
console.log("The file was saved!");
// 메시지 보내기
console.log(response.statusCode);//200
if (!error && response.statusCode == 200) {
voice_client
.replyAudio(event.replyToken, {
'originalContentUrl': "https://transpenguin.tk/speech.m4a",
'duration': 20000
})
.then(resolve)
.catch(reject)
}
});
}
}
});
} else {
result.text =
"언어를 감지할 수 없습니다.";
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
}
break;
}
}
}
});
}
// 메시지의 언어가 영어 또는 한국어가 아닐 경우
else {
result.text =
"언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 영어만 가능합니다.";
client
.replyMessage(event.replyToken, result)
.then(resolve)
.catch(reject);
}
}
);
});
});
}
app.listen(3000, function() {
console.log("Linebot listening on port 3000!");
});
app.listen(3000, function () {
console.log("Linebot listening on port 3000!");
});
\ No newline at end of file
......