@davi-ai/retorik-framework 4.0.4 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +13 -0
  2. package/dist/{AttachmentDetail.637ad44f.js → AttachmentDetail.3f9c113d.js} +15 -6
  3. package/dist/AttachmentDetail.3f9c113d.js.map +1 -0
  4. package/dist/{AttachmentDetail.83788045.js → AttachmentDetail.57c5579a.js} +15 -6
  5. package/dist/AttachmentDetail.57c5579a.js.map +1 -0
  6. package/dist/{CustomView.bf84bdf3.js → CustomView.6b96f53f.js} +8 -4
  7. package/dist/CustomView.6b96f53f.js.map +1 -0
  8. package/dist/{CustomView.9930c671.js → CustomView.b32a608f.js} +8 -4
  9. package/dist/CustomView.b32a608f.js.map +1 -0
  10. package/dist/{Emergency.1112c09f.js → Emergency.43605d14.js} +11 -2
  11. package/dist/Emergency.43605d14.js.map +1 -0
  12. package/dist/{Emergency.d5810ff2.js → Emergency.f1287bd5.js} +11 -2
  13. package/dist/Emergency.f1287bd5.js.map +1 -0
  14. package/dist/FullScreenImage.17df27bf.js.map +1 -1
  15. package/dist/FullScreenImage.99e19e10.js.map +1 -1
  16. package/dist/{HistoryList.3b4b1ffb.js → HistoryList.c19556a7.js} +8 -2
  17. package/dist/HistoryList.c19556a7.js.map +1 -0
  18. package/dist/{HistoryList.e5c01f21.js → HistoryList.e7262d62.js} +8 -2
  19. package/dist/HistoryList.e7262d62.js.map +1 -0
  20. package/dist/{LanguageChoice.1d866cfa.js → LanguageChoice.54fae1dc.js} +19 -8
  21. package/dist/LanguageChoice.54fae1dc.js.map +1 -0
  22. package/dist/{LanguageChoice.cce361a3.js → LanguageChoice.6e8b74f6.js} +19 -8
  23. package/dist/LanguageChoice.6e8b74f6.js.map +1 -0
  24. package/dist/LittleWeatherContainer.7e41105e.js.map +1 -1
  25. package/dist/LittleWeatherContainer.ee087e22.js.map +1 -1
  26. package/dist/{MapContainer.14c28128.js → MapContainer.25c8f4b4.js} +20 -5
  27. package/dist/MapContainer.25c8f4b4.js.map +1 -0
  28. package/dist/{MapContainer.f22ad81f.js → MapContainer.d00ab5b2.js} +20 -5
  29. package/dist/MapContainer.d00ab5b2.js.map +1 -0
  30. package/dist/{NewsContainer.d9de093c.js → NewsContainer.a39630c3.js} +33 -26
  31. package/dist/NewsContainer.a39630c3.js.map +1 -0
  32. package/dist/{NewsContainer.463e74de.js → NewsContainer.ec15c3bb.js} +33 -26
  33. package/dist/NewsContainer.ec15c3bb.js.map +1 -0
  34. package/dist/PrintingPreview.375e62b0.js.map +1 -1
  35. package/dist/PrintingPreview.c0ca7706.js.map +1 -1
  36. package/dist/RecognitionManager.c58b8a3d.js +298 -0
  37. package/dist/RecognitionManager.c58b8a3d.js.map +1 -0
  38. package/dist/RecognitionManager.cdfb39fc.js +314 -0
  39. package/dist/RecognitionManager.cdfb39fc.js.map +1 -0
  40. package/dist/SpiritEngineWrapper.21ea10d4.js.map +1 -1
  41. package/dist/SpiritEngineWrapper.39627300.js.map +1 -1
  42. package/dist/SynthesisPonyfillManager.10888d6d.js +888 -0
  43. package/dist/SynthesisPonyfillManager.10888d6d.js.map +1 -0
  44. package/dist/SynthesisPonyfillManager.f9f9a915.js +920 -0
  45. package/dist/SynthesisPonyfillManager.f9f9a915.js.map +1 -0
  46. package/dist/{ThreeJsWrapper.dd4906ff.js → ThreeJsWrapper.0285d280.js} +24 -12
  47. package/dist/ThreeJsWrapper.0285d280.js.map +1 -0
  48. package/dist/{ThreeJsWrapper.c02a077f.js → ThreeJsWrapper.ad746197.js} +24 -11
  49. package/dist/ThreeJsWrapper.ad746197.js.map +1 -0
  50. package/dist/{VeilleManager.f3bafdec.js → VeilleManager.0b3f2454.js} +11 -13
  51. package/dist/VeilleManager.0b3f2454.js.map +1 -0
  52. package/dist/{VeilleManager.85967e7c.js → VeilleManager.340a7825.js} +11 -13
  53. package/dist/VeilleManager.340a7825.js.map +1 -0
  54. package/dist/{Weather.7e945307.js → Weather.abc13d88.js} +9 -3
  55. package/dist/Weather.abc13d88.js.map +1 -0
  56. package/dist/{Weather.e81b7205.js → Weather.b9d9f82e.js} +9 -3
  57. package/dist/Weather.b9d9f82e.js.map +1 -0
  58. package/dist/index.d.ts +21 -951
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +52952 -33750
  61. package/dist/index.js.map +1 -1
  62. package/dist/index.modern.js +53468 -34269
  63. package/dist/index.modern.js.map +1 -1
  64. package/package.json +21 -21
  65. package/dist/AttachmentDetail.637ad44f.js.map +0 -1
  66. package/dist/AttachmentDetail.83788045.js.map +0 -1
  67. package/dist/CustomView.9930c671.js.map +0 -1
  68. package/dist/CustomView.bf84bdf3.js.map +0 -1
  69. package/dist/Emergency.1112c09f.js.map +0 -1
  70. package/dist/Emergency.d5810ff2.js.map +0 -1
  71. package/dist/HistoryList.3b4b1ffb.js.map +0 -1
  72. package/dist/HistoryList.e5c01f21.js.map +0 -1
  73. package/dist/LanguageChoice.1d866cfa.js.map +0 -1
  74. package/dist/LanguageChoice.cce361a3.js.map +0 -1
  75. package/dist/MapContainer.14c28128.js.map +0 -1
  76. package/dist/MapContainer.f22ad81f.js.map +0 -1
  77. package/dist/NewsContainer.463e74de.js.map +0 -1
  78. package/dist/NewsContainer.d9de093c.js.map +0 -1
  79. package/dist/ThreeJsWrapper.c02a077f.js.map +0 -1
  80. package/dist/ThreeJsWrapper.dd4906ff.js.map +0 -1
  81. package/dist/VeilleManager.85967e7c.js.map +0 -1
  82. package/dist/VeilleManager.f3bafdec.js.map +0 -1
  83. package/dist/Weather.7e945307.js.map +0 -1
  84. package/dist/Weather.e81b7205.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["src/components/Speech/SynthesisPonyfillManager.tsx","src/utils/fetchSpeechServicesToken.ts","src/utils/selectVoice.ts","src/components/Speech/SynthesisManager.tsx","src/utils/speechSynthesisUtils.ts","src/utils/createUtterance.ts","src/components/Speech/RetorikSpeech.tsx","src/components/Speech/IndexedDbManager.ts"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react'\r\nimport { createSpeechSynthesisPonyfill } from '@davi-ai/web-speech-cognitive-services-davi'\r\nimport type { SpeechSynthesisPonyfillType, PonyfillOptions } from '@davi-ai/web-speech-cognitive-services-davi'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport { RootState, storeActions } from '../../store'\r\nimport { fetchSpeechServicesToken } from '../../utils/fetchSpeechServicesToken'\r\nimport { selectVoice } from '../../utils/selectVoice'\r\nimport SynthesisManager from './SynthesisManager'\r\n\r\ninterface SynthesisPonyfillManagerProps {\r\n isRetorikNews?: boolean\r\n}\r\n\r\nconst SynthesisPonyfillManager = ({ isRetorikNews }: SynthesisPonyfillManagerProps): React.JSX.Element | null => {\r\n const dispatch = useDispatch()\r\n const customVoice = useSelector((state: RootState) => state.speechReducer.customVoice)\r\n const ponyfillCredentials = useSelector((state: RootState) => state.speechReducer.ponyfillCredentials)\r\n const locale = useSelector((state: RootState) => state.localeReducer.locale)\r\n const agentData = useSelector((state: RootState) => state.retorikReducer.agentData)\r\n\r\n const [ponyfillCreated, setPonyfillCreated] = useState<boolean>(false)\r\n const ponyfillRef = useRef<SpeechSynthesisPonyfillType | undefined>(undefined)\r\n const refreshTimerRef = useRef<NodeJS.Timeout | null>(null)\r\n\r\n /**\r\n * Async function to retrieve a new token and assign it to the speechConfig inside ponyfill.speechSynthesis\r\n * @param {string} region\r\n * @param {string} key\r\n */\r\n const refreshTokenInNineMinutes = async (region: string, key: string): Promise<void> => {\r\n // A token is valid during 10 minutes, let's refresh it after 9 minutes\r\n refreshTimerRef.current = setTimeout(async () => {\r\n const token = await fetchSpeechServicesToken(region, key)\r\n\r\n if (token && ponyfillRef.current?.speechSynthesis?.speechConfig) {\r\n ponyfillRef.current.speechSynthesis.speechConfig.authorizationToken = token\r\n refreshTokenInNineMinutes(region, key)\r\n }\r\n }, 1000 * 60 * 9) // 9 minutes\r\n }\r\n\r\n /**\r\n * Fetch speech synthesis token and create the ponyfill containing all data\r\n * @param {string} region\r\n * @param {string} key\r\n */\r\n const fetchTokenAndCreatePonyfill = async (region: string, key: string): Promise<void> => {\r\n const token = await fetchSpeechServicesToken(region, key)\r\n\r\n if (token) {\r\n ponyfillRef.current = createSpeechSynthesisPonyfill({\r\n credentials: {\r\n region: ponyfillCredentials?.region,\r\n authorizationToken: token\r\n }\r\n })\r\n // Launch token refresh after ponyfill creation\r\n refreshTokenInNineMinutes(region, key)\r\n setPonyfillCreated(true)\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (ponyfillCredentials?.authorizationToken && ponyfillCredentials.region) {\r\n const data: PonyfillOptions = {\r\n credentials: ponyfillCredentials\r\n }\r\n ponyfillRef.current = createSpeechSynthesisPonyfill(data)\r\n setPonyfillCreated(true)\r\n } else if (ponyfillCredentials?.subscriptionKey && ponyfillCredentials.region) {\r\n fetchTokenAndCreatePonyfill(ponyfillCredentials.region, ponyfillCredentials.subscriptionKey)\r\n } else if (ponyfillCredentials?.speechSynthesisHostname) {\r\n // To use self-hosted voice containers, we need no 'region', and 'speechSynthesisHostname' and 'speechRecognitionHostname' must both be defined\r\n // As this ponyfill is for speech synthesis only, we put a mock 'speechRecognitionHostname'\r\n const data: PonyfillOptions = {\r\n credentials: {\r\n // @ts-ignore\r\n speechSynthesisHostname: new URL(ponyfillCredentials.speechSynthesisHostname),\r\n speechRecognitionHostname: ponyfillCredentials.speechRecognitionHostname || 'mandatory_recognition_host_name',\r\n subscriptionKey: ponyfillCredentials.subscriptionKey || 'mandatory_subscription_key'\r\n }\r\n }\r\n ponyfillRef.current = createSpeechSynthesisPonyfill(data)\r\n setPonyfillCreated(true)\r\n }\r\n }, [ponyfillCredentials])\r\n\r\n const onVoicesChanged = (): void => {\r\n const voices = ponyfillRef.current?.speechSynthesis.getVoices()\r\n if (voices && Array.isArray(voices) && voices.length) {\r\n dispatch(storeActions.speech.setVoice(selectVoice(voices, locale, customVoice, agentData) || undefined))\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (ponyfillRef.current) {\r\n const voices = ponyfillRef.current.speechSynthesis.getVoices()\r\n if (voices && Array.isArray(voices) && voices.length) {\r\n dispatch(storeActions.speech.setVoice(selectVoice(voices, locale, customVoice, agentData) || undefined))\r\n } else {\r\n ponyfillRef.current.speechSynthesis.onvoiceschanged = onVoicesChanged\r\n }\r\n }\r\n }, [ponyfillCreated, customVoice, agentData, locale])\r\n\r\n useEffect(() => {\r\n return (): void => {\r\n refreshTimerRef.current && clearTimeout(refreshTimerRef.current)\r\n }\r\n }, [])\r\n\r\n return ponyfillCreated && ponyfillRef.current ? <SynthesisManager ponyfill={ponyfillRef.current} isRetorikNews={isRetorikNews} /> : <React.Fragment />\r\n}\r\n\r\nexport default SynthesisPonyfillManager\r\n","const fetchSpeechServicesToken = async (\r\n region: string,\r\n key: string\r\n): Promise<any | undefined> => {\r\n const tokenRes = await fetch(\r\n `https://${region}.api.cognitive.microsoft.com/sts/v1.0/issueToken`,\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'Ocp-Apim-Subscription-Key': key\r\n }\r\n }\r\n )\r\n .then((value) => {\r\n return value.text()\r\n })\r\n .catch((error) => {\r\n console.log('Error : ', error)\r\n return undefined\r\n })\r\n\r\n return tokenRes\r\n}\r\n\r\nexport { fetchSpeechServicesToken }\r\n","const selectVoice = (\r\n voices,\r\n locale,\r\n customVoice,\r\n agentData\r\n): SpeechSynthesisVoice | null => {\r\n let voice: SpeechSynthesisVoice | null = null\r\n // Check if a custom voice is defined in the props\r\n if (customVoice) {\r\n if (customVoice.voice) {\r\n // Search voice with its full name (ex: AriaNeural, GuyNeural)\r\n const neuralVoice = new RegExp(customVoice.voice, 'iu')\r\n voice = voices.find(\r\n ({ name }) => neuralVoice.test(name) || name === customVoice.voice\r\n )\r\n } else if (customVoice.gender) {\r\n // Search voice depending on given gender and locale\r\n voice = voices.find(({ gender, lang }) => {\r\n return (\r\n gender.toLowerCase() === customVoice?.gender?.toLowerCase() &&\r\n lang === locale\r\n )\r\n })\r\n }\r\n }\r\n // Get voice depending on locale and gender\r\n if (!voice) {\r\n voice = voices.find(({ gender, lang }) => {\r\n return (\r\n gender.toLowerCase() ===\r\n (agentData?.gender?.toLowerCase() || 'female') && lang === locale\r\n )\r\n })\r\n }\r\n // No voice found, fall back to US default voices : female => Aria / male => Guy\r\n if (!voice) {\r\n const genderedVoice =\r\n agentData?.gender?.toLowerCase() === 'female' ? 'AriaNeural' : 'GuyNeural'\r\n const neuralVoice = new RegExp(genderedVoice, 'iu')\r\n voice = voices.find(({ name }) => neuralVoice.test(name))\r\n }\r\n\r\n return voice\r\n}\r\n\r\nexport { selectVoice }\r\n","import React, { useEffect, useState, useRef } from 'react'\r\nimport { SpeechSynthesisUtterance, SpeechSynthesisPonyfillType } from '@davi-ai/web-speech-cognitive-services-davi'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport { RootState, storeActions, Mode, RecognitionState, Routes } from '../../store'\r\nimport { useTelemetry } from '../Contexts/TelemetryContext'\r\n\r\nimport type { CreateUtteranceParams } from '../../models/speechTypes'\r\nimport type { RetorikActivity } from '../../store/models/activityTypes'\r\nimport { TraceType } from '../../models/enums'\r\nimport { selectVoice } from '../../utils/selectVoice'\r\nimport { checkSayAsWordsAndCreateUtterance } from '../../utils/speechSynthesisUtils'\r\n\r\nimport RetorikSpeech from './RetorikSpeech'\r\n\r\ninterface SynthesisManagerProps {\r\n ponyfill: SpeechSynthesisPonyfillType\r\n isRetorikNews?: boolean\r\n}\r\n\r\nconst SynthesisManager = ({ ponyfill, isRetorikNews }: SynthesisManagerProps): React.JSX.Element | null => {\r\n const dispatch = useDispatch()\r\n const cancel = useSelector((state: RootState) => state.speechReducer.cancel)\r\n const streamingQueue = useSelector((state: RootState) => state.speechReducer.streamingQueue)\r\n const voice = useSelector((state: RootState) => state.speechReducer.voice)\r\n const customVoice = useSelector((state: RootState) => state.speechReducer.customVoice)\r\n const activeRecognitionState = useSelector((state: RootState) => state.speechReducer.activeRecognitionState)\r\n const externalTextToSpeech = useSelector((state: RootState) => state.speechReducer.externalTextToSpeech)\r\n const isMicrophoneAllowed = useSelector((state: RootState) => state.speechReducer.isMicrophoneAllowed)\r\n const mode = useSelector((state: RootState) => state.speechReducer.mode)\r\n const route = useSelector((state: RootState) => state.viewReducer.route)\r\n const locale = useSelector((state: RootState) => state.localeReducer.locale)\r\n const replacementLocales = useSelector((state: RootState) => state.localeReducer.replacementLocales)\r\n const agentData = useSelector((state: RootState) => state.retorikReducer.agentData)\r\n const appAvailable = useSelector((state: RootState) => state.retorikReducer.appAvailable)\r\n const preventExpectedInputHint = useSelector((state: RootState) => state.retorikReducer.configuration.preventExpectedInputHint)\r\n const speechSynthesisOptions = useSelector((state: RootState) => state.retorikReducer.configuration.speechSynthesisOptions)\r\n const sendTrace = useTelemetry().sendTrace\r\n\r\n const [utterance, setUtterance] = useState<SpeechSynthesisUtterance | null>(null)\r\n const [nextUtterance, setNextUtterance] = useState<SpeechSynthesisUtterance | null>(null)\r\n const [forceSpeechCaching, setForceSpeechCaching] = useState<boolean>(false)\r\n\r\n const isNewsViewRef = useRef<boolean>(!!isRetorikNews)\r\n const lastListTextPlayedRef = useRef<string>('')\r\n const streamingQueueRef = useRef<Array<RetorikActivity>>([])\r\n const currentActivityRef = useRef<RetorikActivity | null>(null)\r\n\r\n /**\r\n * Check activity locale in case of voice change during the speech, to keep the language defined in activity\r\n * instead of switching languages between answers that are written in the same language\r\n * @param {string} activityLocale\r\n * @returns {SpeechSynthesisVoice | null}\r\n */\r\n const getVoiceAfterCheckingActivityLocale = (activityLocale: string): SpeechSynthesisVoice | null => {\r\n return activityLocale === locale ? voice : selectVoice(ponyfill.speechSynthesis.getVoices(), activityLocale, customVoice, agentData)\r\n }\r\n\r\n /**\r\n * Check if the activity is a list one, to prevent text re-reading on state update\r\n * @param {CreateUtteranceParams} params\r\n * @returns {SpeechSynthesisUtterance}\r\n */\r\n const checkActivityAndCreateUtterance = (params: CreateUtteranceParams): SpeechSynthesisUtterance => {\r\n if (params.activity.attachmentLayout && params.activity.attachmentLayout.toLowerCase() === 'davilist') {\r\n const textToSpeak = params.activity.speak || params.activity.text\r\n if (textToSpeak) {\r\n if (textToSpeak === lastListTextPlayedRef.current) {\r\n return checkSayAsWordsAndCreateUtterance({ ...params, voice: null }, speechSynthesisOptions?.sayAs)\r\n } else {\r\n lastListTextPlayedRef.current = textToSpeak\r\n }\r\n }\r\n }\r\n\r\n return checkSayAsWordsAndCreateUtterance(params, speechSynthesisOptions?.sayAs)\r\n }\r\n\r\n const resetData = (): void => {\r\n // Set all activities currently in the queue as ended\r\n streamingQueueRef.current?.forEach((activity) => {\r\n dispatch(storeActions.activity.addEndedActivity(activity.id))\r\n })\r\n streamingQueueRef.current = []\r\n dispatch(storeActions.speech.killCurrentStreaming())\r\n\r\n currentActivityRef.current = null\r\n setUtterance(null)\r\n setNextUtterance(null)\r\n dispatch(storeActions.speech.resetCancelCurrentUtterance())\r\n dispatch(storeActions.speech.setSpeaking(false))\r\n dispatch(storeActions.speech.setBoundaryData([]))\r\n }\r\n\r\n const checkReplacementLocaleAndGetUtterance = (activity: RetorikActivity, checkReplacement: boolean = true): SpeechSynthesisUtterance => {\r\n const replacementLocale = checkReplacement ? replacementLocales?.[locale] || locale : locale\r\n const params: CreateUtteranceParams = {\r\n activity: activity,\r\n voice: getVoiceAfterCheckingActivityLocale(replacementLocale),\r\n locale: replacementLocale\r\n }\r\n\r\n return checkActivityAndCreateUtterance(params)\r\n }\r\n\r\n /**\r\n * Check if the microphone can be opened automatically\r\n */\r\n const checkDictateState = (): void => {\r\n if (!preventExpectedInputHint && mode === Mode.vocal && activeRecognitionState === RecognitionState.Closed) {\r\n if (!isMicrophoneAllowed) {\r\n dispatch(storeActions.speech.askPermission())\r\n } else {\r\n dispatch(storeActions.speech.toggleMicrophone(true))\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * On route change, reset all data and check if we are on the news view\r\n */\r\n useEffect(() => {\r\n resetData()\r\n if (!isRetorikNews) isNewsViewRef.current = route === Routes.News || route === Routes.NewsInVeille\r\n // Force speech caching when using Retorik News or when using news in veille\r\n setForceSpeechCaching(isRetorikNews || route === Routes.NewsInVeille)\r\n }, [route])\r\n\r\n /**\r\n * On cancel call, reset all data and kill current streaming\r\n */\r\n useEffect(() => {\r\n cancel && resetData()\r\n }, [cancel])\r\n\r\n /**\r\n * Play external speech immediately but don't add it to the history\r\n */\r\n useEffect(() => {\r\n if (externalTextToSpeech) {\r\n const activity = {\r\n speak: externalTextToSpeech,\r\n locale: locale\r\n } as RetorikActivity\r\n currentActivityRef.current = activity\r\n setUtterance(checkReplacementLocaleAndGetUtterance(activity, false))\r\n }\r\n }, [externalTextToSpeech])\r\n\r\n const dispatchSpeechEvent = (start: boolean): void => {\r\n const speechEvent = start ? new Event('retorikSpeakStart') : new Event('retorikSpeakStop')\r\n document.dispatchEvent(speechEvent)\r\n }\r\n\r\n /**\r\n * Called when utterance's \"start\" event is fired\r\n */\r\n const handleUtteranceStart = (): void => {\r\n sendTrace(TraceType.utteranceStart, {\r\n activityId: currentActivityRef.current?.id,\r\n text: currentActivityRef.current?.speak || currentActivityRef.current?.text\r\n })\r\n dispatch(storeActions.speech.setSpeaking(true))\r\n\r\n if (!isNewsViewRef.current && currentActivityRef?.current) {\r\n dispatch(storeActions.speech.setCurrentOrLastPlayedActivity(currentActivityRef.current))\r\n currentActivityRef.current.id && dispatch(storeActions.directline.dispatchMarkActivity({ id: currentActivityRef.current.id, speaking: true }))\r\n }\r\n dispatchSpeechEvent(true)\r\n\r\n // Set next utterance to prepare synthesis data in order to improve fluidity\r\n if (streamingQueueRef.current.length && !streamingQueueRef.current[0].value?.streamingCount) {\r\n const utt = checkReplacementLocaleAndGetUtterance(streamingQueueRef.current[0], false)\r\n setNextUtterance((current) => (utt.text === current?.text ? null : utt))\r\n } else {\r\n setNextUtterance(null)\r\n }\r\n }\r\n\r\n /**\r\n * Called when utterance's \"end\" event is fired\r\n */\r\n const handleUtteranceEnd = (): void => {\r\n sendTrace(TraceType.utteranceEnd, {\r\n activityId: currentActivityRef.current?.id\r\n })\r\n dispatch(storeActions.speech.setSpeaking(false))\r\n dispatchSpeechEvent(false)\r\n\r\n if (isNewsViewRef.current) {\r\n dispatch(storeActions.utils.setRetorikNewsEnded(true))\r\n currentActivityRef.current = null\r\n } else {\r\n handleEnded()\r\n }\r\n }\r\n\r\n const handleEnded = (): void => {\r\n // Add played activity id to context's endedActivities\r\n if (currentActivityRef.current?.id) {\r\n dispatch(storeActions.activity.addEndedActivity(currentActivityRef.current.id))\r\n dispatch(storeActions.directline.dispatchMarkActivity({ id: currentActivityRef.current.id, speaking: false }))\r\n }\r\n\r\n if (streamingQueueRef.current?.length) {\r\n // Check if this is the message sent after streaming activities\r\n if (streamingQueueRef.current[0].value?.streamingCount) {\r\n dispatch(storeActions.activity.addEndedActivity(streamingQueueRef.current[0].id))\r\n // If there is another activity after this message, play it. If not, let's check if the microphone should be opened\r\n if (streamingQueueRef.current?.length > 1) {\r\n const utt = checkReplacementLocaleAndGetUtterance(streamingQueueRef.current[1])\r\n currentActivityRef.current = streamingQueueRef.current[1]\r\n setUtterance(utt)\r\n dispatch(storeActions.speech.removeFirstFromStreamingQueue(true))\r\n } else {\r\n streamingQueueRef.current[0].inputHint === 'expectingInput' && checkDictateState()\r\n currentActivityRef.current = null\r\n setUtterance(null)\r\n setNextUtterance(null)\r\n dispatch(storeActions.speech.removeFirstFromStreamingQueue(false))\r\n }\r\n } else {\r\n const utt = checkReplacementLocaleAndGetUtterance(streamingQueueRef.current[0])\r\n currentActivityRef.current = streamingQueueRef.current[0]\r\n setUtterance(utt)\r\n dispatch(storeActions.speech.removeFirstFromStreamingQueue(false))\r\n }\r\n } else {\r\n currentActivityRef.current?.inputHint === 'expectingInput' && checkDictateState()\r\n currentActivityRef.current = null\r\n setUtterance(null)\r\n setNextUtterance(null)\r\n }\r\n }\r\n\r\n /**\r\n * Wait for app loading and voice selection to begin playing speech\r\n */\r\n useEffect(() => {\r\n // Set ref from the state to use in events\r\n streamingQueueRef.current = streamingQueue\r\n\r\n if (appAvailable && voice && streamingQueue.length && !currentActivityRef.current) {\r\n handleEnded()\r\n }\r\n }, [appAvailable, voice, streamingQueue])\r\n\r\n return (\r\n <RetorikSpeech\r\n ponyfill={ponyfill}\r\n appAvailable={appAvailable}\r\n utterance={utterance}\r\n nextUtterance={nextUtterance}\r\n forceSpeechCaching={forceSpeechCaching}\r\n onStart={handleUtteranceStart}\r\n onError={handleUtteranceEnd}\r\n onEnd={handleUtteranceEnd}\r\n />\r\n )\r\n}\r\n\r\nexport default SynthesisManager\r\n","import { SpeechSynthesisUtterance } from '@davi-ai/web-speech-cognitive-services-davi'\r\nimport createUtterance from './createUtterance'\r\nimport type { CreateUtteranceParams } from '../models/speechTypes'\r\nimport type { SayAsItem } from '../store/models/types'\r\n\r\ninterface SayAs {\r\n common?: Array<SayAsItem>\r\n localized?: Record<string, Array<SayAsItem>>\r\n}\r\n\r\n/**\r\n * Check if there are some replacement codes for this language, to improve speech synthesis, and then create the utterance\r\n * @param {CreateUtteranceParams} params - data needed to create an utterance\r\n * @param {SayAs} sayAs - string that should be replaced by their ipa codes\r\n * @returns {SpeechSynthesisUtterance}\r\n */\r\nconst checkSayAsWordsAndCreateUtterance = (params: CreateUtteranceParams, sayAs?: SayAs): SpeechSynthesisUtterance => {\r\n let sayAsWords: Array<SayAsItem> = []\r\n if (sayAs) {\r\n sayAs.common?.length && (sayAsWords = [...sayAs.common])\r\n sayAs.localized && sayAs.localized[params.locale]?.length && (sayAsWords = [...sayAsWords, ...sayAs.localized[params.locale]])\r\n }\r\n\r\n return createUtterance({ ...params, sayAsWords })\r\n}\r\n\r\nexport { checkSayAsWordsAndCreateUtterance }\r\n","import { SpeechMarkdown } from '@davi-ai/speechmarkdown-davi-js'\r\nimport { SpeechSynthesisUtterance } from '@davi-ai/web-speech-cognitive-services-davi'\r\nimport type { CreateUtteranceParams } from '../models/speechTypes'\r\nimport { SayAsItem } from '../store/models/types'\r\n\r\nconst buildSSML = (activity: any, locale: string, speechMarkdownParser: SpeechMarkdown, sayAsWords?: Array<SayAsItem>): string => {\r\n let speech: string = activity.speak || activity.text\r\n // Replace character not recognized in Microsoft TTS\r\n speech = speech.replaceAll('’', \"'\")\r\n let textParsedAsSSML = ''\r\n\r\n try {\r\n if (sayAsWords?.length) {\r\n const wordsUsed: Array<string> = []\r\n sayAsWords.forEach((tuple) => {\r\n if (!wordsUsed.includes(tuple.text.toLocaleLowerCase(locale))) {\r\n const regex = new RegExp(`\\\\b${tuple.text}\\\\b`, 'gi')\r\n speech = speech.replaceAll(regex, `(${tuple.text})[ipa:\"${tuple.ipa}\"]`)\r\n wordsUsed.push(tuple.text.toLocaleLowerCase(locale))\r\n }\r\n })\r\n }\r\n\r\n textParsedAsSSML = speechMarkdownParser.toSSML(speech)\r\n } catch (e) {\r\n console.warn('Retorik Framework > error in speechmarkdown parser : ', e)\r\n }\r\n\r\n return (\r\n `<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xmlns:mstts=\"https://www.w3.org/2001/mstts\" xmlns:emo=\"http://www.w3.org/2009/10/emotionml\" xml:lang=\"${locale}\">` +\r\n textParsedAsSSML +\r\n '</speak>'\r\n )\r\n}\r\n\r\nconst createUtterance = ({ activity, voice, locale, sayAsWords }: CreateUtteranceParams): SpeechSynthesisUtterance => {\r\n // If there is no text to be read, create an empty utterance that will be put in the array of ended activities\r\n if (!voice || (!activity.speak && !activity.text)) {\r\n return new SpeechSynthesisUtterance('')\r\n }\r\n\r\n return new SpeechSynthesisUtterance(\r\n buildSSML(\r\n activity,\r\n locale,\r\n new SpeechMarkdown({\r\n platform: 'microsoft-azure',\r\n includeSpeakTag: false,\r\n globalVoiceAndLang: {\r\n voice: voice.name,\r\n lang: voice.name.toLowerCase().includes('multilingual') ? locale : undefined\r\n }\r\n }),\r\n sayAsWords\r\n )\r\n )\r\n}\r\n\r\nexport default createUtterance\r\n","import React, { useEffect, useRef, useState } from 'react'\r\nimport { SpeechSynthesisPonyfillType, SpeechSynthesisUtterance } from '@davi-ai/web-speech-cognitive-services-davi'\r\nimport type { SpeechSynthesisEventProps } from '@davi-ai/web-speech-cognitive-services-davi'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport { RootState, storeActions, RecognitionState } from '../../store'\r\n\r\nimport type { Boundary, Bookmark } from '../../store/models/speechTypes'\r\nimport { audioFiles } from '../../utils/audioFiles'\r\n\r\nimport IndexedDbManager from './IndexedDbManager'\r\nimport GdprAndLoader from '../Loader/GdprAndLoader'\r\n\r\ninterface RetorikSpeechProps {\r\n ponyfill: SpeechSynthesisPonyfillType\r\n onEnd?: () => void\r\n onError?: () => void\r\n onStart?: () => void\r\n utterance: SpeechSynthesisUtterance | null\r\n nextUtterance: SpeechSynthesisUtterance | null\r\n appAvailable: boolean\r\n forceSpeechCaching: boolean\r\n}\r\n\r\ninterface NextUtteranceData {\r\n speechData: ArrayBuffer\r\n boundaries: Array<Boundary>\r\n visemes: Array<SpeechSynthesisEventProps>\r\n bookmarks: Array<Bookmark>\r\n}\r\n\r\nconst DBManager = new IndexedDbManager()\r\nconst tagsRemoverRegex = /<[^<>]+>/g\r\n\r\nconst RetorikSpeech = ({ ponyfill, onEnd, onError, onStart, utterance, nextUtterance, appAvailable, forceSpeechCaching }: RetorikSpeechProps): React.JSX.Element => {\r\n const dispatch = useDispatch()\r\n const locale = useSelector((state: RootState) => state.localeReducer.locale)\r\n const loaderClosed = useSelector((state: RootState) => state.retorikReducer.loaderClosed)\r\n const enableSpeechCaching = useSelector((state: RootState) => state.retorikReducer.configuration.enableSpeechCaching)\r\n const speechRecognitionOptions = useSelector((state: RootState) => state.retorikReducer.configuration.speechRecognitionOptions)\r\n const useOldRemote = useSelector((state: RootState) => state.retorikReducer.configuration.useOldRemote)\r\n const voice = useSelector((state: RootState) => state.speechReducer.voice)\r\n const muted = useSelector((state: RootState) => state.speechReducer.muted)\r\n const activeRecognitionState = useSelector((state: RootState) => state.speechReducer.activeRecognitionState)\r\n\r\n const boundaryRef = useRef<Array<Boundary> | undefined | null>(null)\r\n const visemeRef = useRef<Array<SpeechSynthesisEventProps> | undefined | null>(null)\r\n const bookmarkRef = useRef<Array<Bookmark> | undefined | null>(null)\r\n const audioRef = useRef<HTMLAudioElement>(null)\r\n const speechRecognitionAudioRef = useRef<HTMLAudioElement>(null)\r\n const microphoneOpenAudioRef = useRef<HTMLAudioElement>(null)\r\n const microphoneCloseAudioRef = useRef<HTMLAudioElement>(null)\r\n\r\n const [DBReady, setDBReady] = useState<boolean>(false)\r\n const [playingBlob, setPlayingBlob] = useState<boolean>(false)\r\n\r\n const nextUtteranceDataRef = useRef<{ text: string; data: NextUtteranceData | null } | null>(null)\r\n const nextUtteranceTextRef = useRef<string | null>(null)\r\n const nextUtteranceBoundariesRef = useRef<Array<Boundary>>([])\r\n const nextUtteranceVisemesRef = useRef<Array<SpeechSynthesisEventProps>>([])\r\n const nextUtteranceBookmarksRef = useRef<Array<Bookmark>>([])\r\n const emptyTextUtteranceRef = useRef<NodeJS.Timeout | null>(null)\r\n\r\n useEffect(() => {\r\n DBManager.checkDB().then((result) => setDBReady(result))\r\n\r\n return (): void => {\r\n stopCurrentPlaying()\r\n emptyTextUtteranceRef?.current && clearTimeout(emptyTextUtteranceRef.current)\r\n }\r\n }, [])\r\n\r\n const stopCurrentPlaying = (): void => {\r\n if (appAvailable || loaderClosed) {\r\n // Cancel synthesis if using synthesizer\r\n if (!playingBlob) {\r\n ponyfill.speechSynthesis.cancel()\r\n }\r\n\r\n resetNextUtteranceData()\r\n\r\n if (audioRef.current && !audioRef.current?.paused) {\r\n audioRef.current.pause()\r\n handleEnd()\r\n }\r\n }\r\n }\r\n\r\n const attachEvents = (tempUtterance: SpeechSynthesisUtterance, isMainUtterance?: boolean): SpeechSynthesisUtterance => {\r\n tempUtterance.onerror = (event): void => {\r\n isMainUtterance ? handleError(event) : (nextUtteranceDataRef.current = null)\r\n }\r\n\r\n tempUtterance.onsynthesiscompleted = (): void => {\r\n const endBoundary: Boundary = {\r\n word: '',\r\n startTime: 0,\r\n endTime: 0,\r\n boundaryType: 'EndBoundary'\r\n }\r\n\r\n if (isMainUtterance) {\r\n const tempBoundaries = boundaryRef?.current || []\r\n boundaryRef.current = [...tempBoundaries, endBoundary]\r\n dispatch(storeActions.speech.setBoundaryData([...tempBoundaries, endBoundary]))\r\n } else {\r\n nextUtteranceBoundariesRef.current = [...nextUtteranceBoundariesRef.current, endBoundary]\r\n }\r\n }\r\n\r\n tempUtterance.onboundary = (event: SpeechSynthesisEventProps): void => {\r\n if (event.boundaryType !== 'Viseme') {\r\n const newBoundary: Boundary = {\r\n word: event.name,\r\n startTime: event.elapsedTime,\r\n endTime: event.elapsedTime + event.duration,\r\n boundaryType: event.boundaryType\r\n }\r\n\r\n if (isMainUtterance) {\r\n // Update the boundaryData state with the new data.\r\n const tempBoundaries = boundaryRef?.current || []\r\n boundaryRef.current = [...tempBoundaries, newBoundary]\r\n dispatch(storeActions.speech.setBoundaryData([...tempBoundaries, newBoundary]))\r\n } else {\r\n nextUtteranceBoundariesRef.current = [...nextUtteranceBoundariesRef.current, newBoundary]\r\n }\r\n }\r\n }\r\n\r\n tempUtterance.onviseme = (event: SpeechSynthesisEventProps) => {\r\n if (isMainUtterance) {\r\n // Collect visemes locally - they will be dispatched when audio starts playing\r\n const tempVisemes = visemeRef?.current || []\r\n visemeRef.current = [...tempVisemes, event]\r\n } else {\r\n nextUtteranceVisemesRef.current = [...nextUtteranceVisemesRef.current, event]\r\n }\r\n }\r\n\r\n tempUtterance.onmark = (event: SpeechSynthesisEventProps) => {\r\n console.log('Retorik Framework > onmark event', event)\r\n const bookmark: Bookmark = {\r\n name: event.name,\r\n time: event.elapsedTime\r\n }\r\n\r\n if (isMainUtterance) {\r\n // Collect bookmarks locally - they will be dispatched when audio starts playing\r\n const tempBookmarks = bookmarkRef?.current || []\r\n bookmarkRef.current = [...tempBookmarks, bookmark]\r\n } else {\r\n nextUtteranceBookmarksRef.current = [...nextUtteranceBookmarksRef.current, bookmark]\r\n }\r\n }\r\n\r\n return tempUtterance\r\n }\r\n\r\n const processNextData = (data: ArrayBuffer) => {\r\n nextUtteranceDataRef.current =\r\n data?.byteLength && nextUtteranceTextRef.current\r\n ? {\r\n text: nextUtteranceTextRef.current,\r\n data: {\r\n speechData: data,\r\n boundaries: nextUtteranceBoundariesRef.current,\r\n visemes: nextUtteranceVisemesRef.current,\r\n bookmarks: nextUtteranceBookmarksRef.current\r\n }\r\n }\r\n : null\r\n\r\n // Reset boundary / viseme data\r\n resetNextUtteranceData(true)\r\n }\r\n\r\n const resetNextUtteranceData = (keepArrayBufferData?: boolean): void => {\r\n !keepArrayBufferData && (nextUtteranceDataRef.current = null)\r\n nextUtteranceTextRef.current = null\r\n nextUtteranceBoundariesRef.current = []\r\n nextUtteranceVisemesRef.current = []\r\n nextUtteranceBookmarksRef.current = []\r\n }\r\n\r\n useEffect(() => {\r\n if (utterance) {\r\n if (utterance.text) {\r\n if (audioRef?.current) {\r\n if (nextUtteranceDataRef.current?.text === utterance.text && nextUtteranceDataRef.current.data) {\r\n boundaryRef.current = nextUtteranceDataRef.current.data.boundaries\r\n dispatch(storeActions.speech.setBoundaryData(nextUtteranceDataRef.current.data.boundaries))\r\n // Store visemes locally - they will be dispatched when audio starts playing\r\n visemeRef.current = nextUtteranceDataRef.current.data.visemes\r\n processData(nextUtteranceDataRef.current.data.speechData, true)\r\n } else {\r\n // Play utterance whether by asking for a speech synthesis, or by retrieving data from indexedDB\r\n playUtterance(attachEvents(utterance, true))\r\n }\r\n } else {\r\n stopCurrentPlaying()\r\n }\r\n } else {\r\n handleEmptyTextUtterance()\r\n }\r\n } else {\r\n stopCurrentPlaying()\r\n }\r\n }, [utterance])\r\n\r\n useEffect(() => {\r\n // If there are data in nextUtteranceTextRef, this means the previous synthesis data retrieval is not finished, so we don't begin a new one\r\n if (nextUtterance?.text && !nextUtteranceTextRef.current) {\r\n const tempUtterance = attachEvents(nextUtterance)\r\n nextUtteranceTextRef.current = nextUtterance.text\r\n ponyfill.speechSynthesis.synthesizeAndGetArrayData(tempUtterance, processNextData)\r\n } else {\r\n resetNextUtteranceData()\r\n }\r\n }, [nextUtterance])\r\n\r\n const playUtterance = async (utt: SpeechSynthesisUtterance): Promise<void> => {\r\n if (DBReady && (enableSpeechCaching !== false || forceSpeechCaching) && utt) {\r\n const dataFromIndexedDB = await DBManager.getSpeechData(`${locale}.${voice?.name}.${utt.text.replace(tagsRemoverRegex, '')}`)\r\n\r\n if (dataFromIndexedDB) {\r\n boundaryRef.current = dataFromIndexedDB.boundaries\r\n dispatch(storeActions.speech.setBoundaryData(dataFromIndexedDB.boundaries))\r\n // Store visemes locally - they will be dispatched when audio starts playing\r\n visemeRef.current = dataFromIndexedDB.visemes || []\r\n processData(dataFromIndexedDB.value, true)\r\n } else {\r\n ponyfill.speechSynthesis.synthesizeAndGetArrayData(utt, processData)\r\n }\r\n } else {\r\n ponyfill.speechSynthesis.synthesizeAndGetArrayData(utt, processData)\r\n }\r\n }\r\n\r\n const processData = (data: ArrayBuffer, alreadyExistsInDB?: boolean) => {\r\n if (data?.byteLength) {\r\n const blob = new Blob([data], { type: 'audio/mp3' })\r\n\r\n !alreadyExistsInDB &&\r\n (enableSpeechCaching !== false || forceSpeechCaching) &&\r\n DBReady &&\r\n boundaryRef?.current &&\r\n utterance &&\r\n DBManager.addSpeechData({\r\n id: `${locale}.${voice?.name}.${utterance.text.replace(tagsRemoverRegex, '')}`,\r\n value: data,\r\n boundaries: boundaryRef.current,\r\n visemes: visemeRef.current || []\r\n })\r\n\r\n const url = URL.createObjectURL(blob)\r\n\r\n if (audioRef?.current) {\r\n setPlayingBlob(true)\r\n audioRef.current.src = url\r\n audioRef.current.play().catch((e) => console.warn(e))\r\n }\r\n } else {\r\n handleEmptyTextUtterance()\r\n }\r\n }\r\n\r\n const resetData = (): void => {\r\n boundaryRef.current = []\r\n visemeRef.current = []\r\n dispatch(storeActions.speech.setBoundaryData([]))\r\n dispatch(storeActions.speech.setVisemeData([]))\r\n dispatch(storeActions.speech.setBookmarkData([]))\r\n setPlayingBlob(false)\r\n }\r\n\r\n const handleStart = (): void => {\r\n if (appAvailable || loaderClosed) {\r\n // Dispatch visemes now that audio is playing, ensuring lip sync timing is correct\r\n if (visemeRef.current?.length) {\r\n dispatch(storeActions.speech.setVisemeData(visemeRef.current))\r\n dispatch(storeActions.speech.setBookmarkData(bookmarkRef.current || []))\r\n }\r\n onStart?.()\r\n }\r\n }\r\n\r\n const handleEnd = (): void => {\r\n if (appAvailable || loaderClosed) {\r\n onEnd?.()\r\n resetData()\r\n } else {\r\n dispatch(storeActions.retorik.setLoaderClosed(true))\r\n }\r\n }\r\n\r\n const handleError = (error): void => {\r\n console.log('Retorik Framework > speech synthesis error ', error)\r\n onError?.()\r\n resetData()\r\n }\r\n\r\n const handleEmptyTextUtterance = (): void => {\r\n handleStart()\r\n emptyTextUtteranceRef?.current && clearTimeout(emptyTextUtteranceRef.current)\r\n emptyTextUtteranceRef.current = setTimeout(() => {\r\n handleEnd()\r\n }, 50)\r\n }\r\n\r\n /**\r\n * On call :\r\n * - play 1 second muted sound to prime audio output\r\n * - MANDATORY FOR SAFARI IN VOCAL MODE\r\n */\r\n const primeRetorikSpeech = (): void => {\r\n if (audioRef.current) {\r\n audioRef.current.play().catch((e) => console.warn(e))\r\n speechRecognitionAudioRef?.current && speechRecognitionAudioRef.current.play().catch((e) => console.warn(e))\r\n\r\n // Send animation start event to secure animation not playing on safari if permissions are not sufficient\r\n window.dispatchEvent(new Event('retorikSpiritEnginePlay'))\r\n }\r\n }\r\n\r\n /**\r\n * Play sound on speech recognition activation if it isn't disabled in configuration\r\n */\r\n useEffect(() => {\r\n if (useOldRemote) {\r\n if (!!speechRecognitionOptions?.enableActivationSound && activeRecognitionState === RecognitionState.Listening) {\r\n speechRecognitionAudioRef?.current?.play().catch((e) => console.warn(e))\r\n }\r\n } else {\r\n if (!!speechRecognitionOptions?.enableActivationSound) {\r\n switch (activeRecognitionState) {\r\n case RecognitionState.Listening:\r\n microphoneOpenAudioRef?.current?.play().catch((e) => console.warn(e))\r\n break\r\n case RecognitionState.Closing:\r\n case RecognitionState.ForceClosing:\r\n microphoneCloseAudioRef?.current?.play().catch((e) => console.warn(e))\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n }\r\n }, [useOldRemote, activeRecognitionState, speechRecognitionOptions])\r\n\r\n return (\r\n <React.Fragment>\r\n <audio ref={audioRef} src={audioFiles.onesecond} muted={appAvailable || loaderClosed ? muted : true} onPlay={handleStart} onEnded={handleEnd} />\r\n <audio ref={speechRecognitionAudioRef} src={audioFiles.speechrecognition} preload='auto' muted={appAvailable || loaderClosed ? muted : true} />\r\n {/* Microphone opening sound */}\r\n <audio ref={microphoneOpenAudioRef} src={audioFiles.microphoneopen} preload='auto' muted={appAvailable || loaderClosed ? muted : true} />\r\n {/* Microphone closing sound */}\r\n <audio ref={microphoneCloseAudioRef} src={audioFiles.microphoneclose} preload='auto' muted={appAvailable || loaderClosed ? muted : true} />\r\n <GdprAndLoader appAvailable={appAvailable} handleValidation={primeRetorikSpeech} />\r\n </React.Fragment>\r\n )\r\n}\r\n\r\nexport default RetorikSpeech\r\n","import { Boundary } from '../../store/models/speechTypes'\r\nimport type { SpeechSynthesisEventProps } from '@davi-ai/web-speech-cognitive-services-davi'\r\n\r\ninterface DBData {\r\n id: string\r\n value: ArrayBuffer\r\n boundaries: Array<Boundary>\r\n visemes?: Array<SpeechSynthesisEventProps>\r\n}\r\n\r\nclass IndexedDbManager {\r\n version = 1\r\n storeName = 'speechSynthesisData'\r\n\r\n checkDB = async (): Promise<boolean> => {\r\n return new Promise<boolean>((resolve) => {\r\n const request: IDBOpenDBRequest = indexedDB.open(\r\n 'retorik-framework-db',\r\n this.version\r\n )\r\n request.onsuccess = () => {\r\n resolve(true)\r\n }\r\n\r\n request.onerror = () => {\r\n resolve(false)\r\n }\r\n\r\n request.onupgradeneeded = () => {\r\n const db = request.result\r\n\r\n // If the data object store doesn't exist, create it\r\n if (!db.objectStoreNames.contains(this.storeName)) {\r\n db.createObjectStore(this.storeName, {\r\n keyPath: 'id'\r\n })\r\n }\r\n }\r\n })\r\n }\r\n\r\n addSpeechData = async (data: DBData): Promise<boolean> => {\r\n return new Promise<boolean>((resolve) => {\r\n const request: IDBOpenDBRequest = indexedDB.open(\r\n 'retorik-framework-db',\r\n this.version\r\n )\r\n\r\n request.onsuccess = () => {\r\n const db = request.result\r\n const tx = db.transaction(this.storeName, 'readwrite')\r\n const store = tx.objectStore(this.storeName)\r\n // Base 64 encode\r\n data.id = window.btoa(encodeURI(data.id))\r\n store.add(data)\r\n resolve(true)\r\n }\r\n\r\n request.onerror = () => {\r\n resolve(false)\r\n }\r\n })\r\n }\r\n\r\n getSpeechData = async (id: string): Promise<DBData | null> => {\r\n return new Promise<DBData | null>((resolve) => {\r\n const request: IDBOpenDBRequest = indexedDB.open(\r\n 'retorik-framework-db',\r\n this.version\r\n )\r\n\r\n request.onsuccess = () => {\r\n const db = request.result\r\n const tx = db.transaction(this.storeName, 'readonly')\r\n const store = tx.objectStore(this.storeName)\r\n // Base 64 encode\r\n const data = store.get(window.btoa(encodeURI(id)))\r\n data.onsuccess = () => {\r\n resolve(data.result)\r\n }\r\n }\r\n\r\n request.onerror = () => {\r\n resolve(null)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default IndexedDbManager\r\n"],"names":[],"version":3,"file":"SynthesisPonyfillManager.10888d6d.js.map"}