Make this feature togglable in extensions > "Narrate by paragraphs (when not streaming)"
| @@ -120,7 +120,7 @@ async function onNarrateOneMessage() { | |||
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | resetTtsPlayback(); | 122 | resetTtsPlayback(); |
| 123 | splitMessageAndAddToTtsJobQueue(message); | 123 | processAndQueueTtsMessage(message); |
| 124 | moduleWorker(); | 124 | moduleWorker(); |
| 125 | } | 125 | } |
| 126 | 126 | ||
| @@ -147,7 +147,7 @@ async function onNarrateText(args, text) { | |||
| 147 | } | 147 | } |
| 148 | 148 | ||
| 149 | resetTtsPlayback(); | 149 | resetTtsPlayback(); |
| 150 | splitMessageAndAddToTtsJobQueue({ mes: text, name: name }); | 150 | processAndQueueTtsMessage({ mes: text, name: name }); |
| 151 | await moduleWorker(); | 151 | await moduleWorker(); |
| 152 | 152 | ||
| 153 | // Return back to the chat voices | 153 | // Return back to the chat voices |
| @@ -227,7 +227,12 @@ function isTtsProcessing() { | |||
| 227 | * @param {string} message.name - The name associated with the message. | 227 | * @param {string} message.name - The name associated with the message. |
| 228 | * @returns {void} | 228 | * @returns {void} |
| 229 | */ | 229 | */ |
| 230 | function splitMessageAndAddToTtsJobQueue(message) { | 230 | function processAndQueueTtsMessage(message) { |
| 231 | if (!extension_settings.tts.narrate_by_paragraphs) { | ||
| 232 | ttsJobQueue.push(message); | ||
| 233 | return; | ||
| 234 | } | ||
| 235 | |||
| 231 | const lines = message.mes.split("\n"); | 236 | const lines = message.mes.split("\n"); |
| 232 | 237 | ||
| 233 | for (let i = 0; i < lines.length; i++) { | 238 | for (let i = 0; i < lines.length; i++) { |
| @@ -375,7 +380,7 @@ function onAudioControlClicked() { | |||
| 375 | talkingAnimation(false); | 380 | talkingAnimation(false); |
| 376 | } else { | 381 | } else { |
| 377 | // Default play behavior if not processing or playing is to play the last message. | 382 | // Default play behavior if not processing or playing is to play the last message. |
| 378 | splitMessageAndAddToTtsJobQueue(context.chat[context.chat.length - 1]); | 383 | processAndQueueTtsMessage(context.chat[context.chat.length - 1]); |
| 379 | } | 384 | } |
| 380 | updateUiAudioPlayState(); | 385 | updateUiAudioPlayState(); |
| 381 | } | 386 | } |
| @@ -594,6 +599,7 @@ function loadSettings() { | |||
| 594 | $('#tts_narrate_quoted').prop('checked', extension_settings.tts.narrate_quoted_only); | 599 | $('#tts_narrate_quoted').prop('checked', extension_settings.tts.narrate_quoted_only); |
| 595 | $('#tts_auto_generation').prop('checked', extension_settings.tts.auto_generation); | 600 | $('#tts_auto_generation').prop('checked', extension_settings.tts.auto_generation); |
| 596 | $('#tts_periodic_auto_generation').prop('checked', extension_settings.tts.periodic_auto_generation); | 601 | $('#tts_periodic_auto_generation').prop('checked', extension_settings.tts.periodic_auto_generation); |
| 602 | $('#tts_narrate_by_paragraphs').prop('checked', extension_settings.tts.narrate_by_paragraphs); | ||
| 597 | $('#tts_narrate_translated_only').prop('checked', extension_settings.tts.narrate_translated_only); | 603 | $('#tts_narrate_translated_only').prop('checked', extension_settings.tts.narrate_translated_only); |
| 598 | $('#tts_narrate_user').prop('checked', extension_settings.tts.narrate_user); | 604 | $('#tts_narrate_user').prop('checked', extension_settings.tts.narrate_user); |
| 599 | $('#tts_pass_asterisks').prop('checked', extension_settings.tts.pass_asterisks); | 605 | $('#tts_pass_asterisks').prop('checked', extension_settings.tts.pass_asterisks); |
| @@ -663,6 +669,11 @@ function onPeriodicAutoGenerationClick() { | |||
| 663 | saveSettingsDebounced(); | 669 | saveSettingsDebounced(); |
| 664 | } | 670 | } |
| 665 | 671 | ||
| 672 | function onNarrateByParagraphsClick() { | ||
| 673 | extension_settings.tts.narrate_by_paragraphs = !!$('#tts_narrate_by_paragraphs').prop('checked'); | ||
| 674 | saveSettingsDebounced(); | ||
| 675 | } | ||
| 676 | |||
| 666 | 677 | ||
| 667 | function onNarrateDialoguesClick() { | 678 | function onNarrateDialoguesClick() { |
| 668 | extension_settings.tts.narrate_dialogues_only = !!$('#tts_narrate_dialogues').prop('checked'); | 679 | extension_settings.tts.narrate_dialogues_only = !!$('#tts_narrate_dialogues').prop('checked'); |
| @@ -841,7 +852,12 @@ async function onMessageEvent(messageId, lastCharIndex) { | |||
| 841 | lastChatId = context.chatId; | 852 | lastChatId = context.chatId; |
| 842 | 853 | ||
| 843 | console.debug(`Adding message from ${message.name} for TTS processing: "${message.mes}"`); | 854 | console.debug(`Adding message from ${message.name} for TTS processing: "${message.mes}"`); |
| 844 | splitMessageAndAddToTtsJobQueue(message); | 855 | |
| 856 | if (extension_settings.tts.periodic_auto_generation) { | ||
| 857 | ttsJobQueue.push(message); | ||
| 858 | } else { | ||
| 859 | processAndQueueTtsMessage(message); | ||
| 860 | } | ||
| 845 | } | 861 | } |
| 846 | 862 | ||
| 847 | async function onMessageDeleted() { | 863 | async function onMessageDeleted() { |
| @@ -1181,6 +1197,7 @@ jQuery(async function () { | |||
| 1181 | $('#tts_pass_asterisks').on('click', onPassAsterisksClick); | 1197 | $('#tts_pass_asterisks').on('click', onPassAsterisksClick); |
| 1182 | $('#tts_auto_generation').on('click', onAutoGenerationClick); | 1198 | $('#tts_auto_generation').on('click', onAutoGenerationClick); |
| 1183 | $('#tts_periodic_auto_generation').on('click', onPeriodicAutoGenerationClick); | 1199 | $('#tts_periodic_auto_generation').on('click', onPeriodicAutoGenerationClick); |
| 1200 | $('#tts_narrate_by_paragraphs').on('click', onNarrateByParagraphsClick); | ||
| 1184 | $('#tts_narrate_user').on('click', onNarrateUserClick); | 1201 | $('#tts_narrate_user').on('click', onNarrateUserClick); |
| 1185 | 1202 | ||
| 1186 | $('#playback_rate').on('input', function () { | 1203 | $('#playback_rate').on('input', function () { |
| @@ -30,6 +30,10 @@ | |||
| 30 | <input type="checkbox" id="tts_periodic_auto_generation"> | 30 | <input type="checkbox" id="tts_periodic_auto_generation"> |
| 31 | <small data-i18n="Narrate by paragraphs (when streaming)">Narrate by paragraphs (when streaming)</small> | 31 | <small data-i18n="Narrate by paragraphs (when streaming)">Narrate by paragraphs (when streaming)</small> |
| 32 | </label> | 32 | </label> |
| 33 | <label class="checkbox_label" for="tts_narrate_by_paragraphs"> | ||
| 34 | <input type="checkbox" id="tts_narrate_by_paragraphs"> | ||
| 35 | <small data-i18n="Narrate by paragraphs (when not streaming)">Narrate by paragraphs (when not streaming)</small> | ||
| 36 | </label> | ||
| 33 | <label class="checkbox_label" for="tts_narrate_quoted"> | 37 | <label class="checkbox_label" for="tts_narrate_quoted"> |
| 34 | <input type="checkbox" id="tts_narrate_quoted"> | 38 | <input type="checkbox" id="tts_narrate_quoted"> |
| 35 | <small data-i18n="Only narrate quotes">Only narrate "quotes"</small> | 39 | <small data-i18n="Only narrate quotes">Only narrate "quotes"</small> |