OpenJTalkã¨Node.jsã§ãã©ã¦ã¶ããæ¥æ¬èªTTS
ãã©ã¦ã¶ããæ¥æ¬èªTTSã¨è¨ãã°google翻訳ã®éå ¬å¼APIãæå(?)ã§ããããã¼ã«ã«ã§å ã ã¨ä½¿ããä»çµã¿ã試ãã¦ã¿ã¾ããã
ã¨ã¯è¨ã£ã¦ãéª¨æ ¼é¨åã¯ãã¡ãï¼凹みTips - Node.js 用 Open JTalk アドオンを作ってみた ããããã£ã¦ãããã®ã§ãç§ã¯ãã ãã®ä¸ã«ãµã³ãã«ã¢ããªãæ¸ãã¦ã¿ãã ããªã®ã§ããã©...
ã½ã¼ã¹ã¯ãã®ä¸ã® drop_n_talk ã«ãªãã¾ãã
https://github.com/penkoba/node-openjtalk
ããã¨ããããLinuxåæã§ãã
OpenJTalkã«ã¤ãã¦ã¯éå»ã«ãããã¤ãæ¸ãã¦ããã®ã§ã説æã¯çç¥ãã¾ãã
http://d.hatena.ne.jp/penkoba/20121014/1350201613
http://d.hatena.ne.jp/penkoba/20121024/1351091330
ã¾ãOpenJTalkã®Nodeã¢ããªã³ã«ã¤ãã¦ã¯ä¸è¿°ã®hecomiããã®ããã°ãåç §ãã¦ãã ããã
ã¨ããããã§ããã§ã¯ã¢ããªé¨åã®è§£èª¬ã«éä¸ãããã¨ã«ãã¾ããï¼ææãï¼
Nodeã¢ããªçæ
ã¾ãNodeã®ã¢ããªã±ã¼ã·ã§ã³ã®ã¹ã±ã«ãã³ãexpressã§çæãã¾ãã
% express drop_n_talk % cd drop_n_talk % npm install
ã¾ããã©ã¦ã¶ã¨Nodeã®éä¿¡ã«socket.ioã使ãã¾ãã
% npm install socket.io
ãµã¼ãå´å®è£
expressã®çæããapp.jsãdrop_n_talk.jsã¨ãªãã¼ã ããç·¨éãã¾ãã
ã¾ãã¯requireã«socket.ioã¨OpenJTalkã追å ãï¼OpenJTalkã®ãã©ã°ã¤ã³ã ../build/Release/openjtalk.node ã«ããã¨ããåæã§ãï¼
var sockio = require('socket.io') , OpenJTalk = require('../build/Release/openjtalk').OpenJTalk;
OpenJTalkã¤ã³ã¹ã¿ã³ã¹çæã¨åæåã
var mei = new OpenJTalk(); mei.init("../data/mei_normal", "../openjtalk/open_jtalk_dic_utf_8-1.05");
ããã¦socket.ioã®ã¤ãã³ããã³ãã©ãè¨è¿°ãã¾ãã'talk'ã¤ãã³ããåãåããOpenJTalkã¢ã¸ã¥ã¼ã«ã®talk()ãçºè¡ãã¾ãã
ï¼æ³¨ï¼ã¡ãªã¿ã«expressã®2.xã§ã¯express()ãhttp.Serverã®ã¤ã³ã¹ã¿ã³ã¹ãè¿ãã¦ããããã§ãsocket.ioã®listen()ã«ããã渡ãã¦ããä¾ãwebä¸ã«ããããããã®ã§ããã3.xã§ã¯ããã§ã¯åãã¾ããã3.xã®å ´åã¯http.createServer(app)ã§è¿ã£ã¦ããhttp.Serverã¤ã³ã¹ã¿ã³ã¹ã渡ãã¾ãã
var server = http.createServer(app); server.listen(app.get('port'), function(){ console.log("Express server listening on port " + app.get('port')); }); var io = sockio.listen(server); io.on('connection', function(socket) { socket.on('talk', function(txt) { mei.talk(txt); }); });
ã¯ã©ã¤ã¢ã³ãå´html
次ã«views/index.jadeãç·¨éãã¾ããjadeã¯htmlã®ãã³ãã¬ã¼ãã¨ã³ã¸ã³ã§ããå¿ è¦ãªã¹ã¯ãªãããèªã¿è¾¼ã¿ï¼talk.jsã«ã¤ãã¦ã¯å¾è¿°ï¼ãfileèªã¿è¾¼ã¿ãã¿ã³ãtextareaãtalkãã¿ã³ãé ç½®ãã¾ãã
extends layout block content script(src='/socket.io/socket.io.js') script(src='/javascripts/talk.js') input(id="readbtn", type="file") br textarea(id="droparea", rows="10", cols="80") br button(onclick='javascript:talkArea()') talk
ã¯ã©ã¤ã¢ã³ãå´js
å ã»ã©ã®jade㧠'/javascripts/talk.js' ãèªã¿è¾¼ãæå®ããã¾ããããpublic/javascripts/talk.js ã¨ãã¦ä»¥ä¸ã®å 容ã§æ°è¦ä½æãã¾ãã
- talkãã¿ã³ããå¼ã°ããé¢æ°
- fileèªã¿è¾¼ã¿ãã¿ã³ã®ãã³ãã©
- textareaã®drag&dropã¤ãã³ãã®ãã³ãã©
ãå®è£ ãã¾ãã
var socket = io.connect('/'); function talkArea(){ socket.emit('talk', document.getElementById("droparea").value); } function talkFile(file) { var reader = new FileReader(); reader.onload = function(e) { var txt = e.target.result; document.getElementById("droparea").value = txt; socket.emit('talk', txt); } reader.readAsText(file, "utf-8"); } function onChangeFile(e) { talkFile(e.target.files[0]); } function onDropFile(e) { e.preventDefault(); talkFile(e.dataTransfer.files[0]); }; function onDragOver(e) { if (e.preventDefault) { e.preventDefault(); } return false; }; function onDragEnter(e) { if (e.preventDefault) { e.preventDefault(); } return false; }; window.onload = function() { var btn = document.getElementById("readbtn"); btn.addEventListener("change", onChangeFile, false); var da = document.getElementById("droparea"); da.addEventListener("dragover", onDragOver, false); da.addEventListener("dragenter", onDragEnter, false); da.addEventListener("drop", onDropFile, false); };
å®è£
ã¯ä»¥ä¸ã§ãã
è¦ããã«ãsocket.emit('talk', txt) ãå©ãã°åã£ã¦ãããã¨ãããã¨ã§ããã
åä½
nodeã§drop_n_talk.jsãèµ·åãããã©ã¦ã¶ã§http://localhost:3000 ã«ã¢ã¯ã»ã¹ããã¨ã以ä¸ã®ãããªå³ãç´ ã£æ°ããªããã¼ã¸ã表示ããã¾ããï¼ç»é¢ã¯Linuxã®chromeã®ä¾ï¼
ããã«é©å½ãªæ¥æ¬èªãå
¥åãã¦talkãã¿ã³ãæ¼ãã°ããã¾ãè¡ãã°åã£ã¦ããã¾ããã¾ãããã¡ã¤ã«ãé¸æããã¿ã³ããããã¹ããã¡ã¤ã«(UTF-8)ãé¸æãããããã©ãã°ï¼ããããã§textareaã«è½ã¨ãã°ãã¡ã¤ã«ã®å
容ãåãã¾ãã
è¬è¾
æå¾ã«ãªãã¾ããããOpenJTalkã®Nodeã¢ã¸ã¥ã¼ã«ãä½ã£ã¦ããã ãã hecomiãã ãããã¨ããããã¾ããã
ãã¤ãåæã«åèã«ããã使ããã¦ããã ãã¦ããã¾ãã<(__)>
以ä¸ã§ãã