-
Notifications
You must be signed in to change notification settings - Fork 0
/
witai.js
89 lines (81 loc) · 2.9 KB
/
witai.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
const
log = require('loglevel').getLogger('witai'),
utils = require('./utils'),
request = require('request'),
HttpStatus = require('http-status-codes'),
{
Wit,
witLog
} = require('node-wit'),
format = utils.format;;
const
WIT_AI_API_VERSION = '20160516',
WIT_API_URL = 'https://api.wit.ai',
SERVICE_ENTITIES = 'entities',
SERVICE_SPEECH = 'speech',
WAV_AUDIO_CONTENT_TYPE = 'audio/wav',
AUDIO_FILE_NAME = 'audio.wav';
class WitAi extends Wit {
constructor(config) {
super({
// logger: new witLog.Logger(log.DEBUG),
accessToken: config.witAccessToken
});
this.config = config;
}
speech(wav) {
return new Promise((resolve, reject) => {
this.sendWitAiAttachment(SERVICE_SPEECH, wav, WAV_AUDIO_CONTENT_TYPE, AUDIO_FILE_NAME, resolve, reject);
});
}
entities() {
return new Promise((resolve, reject) => {
this.sendWitAiRequest(SERVICE_ENTITIES, resolve, reject);
});
}
entityValues(entity) {
return new Promise((resolve, reject) => {
this.sendWitAiRequest(format('%s/%s', SERVICE_ENTITIES, entity), resolve, reject);
});
}
sendWitAiRequest(service, resolve, reject) {
let httpOptions = {
uri: format('%s/%s', WIT_API_URL, service),
headers: {
'Authorization': format('Bearer %s', this.config.witAccessToken),
'Accept': format('application/vnd.wit.%sjson', WIT_AI_API_VERSION),
'Content-Type': 'application/json',
},
method: 'GET'
};
request(httpOptions, (err, res, body) => {
if (err || res.statusCode != HttpStatus.OK) {
log.error('Unable to send message: %s', JSON.stringify(err || res));
log.error('Failed request: %s', JSON.stringify(httpOptions));
reject(err);
}
resolve(JSON.parse(body.toString('utf8')));
});
}
sendWitAiAttachment(service, buffer, contentType, filename, resolve, reject) {
let httpOptions = {
uri: format('%s/%s', WIT_API_URL, service),
headers: {
'Authorization': format('Bearer %s', this.config.witAccessToken),
'Accept': format('application/vnd.wit.%sjson', WIT_AI_API_VERSION),
'Content-Type': contentType
},
method: 'POST',
body: buffer
};
request(httpOptions, (err, res, body) => {
if (err || res.statusCode != HttpStatus.OK) {
log.error('Unable to send message: %s', JSON.stringify(err || res));
log.error('Failed request: %s', JSON.stringify(httpOptions));
reject(err);
}
resolve(JSON.parse(body.toString('utf8')));
});
}
}
module.exports = WitAi;