이전까지는 "페이스북에 ~님이 ~라고 게시했습니다"라는 텍스트를 출력하는 것 까지 진행하였다.
이번에는 이 텍스트를 음성으로 출력한다. 이를 위해 네이버 음성합성API를 이용한다.
네이버 음성합성 API 서버로 텍스트를 보내면, 서버에서 음성으로 변환하여 보내준다.
네이버 음성합성(Beta) API
1. API신청 및 예제 실행
위 링크에 들어가서 오픈API이용 신청을 클릭한다.
애플리케이션을 등록한다. 웹 서비스 URL에는 윈도우서버의 IP주소:포트 를 입력한다.
애플리케이션 등록이 완료되면 Client ID와 Client Secret을 발급받았을 것이다.
이제 API 호출 예제의 Nodejs 예제 코드를 이용할 프로젝트를 하나 만든다.
테스트를 위해 TTS_Test라는 프로젝트를 새로 만들었다.
터미널에 다음의 명령어를 입력한다
npm install express
npm install nodejs
npm install request
예제 코드를 입력하고, 발급받은 Client ID와 Client Secret으로 코드를 수정한다.
실행후
재생을 누르면 "좋은 하루 되세요"라는 목소리가 출력된다.
2. 윈도우 서버에 적용
프로젝트를 진행하고 있는 SmartLampServer프로젝트를 실행한다.
터미널에 다음의 명령어로 request 모듈을 설치한다.
npm install --save request
프로젝트에 public이라는 이름의 디렉토리를 하나 생성한다. 이 디렉토리에 음원 파일이 생성 될 것이다.
필요한 모듈을 코드에 추가한다.
var request = require("request"); |
var fs = require('fs'); |
다음의 코드를 추가한다. API사용을 위한 id와 secret을 설정하고, 옵션으로 지정하는 코드이다.
var client_id = ''; |
var client_secret = ''; |
var optionsTTS = { |
url: "https://openapi.naver.com/v1/voice/tts.bin", |
form: {'speaker':'mijin', 'speed':'0', 'text':''}, |
headers: {'X-Naver-Client-Id':client_id, 'X-Naver-Client-Secret': client_secret} |
}; |
다음으로 만들어진 tts1.mp3파일을 외부(라즈베리파이)에서 접근하게 하기 위해 express.static을 사용하는 코드를 추가한다.
해당 코드로 인해 public이라는 디렉토리 내부 파일은 외부에서 접근이 가능하게 된다.
app.use(express.static('public'));
app.post('/facebook', function(req,res) {}) 내부에 다음의 코드를 추가한다.
tts 옵션의 'text'부분에 longtext를 대입한다.
optionsTTS로 요청을 보내고 TTS파일을 public/tts.mp3에 파일로 출력한다.
optionsTTS.form.text = longtext; |
var writeStream = fs.createWriteStream('./public/tts1.mp3'); |
var _req = request.post(optionsTTS).on('response', function(response) { |
console.log(response.statusCode) ;// 200 |
console.log(response.headers['content-type']) |
}); |
_req.pipe(writeStream); // file로 출력 |
완성된 전체 코드는 다음과 같다.
var express = require("express");
var bodyParser = require("body-parser"); |
var request = require("request"); |
var fs = require('fs'); |
var app = express(); |
var port = 3000; |
var isData = false; |
var empty = "empty"; |
var longtext = ""; |
var client_id = ''; |
var client_secret = ''; |
var optionsTTS = { |
url: "https://openapi.naver.com/v1/voice/tts.bin", |
form: {'speaker':'mijin', 'speed':'0', 'text':''}, |
headers: {'X-Naver-Client-Id':client_id, 'X-Naver-Client-Secret': client_secret} |
}; |
app.use(bodyParser.urlencoded({extended : false})); |
app.use(express.static('public')); |
app.get('/', function (req,res) { |
console.log('app.get "/" '); |
res.send("Smart Lamp Server"); |
}); |
//파이로부터 1초마다 호출됨 |
app.get('/smartLamp', function(req,res) { |
if(isData) { |
isData = false; //한번 데이터 출력한 후 초기화 |
res.send(longtext); |
} |
else { |
res.send(empty); |
} |
}); |
app.post('/facebook', function(req,res) { |
var from = req.body.from; |
var myMessage = req.body.myMessage; |
var updateAt = req.body.updateAt; |
longtext = "페이스북에" + req.body.from + "님이" + req.body.myMessage + "라고 게시했습니다."; |
console.log(longtext); |
optionsTTS.form.text = longtext; |
var writeStream = fs.createWriteStream('./public/tts1.mp3'); |
var _req = request.post(optionsTTS).on('response', function(response) { |
console.log(response.statusCode) ;// 200 |
console.log(response.headers['content-type']) |
}); |
_req.pipe(writeStream); // file로 출력 |
isData = true; |
res.send("Success"); |
}); |
app.listen(port, function () { |
console.log('Smart Lamp Server app listening on port ' + port); |
}); |
3. 라즈베리파이 서버에 적용
LED를 제어하는 파이썬 파일을 nodejs에서 실행하기 위해, child_process 모듈을 사용한다.
라즈베리파이의 Git/Smartlamp_pi2 디렉토리로 이동하고, 다음의 코드를 추가하여 child_process 모듈을 포함시킨다.
var exec =require('child_process').exec;
chromium-browser http://서버ip/tts1.mp3
위 명령어를 자식 프로세스로 실행한다.
'프로젝트 > Smart Lamp - 라즈베리파이' 카테고리의 다른 글
9. 구글API를 이용한 음성인식 (0) | 2017.01.21 |
---|---|
8. IFTTT Maker 를 트리거로 (0) | 2017.01.08 |
6. 라즈베리파이에서 네오픽셀LED 제어 (2) | 2017.01.05 |
5. PC 서버와 라즈베리파이 통신 (0) | 2017.01.05 |
4. IFTTT와 서버 연동 (0) | 2017.01.05 |