UNPKG

rxjs-stt

Version:

RxJS speech recognition wrapper

57 lines (56 loc) 2.65 kB
"use strict"; 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;