downloadSection.style.display = "block"; } else if (json.error) { alert(`Error from server: ${json.error}`); updateProgress(0); return; } } catch (e) { console.error("Failed to parse JSON chunk:", jsonString, e); } } boundary = buffer.indexOf("\n"); } } if (buffer.trim()) { try { const json = JSON.parse(buffer.trim()); if (json.audio_data || json.chunk_data) { audioBase64 = json.audio_data || json.chunk_data; updateProgress(100); const audioSrc = "data:audio/mp3;base64," + audioBase64; finalAudioPlayer.src = audioSrc; finalResultDiv.style.display = "block"; const title = document.getElementById("title").value.trim() || "fsmb-voice"; downloadAnchor.href = audioSrc; downloadAnchor.download = title + ".mp3"; fileLabel.innerText = "Download: " + title + ".mp3"; downloadSection.style.display = "block"; } } catch (e) { console.error("Failed to parse final JSON chunk:", buffer.trim(), e); } } } catch (error) { console.error("Fetch Error:", error); alert("Failed to generate audio: " + error.message); updateProgress(0); } } updateCharCount();