(data)
| 2006 | } |
| 2007 | |
| 2008 | const handleTTSStart = (data) => { |
| 2009 | setTTSAction(true) |
| 2010 | |
| 2011 | // Stop all existing TTS audio before starting new stream |
| 2012 | stopAllTTS() |
| 2013 | |
| 2014 | setIsTTSLoading((prevState) => ({ |
| 2015 | ...prevState, |
| 2016 | [data.chatMessageId]: true |
| 2017 | })) |
| 2018 | setMessages((prevMessages) => { |
| 2019 | const allMessages = [...cloneDeep(prevMessages)] |
| 2020 | const lastMessage = allMessages[allMessages.length - 1] |
| 2021 | if (lastMessage.type === 'userMessage') return allMessages |
| 2022 | if (lastMessage.id) return allMessages |
| 2023 | allMessages[allMessages.length - 1].id = data.chatMessageId |
| 2024 | return allMessages |
| 2025 | }) |
| 2026 | setTtsStreamingState({ |
| 2027 | mediaSource: null, |
| 2028 | sourceBuffer: null, |
| 2029 | audio: null, |
| 2030 | chunkQueue: [], |
| 2031 | isBuffering: false, |
| 2032 | audioFormat: data.format, |
| 2033 | abortController: null |
| 2034 | }) |
| 2035 | |
| 2036 | setTimeout(() => initializeTTSStreaming(data), 0) |
| 2037 | } |
| 2038 | |
| 2039 | const handleTTSDataChunk = (base64Data) => { |
| 2040 | try { |
no test coverage detected