Spaces:
Running
on
Zero
error
Часто при обробці тексту в звук (що довгого, що короткого) вибиває помилка помагає тільки перефразування, що з вербалізацією, що без неї, (сама вербалізація теж жахливо довга, але то таке)
Traceback (most recent call last):
File "/usr/local/lib/python3.10/site-packages/gradio/queueing.py", line 536, in process_events
response = await route_utils.call_process_api(
File "/usr/local/lib/python3.10/site-packages/gradio/route_utils.py", line 322, in call_process_api
output = await app.get_blocks().process_api(
File "/usr/local/lib/python3.10/site-packages/gradio/blocks.py", line 1935, in process_api
result = await self.call_function(
File "/usr/local/lib/python3.10/site-packages/gradio/blocks.py", line 1520, in call_function
prediction = await anyio.to_thread.run_sync( # type: ignore
File "/usr/local/lib/python3.10/site-packages/anyio/to_thread.py", line 56, in run_sync
return await get_async_backend().run_sync_in_worker_thread(
File "/usr/local/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 2461, in run_sync_in_worker_thread
return await future
File "/usr/local/lib/python3.10/site-packages/anyio/_backends/_asyncio.py", line 962, in run
result = context.run(func, *args)
File "/usr/local/lib/python3.10/site-packages/gradio/utils.py", line 826, in wrapper
response = f(*args, **kwargs)
File "/home/user/app/app.py", line 150, in synthesize_multi
return 24000, inference('multi', text, prompt_audio_path, progress, speed=speed, alpha=0, beta=0, diffusion_steps=20, embedding_scale=1.0)[0]
File "/home/user/app/infer.py", line 234, in inference
wav, s_prev, ps = _inf(model, text, ref_s, speed, s_prev, noise, alpha=alpha, beta=beta, diffusion_steps=diffusion_steps, embedding_scale=embedding_scale)
File "/home/user/app/infer.py", line 165, in _inf
bert_dur = model.bert(tokens, attention_mask=(~text_mask).int())
File "/usr/local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1511, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
File "/usr/local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1520, in _call_impl
return forward_call(*args, **kwargs)
File "/home/user/app/Utils/PLBERT/util.py", line 9, in forward
outputs = super().forward(*args, **kwargs)
File "/usr/local/lib/python3.10/site-packages/transformers/models/albert/modeling_albert.py", line 777, in forward
buffered_token_type_ids_expanded = buffered_token_type_ids.expand(batch_size, seq_length)
RuntimeError: The expanded size of the tensor (532) must match the existing size (512) at non-singleton dimension 1. Target sizes: [1, 532]. Tensor sizes: [1, 512]
або ще
File "/usr/local/lib/python3.10/site-packages/transformers/models/albert/modeling_albert.py", line 777, in forward
buffered_token_type_ids_expanded = buffered_token_type_ids.expand(batch_size, seq_length)
RuntimeError: The expanded size of the tensor (1505) must match the existing size (512) at non-singleton dimension 1. Target sizes: [1, 1505]. Tensor sizes: [1, 512]
і ще
RuntimeError: The expanded size of the tensor (2810) must match the existing size (512) at non-singleton dimension 1. Target sizes: [1, 2810]. Tensor sizes: [1, 512]
і ще
RuntimeError: The expanded size of the tensor (1724) must match the existing size (512) at non-singleton dimension 1. Target sizes: [1, 1724]. Tensor sizes: [1, 512]
я в пайтон не сильно, але тут явно щось не так...
Модель за один раз може синтезувати текст в якому до 512 символів в фонемізовоному виді. Отже щоб синтезувати більше, я розбиваю текст по символах закінчення речення - .!?. У вас вони є? Якщо якесь розбите речення має більше 512 символів то вискакує така помилка.
Запускаю через докер, отже спробував автоматизувати і пихати текст на обробку скриптом шматками (який теж ділю по знаках закінчення, але ще додав якщо буде довше щось то по " , " щоб перестрахуватись) по 500 символів і всеодно ловлю таку помилку, (Можливо обмеження в символах має бути ще меншим, бо в фонемізовоному виді їх і правда більше і тут існує невідповідність) а ще коли використовую вербалізатор, помітив в ньому баг він заглюючує певно інколи і повторює останнє слово чим і переповнює обмеження (по крайній мірі в лозі так )
...дуже цікаво, поки буду експерементувати, без вербалізатора, спробую замінити цифри в тексті чимось стороннім..і обмежити кількість символів ще більше бо в фонемізовоному виді символів часто більше ніж в тексті..
Може бути, я той вербалізатор дуже не тестував, і взагалі планую знайти якусь заміну, поки що це найкраще що в нас є.
вже писав що в пайтоні не сильний, але разом з чатом жпт написав отакий скрипт працює просто миттєво, я так розумію він використовує якусь уже готову бібліотеку :)
import re
from num2words import num2words
# Specify the path to the folder
folder_path = r'F:\puppeteer\translated_warS\1'
# Function to replace numbers with words
def replace_numbers_with_words(text):
# Function to convert a number to words
def number_to_words(match):
number_str = match.group(0)
# Check for percentage and remove the symbol for processing
is_percent = '%' in number_str
number_str = number_str.replace('%', '')
# If the number has a letter prefix
if re.match(r'[A-Za-zА-Яа-я]', number_str[0]):
# Separate the prefix (e.g., "C")
prefix_match = re.match(r'([A-Za-zА-Яа-я]+)(\d+)', number_str)
if prefix_match:
prefix = prefix_match.group(1)
number_part = prefix_match.group(2)
try:
# Convert to number
number = int(number_part)
result = f"{prefix} {num2words(number, lang='uk')}"
except ValueError:
return number_str # Return the original if it cannot be converted
else:
# If the letter prefix does not work, just return the text
return number_str
# If the number contains a comma or dot (decimal number)
elif ',' in number_str or '.' in number_str:
try:
number_float = float(number_str.replace(',', '.'))
integer_part = int(number_float)
# Take only one decimal place
decimal_part = int(round((number_float - integer_part) * 10))
integer_text = num2words(integer_part, lang='uk')
decimal_text = num2words(decimal_part, lang='uk')
result = f"{integer_text} цілих і {decimal_text} десятих"
if is_percent:
result += " відсотків"
except ValueError:
return number_str
# Simple integer
else:
try:
result = num2words(int(number_str), lang='uk')
if is_percent:
result += " відсотків"
except ValueError:
return number_str # Return the original if it cannot be converted
return result
# Regular expression to replace numbers (including prefixes and percentages)
replaced_text, num_replacements = re.subn(
r'[A-Za-zА-Яа-я]?\d+[.,]?\d*%?|\b[CcА-Яа-я]\s*\d+\s*\w+', number_to_words, text)
return replaced_text, num_replacements
# Process files in the folder
for filename in os.listdir(folder_path):
if filename.endswith(".txt"):
file_path = os.path.join(folder_path, filename)
print(f"Processing file: {filename}")
# Read text from file
with open(file_path, 'r', encoding='utf-8') as file:
text = file.read()
# Replace numbers with words
new_text, num_replacements = replace_numbers_with_words(text)
if num_replacements > 0:
print(
f" - Found and replaced {num_replacements} numbers or compound numbers.")
# Write the modified text back to the file
with open(file_path, 'w', encoding='utf-8') as file:
file.write(new_text)
print(f" - File '{filename}' successfully updated.")
else:
print(f" - No numbers found to replace in file '{filename}'.")
print("Processing completed.")
num2words сама по собі не підтримує всі кейси, я написав схожий нормалізатор https://github.com/patriotyk/narizaka/blob/main/narizaka/languages/uk/textnormalizer.py він підтримує більше випадків, і також вам потрібно поставити num2words з мого форка бо там я додав повну підтримку українських чисел яких нема в офіційній версії. Але все ж таки він не такий проснутий як цей на осонові трансформера, але зато працює в тисячу разів швидше