Text-gen-webui - SD Image filtering

AllTalk will now strip any image from TTS and re-add the image data after TTS. 

This is so that when used with Stable Diffusion Image generation within Text-generation-webui, AllTalk isnt trying to generate the Image data as TTS.
This commit is contained in:
erew123 authored and GitHub committed 2024-03-11 11:22:50 +00:00
1 parent 86c64fc9ba
commit 969b4e3f46
1 file changed
+38 -20
+38 -20
View File
@@ -557,6 +557,10 @@ def voice_preview(string):
return f"[{params['branding']}Server] Audio generation failed. Status: {generate_response.get('status')}" return f"[{params['branding']}Server] Audio generation failed. Status: {generate_response.get('status')}"
#######################
#### TEXT CLEANING ####
#######################
def process_text(text): def process_text(text):
# Normalize HTML encoded quotes # Normalize HTML encoded quotes
text = html.unescape(text) text = html.unescape(text)
@@ -606,6 +610,30 @@ def process_text(text):
return ordered_parts return ordered_parts
########################
#### IMAGE CLEANING ####
########################
img_pattern = r'<img[^>]*src\s*=\s*["\'][^"\'>]+["\'][^>]*>'
def extract_and_remove_images(text):
"""
Extracts all image data from the text and removes it for clean TTS processing.
Returns the cleaned text and the extracted image data.
"""
img_matches = re.findall(img_pattern, text)
img_info = "\n".join(img_matches) # Store extracted image data
cleaned_text = re.sub(img_pattern, '', text) # Remove images from text
return cleaned_text, img_info
def reinsert_images(text, img_info):
"""
Reinserts the previously extracted image data back into the text.
"""
if img_info: # Check if there are images to reinsert
text += f"\n\n{img_info}"
return text
################################# #################################
#### TTS STANDARD GENERATION #### #### TTS STANDARD GENERATION ####
################################# #################################
@@ -613,12 +641,12 @@ def process_text(text):
def output_modifier(string, state): def output_modifier(string, state):
if not params["activate"]: if not params["activate"]:
return string return string
original_string = string img_info = ""
# print("ORIGINAL STRING IS:", original_string) cleaned_text, img_info = extract_and_remove_images(string)
cleaned_string = before_audio_generation(string, params) # print("Cleaned STRING IS:", cleaned_text)
cleaned_string = before_audio_generation(cleaned_text, params)
if cleaned_string is None: if cleaned_string is None:
return return
string = cleaned_string
language_code = languages.get(params["language"]) language_code = languages.get(params["language"])
temperature = params["local_temperature"] temperature = params["local_temperature"]
repetition_penalty = params["local_repetition_penalty"] repetition_penalty = params["local_repetition_penalty"]
@@ -627,7 +655,7 @@ def output_modifier(string, state):
if process_lock.acquire(blocking=False): if process_lock.acquire(blocking=False):
try: try:
if params["narrator_enabled"]: if params["narrator_enabled"]:
processed_parts = process_text(original_string) processed_parts = process_text(cleaned_string)
audio_files_all_paragraphs = [] audio_files_all_paragraphs = []
for part_type, part in processed_parts: for part_type, part in processed_parts:
@@ -686,7 +714,7 @@ def output_modifier(string, state):
) )
else: else:
# Decode HTML entities first # Decode HTML entities first
cleaned_part = html.unescape(original_string) cleaned_part = html.unescape(cleaned_string)
# Replace multiple instances of certain punctuation marks with a single instance # Replace multiple instances of certain punctuation marks with a single instance
cleaned_part = re.sub(r"([!?.])\1+", r"\1", cleaned_part) cleaned_part = re.sub(r"([!?.])\1+", r"\1", cleaned_part)
# Further clean to remove any other unwanted characters # Further clean to remove any other unwanted characters
@@ -729,25 +757,15 @@ def output_modifier(string, state):
if audio_path: if audio_path:
# Handle Gradio and playback # Handle Gradio and playback
autoplay = "autoplay" if params["autoplay"] else "" autoplay = "autoplay" if params["autoplay"] else ""
string = ( string = (f'<audio src="file/{final_output_file}" controls {autoplay}></audio>')
f'<audio src="file/{final_output_file}" controls {autoplay}></audio>'
)
if params["show_text"]: if params["show_text"]:
string += f"\n\n{original_string}" string += reinsert_images(cleaned_string, img_info)
shared.processing_message = "*Is typing...*" shared.processing_message = "*Is typing...*"
return string return string
else: else:
print( print(f"[{params['branding']}Server] \033[91mWarning\033[0m No audio path in the response.")
f"[{params['branding']}Server] \033[91mWarning\033[0m No audio path in the response."
)
else: else:
print( print(f"[{params['branding']}Server] \033[91mWarning\033[0m Audio generation failed. Status:", generate_response.get("message"),)
f"[{params['branding']}Server] \033[91mWarning\033[0m Audio generation failed. Status:",
generate_response.get("message"),
)
def get_output_filename(state): def get_output_filename(state):
if "character_menu" in state: if "character_menu" in state: