NovelAI: Fix TTS preview
| @@ -132,9 +132,14 @@ class NovelTtsProvider { | ||
| 132 | 132 | return { name: voiceName, voice_id: voiceName, lang: 'en-US', preview_url: false }; |
| 133 | 133 | } |
| 134 | 134 | |
| 135 | - async generateTts(text, voiceId) { | |
| 135 | + /** | |
| 136 | - const response = await this.fetchTtsGeneration(text, voiceId); | |
| 136 | + * Generate TTS audio for the given text using the specified voice. | |
| 137 | - return response; | |
| 137 | + * @param {string} text Text to generate | |
| 138 | + * @param {string} voiceId Voice ID | |
| 139 | + * @returns {AsyncGenerator<Response>} Audio response generator | |
| 140 | + */ | |
| 141 | + generateTts(text, voiceId) { | |
| 142 | + return this.fetchTtsGeneration(text, voiceId); | |
| 138 | 143 | } |
| 139 | 144 | |
| 140 | 145 | //###########// |
| @@ -172,16 +177,17 @@ class NovelTtsProvider { | ||
| 172 | 177 | this.audioElement.currentTime = 0; |
| 173 | 178 | |
| 174 | 179 | const text = getPreviewString('en-US'); |
| 175 | 180 | for await (const response = awaitof this.fetchTtsGenerationgenerateTts(text, id);) { |
| 176 | - if (!response.ok) { | |
| 177 | - throw new Error(`HTTP ${response.status}`); | |
| 178 | - } | |
| 179 | - | |
| 180 | 181 | const audio = await response.blob(); |
| 181 | 182 | const url = URL.createObjectURL(audio); |
| 182 | - this.audioElement.src = url; | |
| 183 | + await new Promise(resolve => { | |
| 183 | - this.audioElement.play(); | |
| 184 | + const audioElement = new Audio(); | |
| 184 | - this.audioElement.onended = () => URL.revokeObjectURL(url); | |
| 185 | + audioElement.src = url; | |
| 186 | + audioElement.play(); | |
| 187 | + audioElement.onended = () => resolve(); | |
| 188 | + }); | |
| 189 | + URL.revokeObjectURL(url); | |
| 190 | + } | |
| 185 | 191 | } |
| 186 | 192 | |
| 187 | 193 | async* fetchTtsGeneration(inputText, voiceId) { |