rxjs-stt
Version:
RxJS speech recognition wrapper
57 lines (56 loc) • 2.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.listen = void 0;
var rxjs_1 = require("rxjs");
var operators_1 = require("rxjs/operators");
var gapi_1 = require("./gapi");
;
var optionsKeys = ['grammars', 'continuous', 'lang', 'interimResults', 'maxAlternatives', 'serviceURI'];
function listen(value) {
if (value === void 0) { value = {}; }
var recognition$ = new rxjs_1.Observable(function (observer) {
var recognition;
if (value instanceof gapi_1.SpeechRecognition) {
recognition = value;
}
else {
recognition = new gapi_1.SpeechRecognition();
optionsKeys.forEach(function (key) {
if (key in value) {
recognition[key] = value[key];
}
});
}
// error -- as errors on Observable
var error$ = rxjs_1.fromEvent(recognition, 'error').pipe(operators_1.mergeMap(function (event) { return rxjs_1.throwError(event); }));
// listen to results
var nomatch$ = rxjs_1.fromEvent(recognition, 'nomatch');
var result$ = rxjs_1.fromEvent(recognition, 'result');
// audio, sound and speech recognition marks
var audiostart$ = rxjs_1.fromEvent(recognition, 'audiostart');
var audioend$ = rxjs_1.fromEvent(recognition, 'audioend');
var soundstart$ = rxjs_1.fromEvent(recognition, 'soundstart');
var soundend$ = rxjs_1.fromEvent(recognition, 'soundend');
var speechstart$ = rxjs_1.fromEvent(recognition, 'speechstart');
var speechend$ = rxjs_1.fromEvent(recognition, 'speechend');
// end -- completes Observable
var end$ = rxjs_1.fromEvent(recognition, 'end');
// start listening to events
var subscription = rxjs_1.merge(audiostart$, audioend$, soundstart$, soundend$, speechstart$, speechend$, nomatch$, result$, error$)
.pipe(operators_1.takeUntil(
// delay fix for FF:
// it seem to fire 'end' event BEFORE the 'result'
// (tested on: 78.0.2 (64-bit) MacOS, w/ recognise.enabled + force_enabled)
end$.pipe(operators_1.delay(1))))
.subscribe(observer);
recognition.start();
// NOTE: not sure if to use abort() or stop() here
// TODO: triage more
subscription.add(function () { return recognition.abort(); });
return subscription;
});
return rxjs_1.timer(4).pipe(operators_1.mergeMapTo(recognition$));
// TODO: consider using share() for result since there would always be only
// one running instance at a given time
}
exports.listen = listen;