UNPKG

react-say

Version:

A React component that synthesis text into speech using Web Speech API

1 lines 29.5 kB
{"version":3,"sources":["../src/Composer.jsx","../src/Context.mjs","../src/createCustomEvent.mjs","../src/createDeferred.mjs","../src/createErrorEvent.mjs","../src/QueuedUtterance.mjs","../src/createSynthesize.mjs","../src/Say.jsx","../src/createNativeUtterance.mjs","../src/SayUtterance.jsx","../src/useSynthesize.mjs","../src/SayButton.jsx","../src/migrateDeprecatedProps.mjs","../src/useImmediateEffect.mjs","../src/useEvent.mjs","../src/index.mjs"],"sourcesContent":["import PropTypes from 'prop-types';\nimport React, { useContext, useMemo, useState } from 'react';\n\nimport Context from './Context.mjs';\nimport createSynthesize from './createSynthesize.mjs';\nimport migrateDeprecatedProps from './migrateDeprecatedProps.mjs';\nimport useEvent from './useEvent.mjs';\n\nconst Composer = props => {\n const { children, ponyfill: ponyfillFromProps } = migrateDeprecatedProps(props, Composer);\n\n // If we have the parent context, we will use that synthesize() function and its internal queue.\n const { ponyfill: parentPonyfill, synthesize: parentSynthesize } = useContext(Context) || {};\n\n const ponyfill = ponyfillFromProps ||\n parentPonyfill || {\n speechSynthesis: window.speechSynthesis || window.webkitSpeechSynthesis,\n SpeechSynthesisUtterance: window.SpeechSynthesisUtterance || window.webkitSpeechSynthesisUtterance\n };\n\n // If the parent context changed and no longer has a synthesize() function, we will create the queue.\n // This is very unlikely to happen.\n const synthesize = useMemo(() => parentSynthesize || createSynthesize(), [parentSynthesize]);\n const { speechSynthesis } = ponyfill;\n const [voices, setVoices] = useState(speechSynthesis.getVoices());\n\n useEvent(speechSynthesis, 'voiceschanged', () => setVoices(speechSynthesis.getVoices()));\n\n const context = useMemo(\n () => ({\n ponyfill,\n synthesize,\n voices\n }),\n [ponyfill, synthesize, voices]\n );\n\n return (\n <Context.Provider value={context}>\n {typeof children === 'function' ? <Context.Consumer>{context => children(context)}</Context.Consumer> : children}\n </Context.Provider>\n );\n};\n\nComposer.defaultProps = {\n children: undefined,\n ponyfill: undefined\n};\n\nComposer.propTypes = {\n children: PropTypes.any,\n ponyfill: PropTypes.shape({\n speechSynthesis: PropTypes.any,\n SpeechSynthesisUtterance: PropTypes.any\n })\n};\n\nexport default Composer;\n","import React from 'react';\n\nconst Context = React.createContext();\n\nexport default Context;\n","export default function createCustomEvent(name, eventInitDict) {\n if (name === 'error') {\n if (typeof ErrorEvent === 'function') {\n return new ErrorEvent(name, eventInitDict);\n }\n } else if (typeof CustomEvent === 'function') {\n return new CustomEvent(name, eventInitDict);\n }\n\n const event = document.createEvent('Event');\n\n event.initEvent(name, true, true);\n\n Object.entries(eventInitDict || {}).forEach(([key, value]) => {\n event[key] = value;\n });\n\n return event;\n}\n","export default function createDeferred() {\n let reject, resolve;\n\n const promise = new Promise((promiseResolve, promiseReject) => {\n reject = promiseReject;\n resolve = promiseResolve;\n });\n\n if (!reject || !resolve) {\n throw new Error('Promise is not a ES-compliant and do not run exector immediately');\n }\n\n return { promise, reject, resolve };\n}\n","import createCustomEvent from './createCustomEvent.mjs';\n\nexport default function createErrorEvent(error) {\n return createCustomEvent('error', { error });\n}\n","import createCustomEvent from './createCustomEvent.mjs';\nimport createDeferred from './createDeferred.mjs';\nimport createErrorEvent from './createErrorEvent.mjs';\n\nasync function speakUtterance(ponyfill, utterance, startCallback) {\n const { speechSynthesis } = ponyfill;\n\n const startDeferred = createDeferred();\n const errorDeferred = createDeferred();\n const endDeferred = createDeferred();\n\n utterance.addEventListener('end', endDeferred.resolve);\n utterance.addEventListener('error', errorDeferred.resolve);\n utterance.addEventListener('start', startDeferred.resolve);\n\n // if (speechSynthesis.speaking) {\n // console.warn(`ASSERTION: speechSynthesis.speaking should not be truthy before we call speak`);\n // }\n\n speechSynthesis.speak(utterance);\n\n const startEvent = await Promise.race([errorDeferred.promise, startDeferred.promise]);\n\n if (startEvent.type === 'error') {\n throw startEvent.error;\n }\n\n let finishedSpeaking;\n const endPromise = Promise.race([errorDeferred.promise, endDeferred.promise]);\n\n startCallback &&\n startCallback(async () => {\n if (!finishedSpeaking) {\n speechSynthesis.cancel();\n await endPromise;\n }\n });\n\n const endEvent = await endPromise;\n\n finishedSpeaking = true;\n\n // if (speechSynthesis.speaking) {\n // console.warn(`ASSERTION: speechSynthesis.speaking should not be truthy after speak is stopped`);\n // }\n\n // console.debug(`ENDED: ${ utterance.text }`);\n\n if (endEvent.type === 'error') {\n throw endEvent.error;\n }\n}\n\nexport default class QueuedUtterance {\n constructor(ponyfill, utterance, { onEnd, onError, onStart }) {\n this._cancelled = false;\n this._deferred = createDeferred();\n this._onEnd = onEnd;\n this._onError = onError;\n this._onStart = onStart;\n this._ponyfill = ponyfill;\n this._speaking = false;\n this._utterance = utterance;\n\n this.promise = this._deferred.promise;\n }\n\n async cancel() {\n this._cancelled = true;\n this._cancel && (await this._cancel());\n }\n\n speak() {\n if (this._speaking) {\n console.warn(`ASSERTION: QueuedUtterance is already speaking or has spoken.`);\n }\n\n this._speaking = true;\n\n (async () => {\n if (this._cancelled) {\n throw new Error('cancelled');\n }\n\n await speakUtterance(this._ponyfill, this._utterance, cancel => {\n if (this._cancelled) {\n cancel();\n\n throw new Error('cancelled');\n } else {\n this._cancel = cancel;\n this._onStart && this._onStart(createCustomEvent('start'));\n }\n });\n\n if (this._cancelled) {\n throw new Error('cancelled');\n }\n })().then(\n () => {\n this._onEnd && this._onEnd(createCustomEvent('end'));\n this._deferred.resolve();\n },\n error => {\n this._onError && this._onError(createErrorEvent(error));\n this._deferred.reject(error);\n }\n );\n\n return this.promise;\n }\n}\n","import QueuedUtterance from './QueuedUtterance.mjs';\n\nexport default function createSynthesize() {\n let queueWithCurrent = [];\n let running;\n\n const run = async () => {\n if (running) {\n return;\n }\n\n running = true;\n\n try {\n let queuedUtterance;\n\n while ((queuedUtterance = queueWithCurrent[0])) {\n try {\n await queuedUtterance.speak();\n } catch (err) {\n // TODO: If the error is due to Safari restriction on user touch\n // The next loop on the next audio will also fail because it was not queued with a user touch\n\n err.message !== 'cancelled' && console.error(err);\n }\n\n queueWithCurrent = queueWithCurrent.filter(target => target !== queuedUtterance);\n }\n } finally {\n running = false;\n }\n };\n\n return (ponyfill, utterance, { onEnd, onError, onStart } = {}) => {\n if (!(utterance instanceof ponyfill.SpeechSynthesisUtterance)) {\n throw new Error('utterance must be instance of the ponyfill');\n }\n\n const queuedUtterance = new QueuedUtterance(ponyfill, utterance, { onEnd, onError, onStart });\n\n queueWithCurrent = [...queueWithCurrent, queuedUtterance];\n run();\n\n return {\n // The cancel() function returns a Promise\n cancel: () => queuedUtterance.cancel(),\n promise: queuedUtterance.promise\n };\n };\n}\n","import PropTypes from 'prop-types';\nimport React, { useContext, useMemo } from 'react';\n\nimport Composer from './Composer.jsx';\nimport Context from './Context.mjs';\nimport createNativeUtterance from './createNativeUtterance.mjs';\nimport migrateDeprecatedProps from './migrateDeprecatedProps.mjs';\nimport SayUtterance from './SayUtterance.jsx';\n\nconst Say = props => {\n let { lang, onBoundary, onEnd, onError, onStart, pitch, rate, speak, text, voice, volume } = migrateDeprecatedProps(\n props,\n Say\n );\n\n const { ponyfill } = useContext(Context);\n\n if (speak && !text) {\n console.warn('react-say: \"speak\" prop is being deprecated and renamed to \"text\".');\n text = speak;\n }\n\n const utterance = useMemo(\n () =>\n createNativeUtterance(ponyfill, {\n lang,\n onBoundary,\n pitch,\n rate,\n text,\n voice,\n volume\n }),\n [lang, onBoundary, pitch, ponyfill, rate, text, voice, volume]\n );\n\n return <SayUtterance onEnd={onEnd} onError={onError} onStart={onStart} ponyfill={ponyfill} utterance={utterance} />;\n};\n\nSay.defaultProps = {\n children: undefined,\n lang: undefined,\n onBoundary: undefined,\n onEnd: undefined,\n onError: undefined,\n onStart: undefined,\n pitch: undefined,\n rate: undefined,\n speak: undefined,\n voice: undefined,\n volume: undefined\n};\n\nSay.propTypes = {\n children: PropTypes.any,\n lang: PropTypes.string,\n onBoundary: PropTypes.func,\n onEnd: PropTypes.func,\n onError: PropTypes.func,\n onStart: PropTypes.func,\n pitch: PropTypes.number,\n rate: PropTypes.number,\n speak: PropTypes.string,\n text: PropTypes.string.isRequired,\n voice: PropTypes.oneOfType([PropTypes.any, PropTypes.func]),\n volume: PropTypes.number\n};\n\nconst SayWithContext = ({ ponyfill, ...props }) => (\n <Composer ponyfill={ponyfill}>\n <Say {...props} />\n </Composer>\n);\n\nSayWithContext.defaultProps = {\n ...SayUtterance.defaultProps,\n ponyfill: undefined\n};\n\nSayWithContext.propTypes = {\n ...SayUtterance.propTypes,\n ponyfill: PropTypes.shape({\n speechSynthesis: PropTypes.any.isRequired,\n SpeechSynthesisUtterance: PropTypes.any.isRequired\n })\n};\n\nexport default SayWithContext;\n","export default function createNativeUtterance(\n { speechSynthesis, SpeechSynthesisUtterance },\n { lang, onBoundary, pitch, rate, text, voice, volume }\n) {\n const utterance = new SpeechSynthesisUtterance(text);\n let targetVoice;\n\n if (typeof voice === 'function') {\n targetVoice = voice.call(speechSynthesis, speechSynthesis.getVoices());\n } else {\n const { voiceURI } = voice || {};\n\n targetVoice = voiceURI && [].find.call([].slice.call(speechSynthesis.getVoices()), v => v.voiceURI === voiceURI);\n }\n\n // Edge will mute if \"lang\" is set to \"\"\n utterance.lang = lang || '';\n\n if (pitch || pitch === 0) {\n utterance.pitch = pitch;\n }\n\n if (rate || rate === 0) {\n utterance.rate = rate;\n }\n\n // Cognitive Services will error when \"voice\" is set to \"null\"\n // Edge will error when \"voice\" is set to \"undefined\"\n if (targetVoice) {\n utterance.voice = targetVoice;\n }\n\n if (volume || volume === 0) {\n utterance.volume = volume;\n }\n\n // Since browser quirks, start/error/end events are emulated for best compatibility\n // start/error/end events are emulated in QueuedUtterance\n\n onBoundary && utterance.addEventListener('boundary', onBoundary);\n // onEnd && utterance.addEventListener('end', onEnd);\n // onError && utterance.addEventListener('error', onError);\n // onStart && utterance.addEventListener('start', onStart);\n\n return utterance;\n}\n","import PropTypes from 'prop-types';\nimport React, { useEffect, useRef } from 'react';\n\nimport Composer from './Composer.jsx';\nimport createCustomEvent from './createCustomEvent.mjs';\nimport createErrorEvent from './createErrorEvent.mjs';\nimport migrateDeprecatedProps from './migrateDeprecatedProps.mjs';\nimport useSynthesize from './useSynthesize.mjs';\n\nconst SayUtterance = props => {\n const { onEnd, onError, onStart, utterance } = migrateDeprecatedProps(props);\n\n const started = useRef(false);\n const synthesize = useSynthesize();\n\n // This useEffect() is essentially converting Promise-based useSynthesize() into events.\n useEffect(() => {\n // After synthesis started, if utterance has changed, the event will be fired by the wrong target.\n // Thus, we do not allow utterance to change after synthesis started.\n if (started.current) {\n // Since we have already cancelled the previous utterance, we are not starting a new one.\n // This is because if we start a new one, we could fire onStart event twice, which sound confusing to the developer.\n\n return console.warn('react-say: Should not change utterance after synthesis started.');\n }\n\n let cancelled;\n const { cancel, promise } = synthesize(utterance, () => {\n started.current = true;\n !cancelled && onStart && onStart(createCustomEvent('start'));\n });\n\n promise.then(\n () => !cancelled && onEnd && onEnd(createCustomEvent('end')),\n error => !cancelled && onError && onError(createErrorEvent(error))\n );\n\n return () => {\n cancelled = true;\n cancel();\n };\n }, []);\n\n return false;\n};\n\nSayUtterance.defaultProps = {\n onEnd: undefined,\n onError: undefined,\n onStart: undefined\n};\n\nSayUtterance.propTypes = {\n onEnd: PropTypes.func,\n onError: PropTypes.func,\n onStart: PropTypes.func\n};\n\nconst SayUtteranceWithContext = ({ ponyfill, ...props }) => (\n <Composer ponyfill={ponyfill}>\n <SayUtterance {...props} />\n </Composer>\n);\n\nSayUtteranceWithContext.defaultProps = {\n ...SayUtterance.defaultProps,\n ponyfill: undefined\n};\n\nSayUtteranceWithContext.propTypes = {\n ...SayUtterance.propTypes,\n ponyfill: PropTypes.shape({\n speechSynthesis: PropTypes.any.isRequired,\n SpeechSynthesisUtterance: PropTypes.any.isRequired\n })\n};\n\nexport default SayUtteranceWithContext;\n","import { useContext } from 'react';\n\nimport Context from './Context.mjs';\nimport createNativeUtterance from './createNativeUtterance.mjs';\n\nexport default function useSynthesize() {\n const { ponyfill, synthesize } = useContext(Context);\n\n return (utteranceOrText, progressFn) => {\n if (typeof utteranceOrText === 'string') {\n utteranceOrText = createNativeUtterance(ponyfill, { text: utteranceOrText });\n }\n\n return synthesize(ponyfill, utteranceOrText, { onStart: progressFn && (() => progressFn()) });\n };\n}\n","import PropTypes from 'prop-types';\nimport React, { useCallback, useState } from 'react';\n\nimport migrateDeprecatedProps from './migrateDeprecatedProps.mjs';\nimport Say from './Say.jsx';\n\nconst SayButton = props => {\n const { children, disabled, lang, onBoundary, onEnd, onError, onStart, pitch, ponyfill, rate, text, voice, volume } =\n migrateDeprecatedProps(props, SayButton);\n\n const [busy, setBusy] = useState(false);\n const handleClick = useCallback(() => setBusy(true));\n const sayProps = {\n lang,\n onBoundary,\n onEnd: event => {\n setBusy(false);\n onEnd && onEnd(event);\n },\n onError,\n onStart,\n pitch,\n ponyfill,\n rate,\n text,\n voice,\n volume\n };\n\n return (\n <React.Fragment>\n <button disabled={typeof disabled === 'boolean' ? disabled : busy} onClick={handleClick}>\n {children}\n </button>\n {busy && <Say {...sayProps} />}\n </React.Fragment>\n );\n};\n\nSayButton.defaultProps = {\n children: undefined,\n disabled: undefined,\n lang: undefined,\n onBoundary: undefined,\n onEnd: undefined,\n onError: undefined,\n onStart: undefined,\n pitch: undefined,\n ponyfill: undefined,\n rate: undefined,\n text: undefined,\n voice: undefined,\n volume: undefined\n};\n\nSayButton.propTypes = {\n children: PropTypes.any,\n disabled: PropTypes.bool,\n lang: PropTypes.string,\n onBoundary: PropTypes.func,\n onEnd: PropTypes.func,\n onError: PropTypes.func,\n onStart: PropTypes.func,\n pitch: PropTypes.number,\n ponyfill: PropTypes.shape({\n speechSynthesis: PropTypes.any.isRequired,\n SpeechSynthesisUtterance: PropTypes.any.isRequired\n }),\n rate: PropTypes.number,\n text: PropTypes.string,\n voice: PropTypes.oneOfType([PropTypes.any, PropTypes.func]),\n volume: PropTypes.number\n};\n\nexport default SayButton;\n","import Say from './Say.jsx';\nimport SayButton from './SayButton.jsx';\n\nconst warnings = {\n ponyfill: true,\n saySpeak: true\n};\n\nexport default function migrateDeprecatedProps(\n { ponyfill, speak, speechSynthesis, speechSynthesisUtterance, text, ...otherProps },\n componentType\n) {\n if (!ponyfill && (speechSynthesis || speechSynthesisUtterance)) {\n if (warnings.ponyfill) {\n console.warn(\n 'react-say: \"speechSynthesis\" and \"speechSynthesisUtterance\" props has been renamed to \"ponyfill\". Please update your code. The deprecated props will be removed in version >= 3.0.0.'\n );\n\n warnings.ponyfill = false;\n }\n\n ponyfill = {\n speechSynthesis,\n SpeechSynthesisUtterance: speechSynthesisUtterance\n };\n }\n\n if (componentType === Say || componentType === SayButton) {\n if (speak && !text) {\n if (warnings.saySpeak) {\n console.warn(\n 'react-say: \"speak\" prop has been renamed to \"text\". Please update your code. The deprecated props will be removed in version >= 3.0.0.'\n );\n\n warnings.saySpeak = false;\n }\n\n text = speak;\n }\n }\n\n return {\n ponyfill,\n text,\n ...otherProps\n };\n}\n","import { useEffect, useRef } from 'react';\n\nexport default function useImmediateEffect(fn, deps) {\n const unsubscribeRef = useRef({\n first: true,\n id: Math.random().toString(36).substr(2, 5),\n unsubscribe: fn()\n });\n\n useEffect(() => {\n const { current } = unsubscribeRef;\n\n if (!current.first) {\n current.unsubscribe = fn();\n } else {\n current.first = false;\n }\n\n return () => {\n current.unsubscribe && current.unsubscribe();\n current.unsubscribe = null;\n };\n }, deps);\n}\n","import useImmediateEffect from './useImmediateEffect.mjs';\n\nexport default function useEvent(target, name, listener, options) {\n useImmediateEffect(() => {\n const handler = event => listener && listener(event);\n\n target.addEventListener(name, handler, options);\n\n return () => {\n // It seems speechSynthesis.onvoiceschanged still fire after we called removeEventListener.\n // We are protecting this scenario by setting listener to falsy.\n listener = null;\n target.removeEventListener(name, handler, options);\n };\n }, [listener, name, options, target]);\n}\n","import Composer from './Composer.jsx';\nimport Context from './Context.mjs';\nimport Say from './Say.jsx';\nimport SayButton from './SayButton.jsx';\nimport SayUtterance from './SayUtterance.jsx';\n\nexport default Say;\n\nexport { Composer, Context, SayButton, SayUtterance };\n"],"mappings":"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","names":["PropTypes","React","useContext","useMemo","useState","PropTypes","React","useContext","React","React","useContext","React","PropTypes","PropTypes","React","React","PropTypes","useEffect","useRef","useContext","useMemo","useState","React","context","PropTypes"]}