코딩

여러 개의 wav 파일을 하나로 합치는 방법

나는야석사 2024. 7. 11. 22:35
pip install pydub
from pydub import AudioSegment
import os

# 음성 파일 폴더 경로 설정
audio_dir = '/path_to_audio_folder'

# 파일 확장자가 .wav인 파일 목록 가져오기
audio_files = [f for f in os.listdir(audio_dir) if f.endswith('.wav')]

# 첫 번째 파일 로드
combined = AudioSegment.from_wav(os.path.join(audio_dir, audio_files[0]))

# 나머지 파일들을 순차적으로 합치기
for audio_file in audio_files[1:]:
    audio = AudioSegment.from_wav(os.path.join(audio_dir, audio_file))
    combined += audio

# 합친 파일 저장
combined.export("/path_to_output_folder/combined_audio.wav", format="wav")

print("All audio files have been combined successfully!")

 

단일 파일을 사용하여 데이터셋 준비

import json
import os
import numpy as np
import librosa
from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor, Trainer, TrainingArguments
from datasets import Dataset, DatasetDict
from sklearn.model_selection import train_test_split
import evaluate
import matplotlib.pyplot as plt

# 음성 파일 및 라벨 파일 경로 설정
audio_files = [
    '/path_to_audio_folder/audio1.wav',
    '/path_to_audio_folder/audio2.wav',
    '/path_to_audio_folder/audio3.wav'
]

label_files = [
    '/path_to_label_folder/label1.json',
    '/path_to_label_folder/label2.json',
    '/path_to_label_folder/label3.json'
]

X = []
y = []

for audio_file, label_file in zip(audio_files, label_files):
    # 음성 파일 로드
    y_audio, sr = librosa.load(audio_file, sr=16000)
    
    # 라벨 파일 로드
    with open(label_file, 'r', encoding='utf-8') as f:
        label_data = json.load(f)
        
    # 라벨 추출
    transcript = label_data["전사정보"]["OrgLabelText"]
    
    X.append({"array": y_audio, "sampling_rate": sr})
    y.append(transcript)

# train_test_split을 사용하여 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 데이터셋 준비
train_data = Dataset.from_list([{"audio": X, "transcript": y} for X, y in zip(X_train, y_train)])
test_data = Dataset.from_list([{"audio": X, "transcript": y} for X, y in zip(X_test, y_test)])

# Wav2Vec 2.0 모델 및 프로세서 로드
processor = Wav2Vec2Processor.from_pretrained("facebook/wav2vec2-large-960h")
model = Wav2Vec2ForCTC.from_pretrained("facebook/wav2vec2-large-960h")

# 데이터셋 전처리 함수
def prepare_dataset(batch):
    audio = batch["audio"]
    inputs = processor(audio["array"], sampling_rate=audio["sampling_rate"], return_tensors="pt", padding="max_length", truncation=True, max_length=16000)
    labels = processor(text=[batch["transcript"]], return_tensors="pt", padding="max_length", truncation=True, max_length=64).input_ids
    batch["input_values"] = inputs.input_values[0].numpy()
    batch["labels"] = labels[0].numpy()
    return batch

# 데이터셋 처리
train_dataset = train_data.map(prepare_dataset, remove_columns=["audio", "transcript"])
test_dataset = test_data.map(prepare_dataset, remove_columns=["audio", "transcript"])

# 모델 학습 설정
training_args = TrainingArguments(
    output_dir="./results",
    evaluation_strategy="epoch",
    per_device_train_batch_size=1,
    per_device_eval_batch_size=1,
    num_train_epochs=3,
    save_steps=10,
    save_total_limit=2,
    fp16=True,
    logging_dir='./logs',
)

# 모델 평가 함수 정의
wer_metric = evaluate.load("wer")

def compute_metrics(pred):
    pred_logits = pred.predictions
    pred_ids = np.argmax(pred_logits, axis=-1)
    pred_str = processor.batch_decode(pred_ids, skip_special_tokens=True)
    labels_ids = pred.label_ids
    labels_str = processor.batch_decode(labels_ids, skip_special_tokens=True)

    wer = wer_metric.compute(predictions=pred_str, references=labels_str)

    return {"wer": wer}

# 트레이너 설정
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=test_dataset,
    tokenizer=processor.feature_extractor,
    compute_metrics=compute_metrics,
)

# 모델 학습
trainer.train()

# 모델 평가
results = trainer.evaluate()
print(results)
print(f"Word Error Rate (WER): {results['eval_wer'] * 100:.2f}%")