코딩
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")