Universal TTS Guide

A comprehensive guide to TTS dataset prep and training

View on GitHub

Ръководство 1: Подготовка на данни за TTS обучение

Навигация: Главно README Следваща стъпка: Настройка за обучение

Това ръководство обхваща критичната първа фаза на всеки TTS проект: подготовка на висококачествени, правилно форматирани аудио и текстови данни. Качеството на вашия набор от данни директно влияе върху качеството на крайния TTS модел.


1. Стъпки за подготовка на набора от данни

Следвайте тези стъпки систематично, за да трансформирате суровото аудио в набор от данни, готов за обучение.

1.1. Придобиване на аудио и първоначална обработка

1.2. Сегментиране на аудио

# Пример за Python скрипт за сегментиране на аудио при тишина
from pydub import AudioSegment
from pydub.silence import split_on_silence

звук = AudioSegment.from_wav("дълъг_запис.wav")
сегменти = split_on_silence(
    звук, 
    # Определете тишината като звук с интензитет под -40 dBFS
    min_silence_len=500,  # Минимална дължина на тишината в ms
    silence_thresh=-40,   # Праг за тишина в dBFS
    keep_silence=400      # Запазете малко тишина в началото и края
)

# Запазете всеки сегмент като отделен файл
for i, сегмент in enumerate(сегменти):
    сегмент.export(f"сегмент_{i}.wav", format="wav")

1.3. Почистване на аудио

1.4. Транскрибиране на аудио

1.5. Организиране на набора от данни

1.6. Проверка на качеството на данните

# Пример за Python скрипт за проверка на целостта на набора от данни
import os
import pandas as pd

# Зареждане на метаданните
метаданни = pd.read_csv("metadata.csv", sep="|", header=None, 
                      names=["файл", "говорител", "текст"])

# Проверка дали всички аудио файлове съществуват
директория_с_аудио = "wavs/"
липсващи_файлове = []

for файл in метаданни["файл"]:
    пълен_път = os.path.join(директория_с_аудио, файл)
    if not os.path.exists(пълен_път):
        липсващи_файлове.append(файл)

if липсващи_файлове:
    print(f"Липсват {len(липсващи_файлове)} аудио файла!")
    print(липсващи_файлове[:5])  # Показване на първите 5 липсващи файла
else:
    print("Всички аудио файлове съществуват!")

# Проверка за празни транскрипции
празни_транскрипции = метаданни[метаданни["текст"].isna() | (метаданни["текст"] == "")]
if not празни_транскрипции.empty:
    print(f"Намерени {len(празни_транскрипции)} празни транскрипции!")
else:
    print("Няма празни транскрипции!")

1.7. Разделяне на набора от данни

# Пример за Python скрипт за разделяне на набора от данни
import pandas as pd
from sklearn.model_selection import train_test_split

# Зареждане на метаданните
метаданни = pd.read_csv("metadata.csv", sep="|", header=None, 
                      names=["файл", "говорител", "текст"])

# Първо разделяне: 90% обучение+валидация, 10% тест
обуч_вал, тест = train_test_split(метаданни, test_size=0.1, random_state=42)

# Второ разделяне: 90% обучение, 10% валидация от обуч_вал (което е 9% от общото)
обучение, валидация = train_test_split(обуч_вал, test_size=0.1, random_state=42)

# Запазване на разделените метаданни
обучение.to_csv("metadata_train.csv", sep="|", header=False, index=False)
валидация.to_csv("metadata_val.csv", sep="|", header=False, index=False)
тест.to_csv("metadata_test.csv", sep="|", header=False, index=False)

print(f"Общо записи: {len(метаданни)}")
print(f"Записи за обучение: {len(обучение)} ({len(обучение)/len(метаданни)*100:.1f}%)")
print(f"Записи за валидация: {len(валидация)} ({len(валидация)/len(метаданни)*100:.1f}%)")
print(f"Записи за тест: {len(тест)} ({len(тест)/len(метаданни)*100:.1f}%)")

2. Практически съвети за подготовка на данни

2.1. Съвети за качество на аудиото

2.2. Съвети за транскрипции

2.3. Съвети за ефективност

2.4. Скриптове за проверка на аудио

Ето няколко полезни скрипта за проверка на качеството на вашите аудио данни:

# Скрипт за проверка на свойствата на аудио файловете
import os
import librosa
import pandas as pd
from tqdm import tqdm

директория_с_аудио = "wavs/"
файлове = [f for f in os.listdir(директория_с_аудио) if f.endswith('.wav')]

резултати = []

for файл in tqdm(файлове, desc="Проверка на аудио файлове"):
    пълен_път = os.path.join(директория_с_аудио, файл)
    try:
        # Зареждане на аудио файла
        y, sr = librosa.load(пълен_път, sr=None)
        
        # Изчисляване на продължителността
        продължителност = librosa.get_duration(y=y, sr=sr)
        
        # Проверка на броя канали (моно/стерео)
        if y.ndim > 1:
            канали = y.shape[0]
        else:
            канали = 1
            
        # Изчисляване на RMS енергия (за нивото на силата на звука)
        rms = librosa.feature.rms(y=y).mean()
        
        резултати.append({
            'файл': файл,
            'честота_на_семплиране': sr,
            'продължителност': продължителност,
            'канали': канали,
            'rms_енергия': rms
        })
    except Exception as e:
        print(f"Грешка при обработка на {файл}: {str(e)}")

# Конвертиране на резултатите в DataFrame
df = pd.DataFrame(резултати)

# Показване на статистика
print("\nСтатистика за аудио файловете:")
print(f"Общ брой файлове: {len(df)}")
print(f"Уникални честоти на семплиране: {df['честота_на_семплиране'].unique()}")
print(f"Средна продължителност: {df['продължителност'].mean():.2f}s")
print(f"Мин. продължителност: {df['продължителност'].min():.2f}s")
print(f"Макс. продължителност: {df['продължителност'].max():.2f}s")
print(f"Файлове с повече от 1 канал: {(df['канали'] > 1).sum()}")

# Идентифициране на потенциални проблеми
проблемни_файлове = df[
    (df['продължителност'] < 0.5) |  # Прекалено кратки файлове
    (df['продължителност'] > 15) |   # Прекалено дълги файлове
    (df['канали'] > 1) |             # Не-моно файлове
    (df['честота_на_семплиране'] != df['честота_на_семплиране'].mode()[0]) |  # Различна честота на семплиране
    (df['rms_енергия'] < 0.01)       # Прекалено тихи файлове
]

if not проблемни_файлове.empty:
    print(f"\nНамерени {len(проблемни_файлове)} потенциално проблемни файлове:")
    print(проблемни_файлове)
    
    # Запазване на списъка с проблемни файлове
    проблемни_файлове.to_csv("проблемни_аудио_файлове.csv", index=False)

С правилно подготвен набор от данни, вие сте готови да преминете към настройката на средата за обучение и конфигурирането на вашия TTS модел.

Следваща стъпка: Настройка за обучение | Обратно към началото