Spaces:
Sleeping
Sleeping
File size: 2,478 Bytes
1ddca60 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
"""
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()
|