코딩

TTS AI 예제 여러 개

나는야석사 2024. 7. 11. 22:37

음성 데이터 전처리 문제

배경 소음 제거

배경 소음을 제거하여 음성 데이터를 더 깨끗하게 만드는 작업입니다.

import noisereduce as nr
import librosa

# 음성 파일 로드
y, sr = librosa.load(audio_file_path, sr=16000)

# 배경 소음 제거
reduced_noise = nr.reduce_noise(y=y, sr=sr)

# 결과 저장
librosa.output.write_wav("/path_to_output_folder/reduced_noise_audio.wav", reduced_noise, sr)

2. 특성 추출 문제

스펙트로그램 생성

음성 신호의 스펙트로그램을 생성하고 시각화하는 작업입니다.

import librosa.display

# 스펙트로그램 생성
S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128)
S_DB = librosa.power_to_db(S, ref=np.max)

# 스펙트로그램 시각화
plt.figure(figsize=(10, 4))
librosa.display.specshow(S_DB, sr=sr, x_axis='time', y_axis='mel')
plt.colorbar(format='%+2.0f dB')
plt.title('Mel-frequency spectrogram')
plt.tight_layout()
plt.show()

 

3. 모델 선택 및 훈련 문제

음성 인식 모델 훈련

Wav2Vec2 모델을 사용하여 음성 인식 모델을 훈련하는 작업입니다.

from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor, Trainer, TrainingArguments
from datasets import load_dataset
import evaluate

# 데이터셋 로드 (다른 데이터셋 사용 가능)
dataset = load_dataset("common_voice", "en", split="train[:1%]")

# Wav2Vec2 모델 및 프로세서 로드
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)
    batch["input_values"] = inputs.input_values[0].numpy()
    batch["labels"] = processor(batch["sentence"], return_tensors="pt").input_ids[0]
    return batch

# 데이터셋 전처리
dataset = dataset.map(prepare_dataset, remove_columns=["audio", "sentence"])

# 모델 학습 설정
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=dataset,
    eval_dataset=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}%")

4. 평가 및 오류 분석 문제

모델 평가 지표 계산

WER과 같은 평가 지표를 계산하여 모델의 성능을 평가하는 작업입니다.

from jiwer import wer

# 원본 텍스트와 예측 텍스트
reference = "지금 바로 보험사에게 전화 걸어줄래?"
hypothesis = "지금 바로 보험사에게 전화 걸어 줄래?"

# WER 계산
error = wer(reference, hypothesis)
print(f"Word Error Rate: {error}")

5. 데이터 증강 문제

음성 데이터 증강

TTS(Text-to-Speech)를 사용하여 데이터를 증강하는 작업입니다.

from pydub import AudioSegment

# TTS 음성 데이터 생성 (외부 TTS 서비스 사용)
def generate_tts_audio(text, output_file):
    # TTS 서비스 호출 코드 (생략)
    # 결과 음성 파일을 output_file에 저장
    pass

# 원본 음성 파일과 TTS 음성 파일 결합
original_audio = AudioSegment.from_wav(audio_file_path)
tts_audio = AudioSegment.from_wav("/path_to_tts_output/tts_audio.wav")
combined_audio = original_audio + tts_audio

# 결합된 음성 파일 저장
combined_audio.export("/path_to_output/combined_audio.wav", format="wav")