@fonoster/voice 0.3.6-alpha.8 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/gather/gather.js +5 -5
- package/dist/gather/source_speech.js +18 -16
- package/dist/server.js +6 -17
- package/dist/utils.d.ts +2 -0
- package/dist/utils.js +23 -1
- package/package.json +14 -14
package/dist/gather/gather.js
CHANGED
|
@@ -6,12 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const deepmerge_1 = __importDefault(require("deepmerge"));
|
|
7
7
|
const asserts_1 = require("../asserts");
|
|
8
8
|
const verb_1 = require("../verb");
|
|
9
|
-
const asserts_2 = require("./asserts");
|
|
10
9
|
const source_dtmf_1 = __importDefault(require("./source_dtmf"));
|
|
11
10
|
const source_speech_1 = __importDefault(require("./source_speech"));
|
|
12
11
|
const logger_1 = __importDefault(require("@fonoster/logger"));
|
|
13
12
|
const defaultOptions = {
|
|
14
|
-
timeout: 4000,
|
|
15
13
|
finishOnKey: "#",
|
|
16
14
|
source: "dtmf"
|
|
17
15
|
};
|
|
@@ -22,12 +20,14 @@ class GatherVerb extends verb_1.Verb {
|
|
|
22
20
|
}
|
|
23
21
|
async run(opts) {
|
|
24
22
|
const options = (0, deepmerge_1.default)(defaultOptions, opts);
|
|
25
|
-
|
|
23
|
+
// assertsHasNumDigitsOrTimeout(options);
|
|
26
24
|
// assertsValuesIsZeroOrGreater("timeout", options.timeout);
|
|
27
25
|
(0, asserts_1.assertsValueIsPositive)("numDigits", options.numDigits);
|
|
28
26
|
(0, asserts_1.assertsFinishOnKeyIsChar)(options.finishOnKey);
|
|
29
|
-
|
|
30
|
-
options.timeout
|
|
27
|
+
options.timeout =
|
|
28
|
+
!options.timeout && options.source.includes("speech")
|
|
29
|
+
? 10000
|
|
30
|
+
: options.timeout || 4000;
|
|
31
31
|
return new Promise(async (resolve, reject) => {
|
|
32
32
|
logger_1.default.verbose(`@fonoster/voice started gather [source = ${options.source}]`);
|
|
33
33
|
if (options.source.includes("dtmf")) {
|
|
@@ -37,27 +37,29 @@ const waitForSpeech = async (sessionId, options, verb, speechProvider) => new Pr
|
|
|
37
37
|
token = pubsub_js_1.default.subscribe(`ReceivingMedia.${sessionId}`, (type, data) => {
|
|
38
38
|
readable.push(data);
|
|
39
39
|
});
|
|
40
|
+
await (0, utils_1.startMediaTransfer)(verb, sessionId);
|
|
41
|
+
let enabledMedia = true;
|
|
42
|
+
if (options.timeout > 0) {
|
|
43
|
+
timer = setTimeout(() => {
|
|
44
|
+
if (enabledMedia)
|
|
45
|
+
(0, utils_1.stopMediaTransfer)(verb, sessionId);
|
|
46
|
+
pubsub_js_1.default.unsubscribe(token);
|
|
47
|
+
speechTracker.client.close();
|
|
48
|
+
resolve("");
|
|
49
|
+
enabledMedia = false;
|
|
50
|
+
}, options.timeout);
|
|
51
|
+
}
|
|
40
52
|
speechTracker
|
|
41
53
|
.transcribe(readable)
|
|
42
|
-
.then((result) =>
|
|
54
|
+
.then((result) => resolve(result.transcript))
|
|
55
|
+
.catch(reject)
|
|
56
|
+
.finally(() => {
|
|
57
|
+
if (enabledMedia)
|
|
58
|
+
(0, utils_1.stopMediaTransfer)(verb, sessionId);
|
|
43
59
|
if (timer)
|
|
44
60
|
clearTimeout(timer);
|
|
45
|
-
resolve(result.transcript);
|
|
46
|
-
})
|
|
47
|
-
.catch(reject)
|
|
48
|
-
.finally(async () => {
|
|
49
61
|
pubsub_js_1.default.unsubscribe(token);
|
|
50
|
-
|
|
62
|
+
enabledMedia = false;
|
|
51
63
|
});
|
|
52
|
-
await (0, utils_1.startMediaTransfer)(verb, sessionId);
|
|
53
|
-
if (options.timeout > 0) {
|
|
54
|
-
timer = setTimeout(async () => {
|
|
55
|
-
// Simply resolve an empty string
|
|
56
|
-
resolve("");
|
|
57
|
-
pubsub_js_1.default.unsubscribe(token);
|
|
58
|
-
await (0, utils_1.stopMediaTransfer)(verb, sessionId);
|
|
59
|
-
return;
|
|
60
|
-
}, options.timeout);
|
|
61
|
-
}
|
|
62
64
|
});
|
|
63
65
|
exports.default = waitForSpeech;
|
package/dist/server.js
CHANGED
|
@@ -3,14 +3,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const tracer_1 = require("./tracer");
|
|
8
|
+
const utils_1 = require("./utils");
|
|
6
9
|
const voice_1 = __importDefault(require("./voice"));
|
|
7
10
|
const logger_1 = __importDefault(require("@fonoster/logger"));
|
|
8
11
|
const express_1 = __importDefault(require("express"));
|
|
9
|
-
const path_1 = require("path");
|
|
10
|
-
const fs_1 = __importDefault(require("fs"));
|
|
11
12
|
const os_1 = __importDefault(require("os"));
|
|
12
13
|
const pubsub_js_1 = __importDefault(require("pubsub-js"));
|
|
13
|
-
const tracer_1 = require("./tracer");
|
|
14
14
|
const merge = require("deepmerge");
|
|
15
15
|
const app = (0, express_1.default)();
|
|
16
16
|
app.use(express_1.default.json());
|
|
@@ -38,20 +38,9 @@ class VoiceServer {
|
|
|
38
38
|
this.plugins[plugin.getType()] = plugin;
|
|
39
39
|
}
|
|
40
40
|
listen(handler, port = this.config.port) {
|
|
41
|
-
app.get(path_1.posix.join(this.config.base, "/
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (err) {
|
|
45
|
-
res.send("unable to find or open file");
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
// TODO: Set this value according to file extension
|
|
49
|
-
res.setHeader("content-type", "audio/x-wav");
|
|
50
|
-
res.send(data);
|
|
51
|
-
}
|
|
52
|
-
res.end();
|
|
53
|
-
});
|
|
54
|
-
});
|
|
41
|
+
app.get(path_1.posix.join(this.config.base, "/sounds/:file"), (req, res) => (0, utils_1.serveFiles)(this.config)(req, res));
|
|
42
|
+
// Alias path for sounds
|
|
43
|
+
app.get(path_1.posix.join(this.config.base, "/tts/:file"), (req, res) => (0, utils_1.serveFiles)(this.config)(req, res));
|
|
55
44
|
app.get("/ping", (req, res) => {
|
|
56
45
|
res.send("pong");
|
|
57
46
|
});
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ServerConfig } from "./types";
|
|
1
2
|
import { Verb } from "./verb";
|
|
2
3
|
/**
|
|
3
4
|
* Takes a json object and creates a query formatted string
|
|
@@ -8,3 +9,4 @@ import { Verb } from "./verb";
|
|
|
8
9
|
export declare const objectToQString: (obj?: any) => string;
|
|
9
10
|
export declare function startMediaTransfer(verb: Verb, sessionId: string): Promise<void>;
|
|
10
11
|
export declare function stopMediaTransfer(verb: Verb, sessionId: string): Promise<void>;
|
|
12
|
+
export declare const serveFiles: (config: ServerConfig) => (req: any, res: any) => void;
|
package/dist/utils.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.stopMediaTransfer = exports.startMediaTransfer = exports.objectToQString = void 0;
|
|
6
|
+
exports.serveFiles = exports.stopMediaTransfer = exports.startMediaTransfer = exports.objectToQString = void 0;
|
|
7
|
+
const path_1 = require("path");
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
4
9
|
/**
|
|
5
10
|
* Takes a json object and creates a query formatted string
|
|
6
11
|
*
|
|
@@ -33,3 +38,20 @@ async function stopMediaTransfer(verb, sessionId) {
|
|
|
33
38
|
await sendMediaTransferEvent(verb, sessionId, "StopExternalMedia");
|
|
34
39
|
}
|
|
35
40
|
exports.stopMediaTransfer = stopMediaTransfer;
|
|
41
|
+
const serveFiles = (config) => {
|
|
42
|
+
return (req, res) => {
|
|
43
|
+
// TODO: Update to use a stream instead of fs.readFile
|
|
44
|
+
fs_1.default.readFile((0, path_1.join)(config.pathToFiles, req.params.file), function (err, data) {
|
|
45
|
+
if (err) {
|
|
46
|
+
res.send("unable to find or open file");
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
// TODO: Set this value according to file extension
|
|
50
|
+
res.setHeader("content-type", "audio/x-wav");
|
|
51
|
+
res.send(data);
|
|
52
|
+
}
|
|
53
|
+
res.end();
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
exports.serveFiles = serveFiles;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fonoster/voice",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.7",
|
|
4
4
|
"description": "Voice verbs",
|
|
5
5
|
"author": "Pedro Sanders <psanders@fonoster.com>",
|
|
6
6
|
"homepage": "https://github.com/fonoster/fonoster#readme",
|
|
@@ -29,18 +29,17 @@
|
|
|
29
29
|
"url": "https://github.com/fonoster/fonoster/issues"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@fonoster/common": "^0.3.
|
|
33
|
-
"@fonoster/logger": "^0.3.
|
|
34
|
-
"@opentelemetry/api": "^1.0.
|
|
35
|
-
"@opentelemetry/
|
|
36
|
-
"@opentelemetry/
|
|
37
|
-
"@opentelemetry/
|
|
38
|
-
"@opentelemetry/
|
|
39
|
-
"@opentelemetry/
|
|
40
|
-
"@opentelemetry/sdk-
|
|
41
|
-
"@opentelemetry/sdk-trace-
|
|
42
|
-
"@opentelemetry/semantic-conventions": "0.
|
|
43
|
-
"@opentelemetry/tracing": "^0.24.0",
|
|
32
|
+
"@fonoster/common": "^0.3.7",
|
|
33
|
+
"@fonoster/logger": "^0.3.7",
|
|
34
|
+
"@opentelemetry/api": "^1.0.4",
|
|
35
|
+
"@opentelemetry/instrumentation": "^0.27.0",
|
|
36
|
+
"@opentelemetry/instrumentation-express": "^0.27.0",
|
|
37
|
+
"@opentelemetry/instrumentation-http": "^0.27.0",
|
|
38
|
+
"@opentelemetry/resources": "^1.0.4",
|
|
39
|
+
"@opentelemetry/sdk-metrics-base": "0.27.0",
|
|
40
|
+
"@opentelemetry/sdk-trace-base": "^1.0.4",
|
|
41
|
+
"@opentelemetry/sdk-trace-node": "^1.0.4",
|
|
42
|
+
"@opentelemetry/semantic-conventions": "^1.0.4",
|
|
44
43
|
"bson-objectid": "^2.0.2",
|
|
45
44
|
"deepmerge": "^4.2.2",
|
|
46
45
|
"express": "^4.17.1",
|
|
@@ -48,8 +47,9 @@
|
|
|
48
47
|
"pubsub-js": "^1.9.3",
|
|
49
48
|
"sync": "^0.2.5"
|
|
50
49
|
},
|
|
51
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "dff0cd491b55e7d9ccc05fc51468a7c0b92bff07",
|
|
52
51
|
"devDependencies": {
|
|
52
|
+
"@types/express": "^4.17.13",
|
|
53
53
|
"@types/pubsub-js": "^1.8.2"
|
|
54
54
|
}
|
|
55
55
|
}
|