Notice
Recent Posts
Recent Comments
Link
맥에서 오픈소스로
torchaudio를 사용해 text로 오디오를 만든후 spectrogram을 그리기 본문

- "헬로, 월드" 라는 발음의 오디오 파형과 스펙트로그램은 처음 보시죠?
- 오디오도 들어볼수 있습니다. 실제로 성우가 남자냐, 여자내에 따라 그리고 화자가 누구냐에 따라 오디오 파형과 스펙트로그램은 달르게 만들어질 것입니다~
- 이 코드는 텍스트를 음성으로 변환하는 GUI 애플리케이션을 구현하고 있습니다. 주요 특징은 다음과 같습니다:
- Tkinter를 사용하여 GUI를 구성합니다.
- 토치오디오 패키지의 Tacotron2와 WaveRNN 모델을 사용하여 텍스트를 음성으로 변환합니다.(딥러닝 추론)
- Matplotlib을 사용하여 생성된 오디오의 스펙트로그램과 파형을 시각화합니다.
- 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()
- 오디오 재생함수 및 메인루프 작성
'수학적 영상처리' 카테고리의 다른 글
Sobel Filter를 데이타를 학습시켜서 만든다고?! (3) | 2024.09.30 |
---|---|
[magick] 폴더속 이미지들 중 truncated 이미지만 찾아내는 imagemagick 명령어 (5) | 2024.09.26 |
[파이썬] Notch Filtering 으로 모아레 패턴 제거하기 (1) | 2024.09.12 |
[파이썬] 2차원 푸리에변환을 12bit 버전으로 구현해보았습니다. (1) | 2024.09.12 |
[파이썬] Rotate-invariant realtime template matching using SAM model (1) | 2024.09.11 |