{"version":3,"file":"ng-web-apis-speech.mjs","sources":["../../../libs/speech/src/directives/text-to-speech.directive.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/pipes/utterance.pipe.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 {Directive, inject, input, type OnChanges, output} from '@angular/core';\nimport {WA_SPEECH_SYNTHESIS} from '@ng-web-apis/common';\n\n@Directive({\n    selector: '[waTextToSpeech]',\n    inputs: ['waTextToSpeech'],\n})\nexport class WaTextToSpeech implements OnChanges {\n    private readonly speechSynthesisRef = inject(WA_SPEECH_SYNTHESIS);\n\n    public paused = input(false, {alias: 'waTextToSpeechPaused'});\n    public readonly onend = output<SpeechSynthesisEvent>({alias: 'waTextToSpeechEnd'});\n    public readonly onmark = output<SpeechSynthesisEvent>({alias: 'waTextToSpeechMark'});\n    public readonly onerror = output<SpeechSynthesisErrorEvent>({\n        alias: 'waTextToSpeechError',\n    });\n\n    public readonly onboundary = output<SpeechSynthesisEvent>({\n        alias: 'waTextToSpeechBoundary',\n    });\n\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","import {filter, type MonoTypeOperatorFunction} from 'rxjs';\n\nexport function confidenceAbove(\n    threshold: number,\n): MonoTypeOperatorFunction<SpeechRecognitionAlternative> {\n    return filter(({confidence}) => confidence > threshold);\n}\n","import {type MonoTypeOperatorFunction, 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 {map, type MonoTypeOperatorFunction} from 'rxjs';\n\nexport function final(): MonoTypeOperatorFunction<SpeechRecognitionResult[]> {\n    return map((results) => results.filter(({isFinal}) => isFinal));\n}\n","import {map, type OperatorFunction} 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 {map, type MonoTypeOperatorFunction, 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, 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 {Pipe, type PipeTransform} from '@angular/core';\n\nimport {type SpeechSynthesisUtteranceOptions} from '../interfaces/speech-synthesis-utterance-options';\n\n@Pipe({name: 'waUtterance'})\nexport class WaSpeechUtterancePipe 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 = {},\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 {InjectionToken} from '@angular/core';\n\nexport const WA_SPEECH_RECOGNITION_MAX_ALTERNATIVES = new InjectionToken<number>(\n    ngDevMode ? '[WA_SPEECH_RECOGNITION_MAX_ALTERNATIVES]' : '',\n    {factory: () => 1},\n);\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({providedIn: 'root'})\nexport class WaSpeechRecognitionService 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            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 {WA_SPEECH_RECOGNITION} from '@ng-web-apis/common';\n\nexport const WA_SPEECH_RECOGNITION_SUPPORT = new InjectionToken<boolean>(\n    ngDevMode ? '[WA_SPEECH_RECOGNITION_SUPPORT]' : '',\n    {factory: () => !!inject(WA_SPEECH_RECOGNITION)},\n);\n","import {inject, InjectionToken} from '@angular/core';\nimport {WA_SPEECH_SYNTHESIS} from '@ng-web-apis/common';\n\nexport const WA_SPEECH_SYNTHESIS_SUPPORT = new InjectionToken<boolean>(\n    ngDevMode ? '[WA_SPEECH_SYNTHESIS_SUPPORT]' : '',\n    {factory: () => !!inject(WA_SPEECH_SYNTHESIS)},\n);\n","import {inject, InjectionToken} from '@angular/core';\nimport {WA_SPEECH_SYNTHESIS} from '@ng-web-apis/common';\nimport {fromEvent, map, type Observable, startWith} from 'rxjs';\n\nexport const WA_SPEECH_SYNTHESIS_VOICES = new InjectionToken<\n    Observable<readonly SpeechSynthesisVoice[]>\n>(ngDevMode ? '[WA_SPEECH_SYNTHESIS_VOICES]' : '', {\n    factory: () => {\n        const speechSynthesisRef = inject(WA_SPEECH_SYNTHESIS);\n\n        return fromEvent(speechSynthesisRef, 'voiceschanged').pipe(\n            startWith(null),\n            map(() => speechSynthesisRef.getVoices()),\n        );\n    },\n});\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}