@ng-web-apis/speech
Version:
A library for using Web Speech API with Angular
1 lines • 15.9 kB
Source Map (JSON)
{"version":3,"file":"ng-web-apis-speech.mjs","sources":["../../../libs/speech/src/modules/speech-synthesis/text-to-speech.directive.ts","../../../libs/speech/src/modules/speech-synthesis/utterance.pipe.ts","../../../libs/speech/src/operators/confidence-above.ts","../../../libs/speech/src/operators/continuous.ts","../../../libs/speech/src/operators/final.ts","../../../libs/speech/src/operators/first-alternative.ts","../../../libs/speech/src/utils/is-said.ts","../../../libs/speech/src/operators/skip-until-said.ts","../../../libs/speech/src/operators/take-until-said.ts","../../../libs/speech/src/tokens/speech-recognition-max-alternatives.ts","../../../libs/speech/src/services/speech-recognition.service.ts","../../../libs/speech/src/tokens/speech-recognition-support.ts","../../../libs/speech/src/tokens/speech-synthesis-support.ts","../../../libs/speech/src/tokens/speech-synthesis-voices.ts","../../../libs/speech/src/ng-web-apis-speech.ts"],"sourcesContent":["import type {OnChanges} from '@angular/core';\nimport {Directive, EventEmitter, inject, Input, Output} from '@angular/core';\nimport {SPEECH_SYNTHESIS} from '@ng-web-apis/common';\n\n@Directive({\n standalone: true,\n selector: '[waTextToSpeech]',\n})\nexport class WaTextToSpeech implements OnChanges {\n private readonly speechSynthesisRef = inject(SPEECH_SYNTHESIS);\n\n @Input('waTextToSpeechPaused')\n public paused = false;\n\n @Output('waTextToSpeechError')\n public readonly onerror = new EventEmitter<SpeechSynthesisErrorEvent>();\n\n @Output('waTextToSpeechEnd')\n public readonly onend = new EventEmitter<SpeechSynthesisEvent>();\n\n @Output('waTextToSpeechMark')\n public readonly onmark = new EventEmitter<SpeechSynthesisEvent>();\n\n @Output('waTextToSpeechBoundary')\n public readonly onboundary = new EventEmitter<SpeechSynthesisEvent>();\n\n @Input()\n public set waTextToSpeech(utterance: SpeechSynthesisUtterance) {\n this.speechSynthesisRef.cancel();\n this.speechSynthesisRef.pause();\n\n utterance.onerror = (e) => this.onerror.emit(e);\n utterance.onend = (e) => this.onend.emit(e);\n utterance.onmark = (e) => this.onmark.emit(e);\n utterance.onboundary = (e) => this.onboundary.emit(e);\n\n this.speechSynthesisRef.speak(utterance);\n }\n\n public ngOnChanges(): void {\n if (this.paused) {\n this.speechSynthesisRef.pause();\n } else {\n this.speechSynthesisRef.resume();\n }\n }\n}\n\n/**\n * @deprecated: use {@link WaTextToSpeech}\n */\nexport const TextToSpeechDirective = WaTextToSpeech;\n","import type {PipeTransform} from '@angular/core';\nimport {Pipe} from '@angular/core';\n\nimport type {SpeechSynthesisUtteranceOptions} from '../../interfaces/speech-synthesis-utterance-options';\n\n@Pipe({\n standalone: true,\n name: 'waUtterance',\n})\nexport class UtterancePipe implements PipeTransform {\n public transform(\n text: string,\n {\n lang = '',\n pitch = 1,\n rate = 1,\n volume = 1,\n voice = null,\n }: SpeechSynthesisUtteranceOptions | undefined = {},\n ): SpeechSynthesisUtterance {\n const utterance = new SpeechSynthesisUtterance(text);\n\n utterance.lang = lang;\n utterance.pitch = pitch;\n utterance.rate = rate;\n utterance.volume = volume;\n utterance.voice = voice!; // Strange TS issue will not allow null here\n\n return utterance;\n }\n}\n","import type {MonoTypeOperatorFunction} from 'rxjs';\nimport {filter} from 'rxjs';\n\nexport function confidenceAbove(\n threshold: number,\n): MonoTypeOperatorFunction<SpeechRecognitionAlternative> {\n return filter(({confidence}) => confidence > threshold);\n}\n","import type {MonoTypeOperatorFunction} from 'rxjs';\nimport {scan} from 'rxjs';\n\nexport function continuous(): MonoTypeOperatorFunction<SpeechRecognitionResult[]> {\n return scan(\n (result: SpeechRecognitionResult[], current) => [\n ...result.filter(({isFinal}) => isFinal),\n ...current,\n ],\n [],\n );\n}\n","import type {MonoTypeOperatorFunction} from 'rxjs';\nimport {map} from 'rxjs';\n\nexport function final(): MonoTypeOperatorFunction<SpeechRecognitionResult[]> {\n return map((results) => results.filter(({isFinal}) => isFinal));\n}\n","import type {OperatorFunction} from 'rxjs';\nimport {map} from 'rxjs';\n\nexport function firstAlternative(): OperatorFunction<\n SpeechRecognitionResult[],\n SpeechRecognitionAlternative\n> {\n // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain\n return map((result) => result[0]?.[0]!);\n}\n","export function isSaid(phrase: string): (results: SpeechRecognitionResult[]) => boolean {\n const lowercased = phrase.toLowerCase().trim();\n\n return (results) =>\n !!results.find(\n (result) =>\n result.isFinal &&\n result[0]?.transcript.toLowerCase().trim() === lowercased,\n );\n}\n","import type {MonoTypeOperatorFunction} from 'rxjs';\nimport {map, pipe, skipWhile} from 'rxjs';\n\nimport {isSaid} from '../utils/is-said';\n\nexport function skipUntilSaid(\n text: string,\n): MonoTypeOperatorFunction<SpeechRecognitionResult[]> {\n const predicate = isSaid(text);\n\n return pipe(\n skipWhile((results) => !predicate(results)),\n map((value, index) => (index ? value : [])),\n );\n}\n","import type {MonoTypeOperatorFunction} from 'rxjs';\nimport {takeWhile} from 'rxjs';\n\nimport {isSaid} from '../utils/is-said';\n\nexport function takeUntilSaid(\n text: string,\n): MonoTypeOperatorFunction<SpeechRecognitionResult[]> {\n const predicate = isSaid(text);\n\n return takeWhile((results) => !predicate(results));\n}\n","import {InjectionToken} from '@angular/core';\n\nexport const WA_SPEECH_RECOGNITION_MAX_ALTERNATIVES = new InjectionToken<number>(\n '[WA_SPEECH_RECOGNITION_MAX_ALTERNATIVES]',\n {\n factory: () => 1,\n },\n);\n\n/**\n * @deprecated: drop in v5.0, use {@link WA_SPEECH_RECOGNITION_MAX_ALTERNATIVES}\n */\nexport const SPEECH_RECOGNITION_MAX_ALTERNATIVES = WA_SPEECH_RECOGNITION_MAX_ALTERNATIVES;\n","import {inject, Injectable, LOCALE_ID, NgZone} from '@angular/core';\nimport {WA_SPEECH_RECOGNITION} from '@ng-web-apis/common';\nimport {Observable} from 'rxjs';\n\nimport {WA_SPEECH_RECOGNITION_MAX_ALTERNATIVES} from '../tokens/speech-recognition-max-alternatives';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SpeechRecognitionService extends Observable<SpeechRecognitionResult[]> {\n private readonly classRef = inject(WA_SPEECH_RECOGNITION);\n private readonly lang = inject(LOCALE_ID, {optional: true});\n private readonly maxAlternatives = inject(WA_SPEECH_RECOGNITION_MAX_ALTERNATIVES);\n private readonly ngZone = inject(NgZone);\n\n constructor() {\n super((subscriber) => {\n if (!this.classRef) {\n subscriber.error(new Error('SpeechRecognition is not supported'));\n\n return () => {};\n }\n\n // eslint-disable-next-line new-cap\n const speechRecognition = new this.classRef();\n\n speechRecognition.maxAlternatives = this.maxAlternatives;\n speechRecognition.lang = this.lang ?? '';\n speechRecognition.interimResults = true;\n speechRecognition.onerror = (error: unknown) => subscriber.error(error);\n speechRecognition.onend = () => subscriber.complete();\n speechRecognition.onresult = ({results}: any) =>\n this.ngZone.run(() =>\n subscriber.next(\n Array.from({length: results.length}, (_, i) => results[i]),\n ),\n );\n\n speechRecognition.start();\n\n return () => speechRecognition.abort();\n });\n }\n}\n","import {inject, InjectionToken} from '@angular/core';\nimport {SPEECH_RECOGNITION} from '@ng-web-apis/common';\n\nexport const WA_SPEECH_RECOGNITION_SUPPORT = new InjectionToken<boolean>(\n '[WA_SPEECH_RECOGNITION_SUPPORT]',\n {\n factory: () => !!inject(SPEECH_RECOGNITION),\n },\n);\n\n/**\n * @deprecated: drop in v5.0, use {@link WA_SPEECH_RECOGNITION_SUPPORT}\n */\nexport const SPEECH_RECOGNITION_SUPPORT = WA_SPEECH_RECOGNITION_SUPPORT;\n","import {inject, InjectionToken} from '@angular/core';\nimport {SPEECH_SYNTHESIS} from '@ng-web-apis/common';\n\nexport const WA_SPEECH_SYNTHESIS_SUPPORT = new InjectionToken<boolean>(\n '[WA_SPEECH_SYNTHESIS_SUPPORT]',\n {\n factory: () => !!inject(SPEECH_SYNTHESIS),\n },\n);\n\n/**\n * @deprecated: drop in v5.0, use {@link WA_SPEECH_SYNTHESIS_SUPPORT}\n */\nexport const SPEECH_SYNTHESIS_SUPPORT = WA_SPEECH_SYNTHESIS_SUPPORT;\n","import {inject, InjectionToken} from '@angular/core';\nimport {SPEECH_SYNTHESIS} from '@ng-web-apis/common';\nimport type {Observable} from 'rxjs';\nimport {fromEvent, map, startWith} from 'rxjs';\n\nexport const WA_SPEECH_SYNTHESIS_VOICES = new InjectionToken<\n Observable<readonly SpeechSynthesisVoice[]>\n>('[WA_SPEECH_SYNTHESIS_VOICES]', {\n factory: () => {\n const speechSynthesisRef = inject(SPEECH_SYNTHESIS);\n\n return fromEvent(speechSynthesisRef, 'voiceschanged').pipe(\n startWith(null),\n map(() => speechSynthesisRef.getVoices()),\n );\n },\n});\n\n/**\n * @deprecated: drop in v5.0, use {@link WA_SPEECH_SYNTHESIS_VOICES}\n */\nexport const SPEECH_SYNTHESIS_VOICES = WA_SPEECH_SYNTHESIS_VOICES;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}