error

#3
by serh007 - opened

Часто при обробці тексту в звук (що довгого, що короткого) вибиває помилка помагає тільки перефразування, що з вербалізацією, що без неї, (сама вербалізація теж жахливо довга, але то таке)

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 з мого форка бо там я додав повну підтримку українських чисел яких нема в офіційній версії. Але все ж таки він не такий проснутий як цей на осонові трансформера, але зато працює в тисячу разів швидше

patriotyk changed discussion status to closed
Your need to confirm your account before you can post a new comment.

Sign up or log in to comment