-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
109 lines (93 loc) 路 3.32 KB
/
index.js
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
const exec = require('child_process').execSync;
const express = require('express');
const busboy = require('connect-busboy');
const https = require('https');
const csvjson = require('csvjson');
const fs = require('fs');
const _ = require('lodash');
const app = express();
const config = {
praatScript: __dirname + '/praat-script/',
uploadPath: 'public/upload/',
ca: 'ssl/fullchain.pem',
key: 'ssl/privkey.pem',
cert: 'ssl/cert.pem'
};
const sslOptions = {
ca: fs.readFileSync(config.ca),
key: fs.readFileSync(config.key),
cert: fs.readFileSync(config.cert)
};
const analyzePitch = (filename) => {
const filePath = __dirname + '/' + config.uploadPath;
const praatScript = config.praatScript;
exec('praat --run ' + praatScript + 'extractPitchIntensity.praat "' + filePath + '" "' + filename + '"', {stdio:[0,1,2]});
exec('praat --run ' + praatScript + 'pitchIntensityScript.praat "' + filePath + '" "' + filename + '"', {stdio:[0,1,2]});
const data = fs.readFileSync(config.uploadPath + filename + '.graph', {encoding : 'utf8'});
return csvjson.toColumnArray(data, {
delimiter: '\t',
quote: '"'
});
}
app.use(express.static('public'));
app.post('/upload', (req, res) => {
const date = new Date();
const filename = date.getTime() + '.wav';
req.pipe(fs.createWriteStream(config.uploadPath + filename))
.on('error', (e) => res.status(500).json({success: false, message: e.message}).end())
.on('close', () => res.json({success: true, file: date.getTime()}))
});
app.get('/analyze/:filename', (req, res) => {
res.json(analyzePitch(req.params.filename));
});
app.get('/questions', (req, res) => {
res.json(JSON.parse(fs.readFileSync('./questions.json')));
});
app.get('/chart/:filename', (req, res) => {
const data = fs.readFileSync(config.uploadPath + req.params.filename + '.graph', {encoding : 'utf8'});
const jsonData = csvjson.toColumnArray(data, {
delimiter: '\t',
quote: '"'
});
res.json(jsonData);
});
app.get('/questions/:level/:count', (req, res) => {
let questionsList = JSON.parse(fs.readFileSync('./questions.json'));
questionsList = _.filter(questionsList, {level: req.params.level});
res.json(_.sampleSize(questionsList, req.params.count));
});
app.post('/questions/', busboy({immediate: true}), (req, res) => {
const busboy = req.busboy;
const question = {};
const questionsList = JSON.parse(fs.readFileSync('./questions.json'));
let fstream;
if (busboy) {
busboy.on('file', function (fieldname, file, filename) {
question.file = filename;
fstream = fs.createWriteStream(config.uploadPath + filename);
file.pipe(fstream);
fstream.on('close', function () {});
});
busboy.on('field', function (fieldname, val) {
switch (fieldname) {
case 'question':
question.question = val;
break;
case 'level':
question.level = val;
break;
}
});
busboy.on('finish', function () {
questionsList.push(question);
fs.writeFile('./questions.json', JSON.stringify(questionsList, null, 2), function(){});
analyzePitch(question.file.replace('.wav', ''));
res.redirect('back');
});
} else {
res.json({'result': false, 'message': 'no req.busboy'});
}
});
https.createServer(sslOptions, app).listen(3000, function () {
console.log('Listening on port 3000');
});