수학적 영상처리

torchaudio를 사용해 text로 오디오를 만든후 spectrogram을 그리기

제갈티 2024. 9. 23. 13:33

맨위가 입력한 텍스트, 아래가 합성된 음성파형, 가운데가 신호처리로 만든스펙트로그램입니다.

 

- "헬로, 월드" 라는 발음의 오디오 파형과 스펙트로그램은 처음 보시죠?

- 오디오도 들어볼수 있습니다. 실제로 성우가 남자냐, 여자내에 따라 그리고 화자가 누구냐에 따라 오디오 파형과 스펙트로그램은 달르게 만들어질 것입니다~

- 이 코드는 텍스트를 음성으로 변환하는 GUI 애플리케이션을 구현하고 있습니다. 주요 특징은 다음과 같습니다:

  1. Tkinter를 사용하여 GUI를 구성합니다.
  2. 토치오디오 패키지의 Tacotron2와 WaveRNN 모델을 사용하여 텍스트를 음성으로 변환합니다.(딥러닝 추론)
  3. Matplotlib을 사용하여 생성된 오디오의 스펙트로그램과 파형을 시각화합니다.
  4. Pygame을 사용하여 생성된 오디오를 재생합니다.

- 이 애플리케이션은 사용자가 텍스트를 입력하고 "Generate" 버튼을 클릭하면 해당 텍스트를 음성으로 변환하여 시각화하고 저장합니다. 그래프를 클릭하면 생성된 오디오를 재생할 수 있습니다.

- 이 코드는 음성 합성, 시각화, 오디오 재생 등 다양한 기능을 결합한 복잡한 애플리케이션을 구현하고 있습니다. 텍스트-음성 변환 모델의 실제 적용 예시로 볼 수 있습니다.

- 이제 내가 궁금한 문장의 오디오 파형 및 스펙트로그램을 눈으로 확인이 가능한 시대가 되었네요~!!

# 필요한 라이브러리 임포트
import tkinter as tk
from tkinter import messagebox
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from pygame import mixer
import torch
import torchaudio
import matplotlib.pyplot as plt

- 패키지들 임포트

# Pygame 믹서 초기화
mixer.init()

# 재현성을 위한 랜덤 시드 설정
torch.random.manual_seed(0)

# GPU 사용 가능 여부 확인
device = "cuda" if torch.cuda.is_available() else "cpu"

# Tacotron2 및 WaveRNN 모델 로드
bundle = torchaudio.pipelines.TACOTRON2_WAVERNN_PHONE_LJSPEECH
processor = bundle.get_text_processor()
tacotron2 = bundle.get_tacotron2().to(device)
vocoder = bundle.get_vocoder().to(device)

- 초기화 및 오디오모델 로드

class App:
    def __init__(self, master):
        self.master = master
        master.title('Text to Speech')

        # 텍스트 입력 필드 생성
        self.text_entry = tk.Entry(master)
        self.text_entry.pack()

        # 생성 버튼 생성
        self.generate_button = tk.Button(master, text='Generate', command=self.generate)
        self.generate_button.pack()

        # Matplotlib 그래프를 위한 캔버스 생성
        self.figure = Figure(figsize=(5, 5), dpi=100)
        self.canvas = FigureCanvasTkAgg(self.figure, master=master)
        self.canvas.get_tk_widget().pack()

        # 캔버스에 클릭 이벤트 연결
        self.canvas.mpl_connect("button_press_event", self.play_audio)

- 앱 클래스 생성
- 텍스트입력, 버튼, 뷰등 콘트롤 배치

    def generate(self):
        # 입력된 텍스트 가져오기
        text = self.text_entry.get()

        # 텍스트를 음성으로 변환
        with torch.inference_mode():
            processed, lengths = processor(text)
            processed = processed.to(device)
            lengths = lengths.to(device)
            spec, spec_lengths, _ = tacotron2.infer(processed, lengths)
            waveforms, lengths = vocoder(spec, spec_lengths)

        # 스펙트로그램과 파형 그래프 생성
        self.figure.clear()
        a = self.figure.add_subplot(211)
        a.imshow(spec[0].cpu().detach(), origin="lower", aspect="auto")
        b = self.figure.add_subplot(212)
        b.plot(waveforms[0].cpu().detach())
        self.canvas.draw()

        # 생성된 오디오 파일 저장
        torchaudio.save("output.wav", waveforms, sample_rate=vocoder.sample_rate)

- 오디오파일 합성 및 스펙트로그램 컨버팅 함수들 구현

    def play_audio(self, event):
        # 생성된 오디오 파일 재생
        try:
            mixer.music.load('output.wav')
            mixer.music.play()
        except Exception as e:
            messagebox.showerror("Error", str(e))

# 메인 윈도우 생성 및 애플리케이션 실행
root = tk.Tk()
app = App(root)
root.mainloop()

- 오디오 재생함수 및 메인루프 작성