Spaces:
Sleeping
Sleeping
""" | |
Mô-đun chuẩn bị metadata cho tập dữ liệu huấn luyện. | |
Tạo file metadata.csv và vocab từ tập dữ liệu âm thanh. | |
""" | |
import os | |
import glob | |
import shutil | |
import soundfile as sf | |
from tqdm import tqdm | |
# Đường dẫn dữ liệu | |
DATASET_DIR = "data/your_dataset" | |
TRAINING_DIR = "data/your_training_dataset" | |
WAVS_DIR = os.path.join(TRAINING_DIR, "wavs") | |
METADATA_PATH = os.path.join(TRAINING_DIR, "metadata.csv") | |
VOCAB_PATH = os.path.join(TRAINING_DIR, "vocab_your_dataset.txt") | |
# Tạo thư mục đích nếu chưa tồn tại | |
os.makedirs(WAVS_DIR, exist_ok=True) | |
def get_audio_duration(wav_path: str) -> float: | |
""" | |
Tính thời lượng của file audio. | |
Args: | |
wav_path (str): Đường dẫn file WAV. | |
Returns: | |
float: Thời lượng của file (giây). | |
""" | |
audio_data, sr = sf.read(wav_path) | |
return len(audio_data) / sr | |
def process_dataset(): | |
""" | |
Duyệt qua tất cả file WAV, copy vào thư mục mới, tạo metadata và vocab. | |
""" | |
wav_paths = glob.glob(os.path.join(DATASET_DIR, "*.wav")) | |
tokens = set() | |
with open(METADATA_PATH, "w", encoding="utf8") as fw: | |
for wav_path in tqdm(wav_paths, desc="Processing dataset"): | |
wav_name = os.path.basename(wav_path) | |
wav_dest_path = os.path.join(WAVS_DIR, wav_name) | |
# Copy file âm thanh sang thư mục mới | |
shutil.copy(wav_path, wav_dest_path) | |
# Đọc nội dung text | |
txt_path = wav_path.replace(".wav", ".txt") | |
if not os.path.exists(txt_path): | |
continue | |
with open(txt_path, "r", encoding="utf8") as fr: | |
text = fr.readline().strip().lower() | |
text = text.replace("_", " ") | |
text = " ".join(text.split()) | |
# Bỏ qua file không đạt yêu cầu | |
duration = get_audio_duration(wav_path) | |
if duration < 1 or duration > 30 or len(text.split()) < 3: | |
continue | |
# Ghi vào metadata.csv | |
fw.write(f"wavs/{wav_name}|{text}\n") | |
# Thu thập token cho vocab | |
tokens.update(text) | |
# Ghi vocab vào file | |
with open(VOCAB_PATH, "w", encoding="utf8") as fw_vocab: | |
fw_vocab.write("\n".join(sorted(tokens))) | |
print(f"Metadata lưu tại: {METADATA_PATH}") | |
print(f"Vocab lưu tại: {VOCAB_PATH}") | |
if __name__ == "__main__": | |
process_dataset() | |