@ng-web-apis/speech
Version:
A library for using Web Speech API with Angular
39 lines • 6.74 kB
JavaScript
import { inject, Injectable, LOCALE_ID, NgZone } from '@angular/core';
import { WA_SPEECH_RECOGNITION } from '@ng-web-apis/common';
import { Observable } from 'rxjs';
import { WA_SPEECH_RECOGNITION_MAX_ALTERNATIVES } from '../tokens/speech-recognition-max-alternatives';
import * as i0 from "@angular/core";
class SpeechRecognitionService extends Observable {
classRef = inject(WA_SPEECH_RECOGNITION);
lang = inject(LOCALE_ID, { optional: true });
maxAlternatives = inject(WA_SPEECH_RECOGNITION_MAX_ALTERNATIVES);
ngZone = inject(NgZone);
constructor() {
super((subscriber) => {
if (!this.classRef) {
subscriber.error(new Error('SpeechRecognition is not supported'));
return () => { };
}
// eslint-disable-next-line new-cap
const speechRecognition = new this.classRef();
speechRecognition.maxAlternatives = this.maxAlternatives;
speechRecognition.lang = this.lang ?? '';
speechRecognition.interimResults = true;
speechRecognition.onerror = (error) => subscriber.error(error);
speechRecognition.onend = () => subscriber.complete();
speechRecognition.onresult = ({ results }) => this.ngZone.run(() => subscriber.next(Array.from({ length: results.length }, (_, i) => results[i])));
speechRecognition.start();
return () => speechRecognition.abort();
});
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SpeechRecognitionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SpeechRecognitionService, providedIn: 'root' });
}
export { SpeechRecognitionService };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SpeechRecognitionService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlZWNoLXJlY29nbml0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL3NwZWVjaC9zcmMvc2VydmljZXMvc3BlZWNoLXJlY29nbml0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRWhDLE9BQU8sRUFBQyxzQ0FBc0MsRUFBQyxNQUFNLCtDQUErQyxDQUFDOztBQUVyRyxNQUdhLHdCQUF5QixTQUFRLFVBQXFDO0lBQzlELFFBQVEsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN6QyxJQUFJLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO0lBQzNDLGVBQWUsR0FBRyxNQUFNLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUNqRSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXpDO1FBQ0ksS0FBSyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2hCLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxDQUFDO2dCQUVsRSxPQUFPLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQzthQUNuQjtZQUVELG1DQUFtQztZQUNuQyxNQUFNLGlCQUFpQixHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBRTlDLGlCQUFpQixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3pELGlCQUFpQixDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN6QyxpQkFBaUIsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQ3hDLGlCQUFpQixDQUFDLE9BQU8sR0FBRyxDQUFDLEtBQWMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4RSxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RELGlCQUFpQixDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUMsT0FBTyxFQUFNLEVBQUUsRUFBRSxDQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FDakIsVUFBVSxDQUFDLElBQUksQ0FDWCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUM3RCxDQUNKLENBQUM7WUFFTixpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUUxQixPQUFPLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzt3R0FqQ1Esd0JBQXdCOzRHQUF4Qix3QkFBd0IsY0FGckIsTUFBTTs7U0FFVCx3QkFBd0I7NEZBQXhCLHdCQUF3QjtrQkFIcEMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2luamVjdCwgSW5qZWN0YWJsZSwgTE9DQUxFX0lELCBOZ1pvbmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtXQV9TUEVFQ0hfUkVDT0dOSVRJT059IGZyb20gJ0BuZy13ZWItYXBpcy9jb21tb24nO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtXQV9TUEVFQ0hfUkVDT0dOSVRJT05fTUFYX0FMVEVSTkFUSVZFU30gZnJvbSAnLi4vdG9rZW5zL3NwZWVjaC1yZWNvZ25pdGlvbi1tYXgtYWx0ZXJuYXRpdmVzJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU3BlZWNoUmVjb2duaXRpb25TZXJ2aWNlIGV4dGVuZHMgT2JzZXJ2YWJsZTxTcGVlY2hSZWNvZ25pdGlvblJlc3VsdFtdPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGFzc1JlZiA9IGluamVjdChXQV9TUEVFQ0hfUkVDT0dOSVRJT04pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGFuZyA9IGluamVjdChMT0NBTEVfSUQsIHtvcHRpb25hbDogdHJ1ZX0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF4QWx0ZXJuYXRpdmVzID0gaW5qZWN0KFdBX1NQRUVDSF9SRUNPR05JVElPTl9NQVhfQUxURVJOQVRJVkVTKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2xhc3NSZWYpIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKG5ldyBFcnJvcignU3BlZWNoUmVjb2duaXRpb24gaXMgbm90IHN1cHBvcnRlZCcpKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcbiAgICAgICAgICAgIGNvbnN0IHNwZWVjaFJlY29nbml0aW9uID0gbmV3IHRoaXMuY2xhc3NSZWYoKTtcblxuICAgICAgICAgICAgc3BlZWNoUmVjb2duaXRpb24ubWF4QWx0ZXJuYXRpdmVzID0gdGhpcy5tYXhBbHRlcm5hdGl2ZXM7XG4gICAgICAgICAgICBzcGVlY2hSZWNvZ25pdGlvbi5sYW5nID0gdGhpcy5sYW5nID8/ICcnO1xuICAgICAgICAgICAgc3BlZWNoUmVjb2duaXRpb24uaW50ZXJpbVJlc3VsdHMgPSB0cnVlO1xuICAgICAgICAgICAgc3BlZWNoUmVjb2duaXRpb24ub25lcnJvciA9IChlcnJvcjogdW5rbm93bikgPT4gc3Vic2NyaWJlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICBzcGVlY2hSZWNvZ25pdGlvbi5vbmVuZCA9ICgpID0+IHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIHNwZWVjaFJlY29nbml0aW9uLm9ucmVzdWx0ID0gKHtyZXN1bHRzfTogYW55KSA9PlxuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PlxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoXG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5mcm9tKHtsZW5ndGg6IHJlc3VsdHMubGVuZ3RofSwgKF8sIGkpID0+IHJlc3VsdHNbaV0pLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHNwZWVjaFJlY29nbml0aW9uLnN0YXJ0KCk7XG5cbiAgICAgICAgICAgIHJldHVybiAoKSA9PiBzcGVlY2hSZWNvZ25pdGlvbi5hYm9ydCgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=