이번에는 영어 텍스트를 입력받아서 한국어로 번역하고, 해당 번역문을 한국어 음성으로 변환해서 재생하는 프로그램을 만들어볼 것이다.
우리는 이전에 배운 페이스북 번역 모델과, ElevenLabs의 음성 합성 API를 사용해서, 번역과 음성 생성을 처리하고, 이걸 PyQt로 사용자 친화적인 인터페이스를 통해 제공할 예정이다.
바로 시작해보자.
필요한 라이브러리들을 import하자. 이 중 pydub는 음성을 재생하거나 미디어 파일을 관리할 때 유용한 라이브러리 중 하나다.
import os
import requests
from dotenv import load_dotenv
from PyQt5 import QtWidgets
from PyQt5.QtCore import QUrl
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
from pydub import AudioSegment
from pydub.playback import play
import io
그 후에는TranslatorApp을 만들어줄 것이다.
class TranslatorApp(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.init_ui()
# 번역 모델 로드
model_name = "facebook/nllb-200-distilled-600M"
self.tokenizer = AutoTokenizer.from_pretrained(model_name)
self.model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
# API 설정
load_dotenv()
self.api_key = os.getenv("API_KEY")
self.url = os.getenv("API_URL")
# 음성 재생기
self.player = QMediaPlayer()
그리고 마지막에 음성 재생기, 즉 만들어낸 mp3 파일을 재생해줘야 하니까, 이 코드를 넣어줘야 한다.
이제 UI를 구성하는 부분이다.
def init_ui(self):
# UI 구성
self.text_input = QtWidgets.QLineEdit(self)
self.text_input.setPlaceholderText("번역할 텍스트 입력")
self.translate_button = QtWidgets.QPushButton("번역 및 음성 생성", self)
self.output_label = QtWidgets.QLabel(self)
self.play_button = QtWidgets.QPushButton("음성 재생", self)
self.play_button.setEnabled(False)
# 레이아웃 설정
layout = QtWidgets.QVBoxLayout()
layout.addWidget(self.text_input)
layout.addWidget(self.translate_button)
layout.addWidget(self.output_label)
layout.addWidget(self.play_button)
self.setLayout(layout)
# 버튼 클릭 시 이벤트 핸들러 연결
self.translate_button.clicked.connect(self.translate_and_generate_audio)
self.play_button.clicked.connect(self.play_audio)
# 윈도우 창 설정
self.setWindowTitle("번역 및 음성 생성기")
self.show()
UI 구성은 그때그때 바뀌기 때문에, 간단하게 어떤 UI를 넣을 건지 만들고, 레이아웃을 설정해주고, 각각의 UI에서 어떤 반응이 일어나야 하는 지 이벤트를 연결해줌으로써 구성할 수 있다는 정도만 이해하면 된다.
ElevenLabs에 API를 호출하는 부분이다
def translate_and_generate_audio(self):
text = self.text_input.text()
# 번역 수행
inputs = self.tokenizer(text, return_tensors="pt")
generated_tokens = self.model.generate(inputs.input_ids, forced_bos_token_id=self.tokenizer.lang_code_to_id["kor_Hang"])
translated_text = self.tokenizer.decode(generated_tokens[0], skip_special_tokens=True)
# 음성 생성 요청
data = {
"text": translated_text,
"model_id": "eleven_multilingual_v2",
"voice_settings": {
"stability": 0.5,
"similarity_boost": 1,
"style": 0.5,
"use_speaker_boost": True
}
}
headers = {
"xi-api-key": self.api_key,
"Content-Type": "application/json"
}
response = requests.post(self.url, json=data, headers=headers)
if response.status_code == 200:
output_audio_path = "audio_output/output_audio.mp3"
with open(output_audio_path, "wb") as f:
f.write(response.content)
self.output_label.setText(f"번역 결과: {translated_text}")
self.play_button.setEnabled(True)
else:
self.output_label.setText("음성 생성 실패")
첫 번째로, 사용자로부터 입력이 들어오면, 이 입력을 번역해준다. 그리고 번역된 것을 ElevenLabs API에 전달해준다. 그리고나서 ElevenLabs 코드가 반환을 해준다면, 밑에 있는 코드(아래에 #음성 파일 재생 부분이 있는 코드)를 통해 반환값을 재생해주는 것이다.
def play_audio(self):
# 음성 파일 재생
audio_path = "audio_output/output_audio.mp3"
if os.path.exists(audio_path):
# Pydub을 통해 mp3 파일을 불러와서 재생
audio = AudioSegment.from_mp3(audio_path)
play(audio) # Pydub의 play() 함수 사용
else:
self.output_label.setText("오디오 파일을 찾을 수 없습니다.")
# 메인 실행부
if __name__ == '__main__':
app = QtWidgets.QApplication([])
translator = TranslatorApp()
app.exec_()
한 번 실행해보자. 코드를 실행하면 아래와 같은 창이 나온다.
영어 문장을 써주고 버튼을 눌러주면, 번역 모델이 돌아가고 결과가 나오며, 자동으로 컴퓨터에는 음성 파일이 저장되게 된다. 그러고 나서 '음성 재생' 버튼을 누르면 저장된 음성 파일이 재생된다. 프로그램을 종료하려면 x 버튼을 눌러주면 된다.
이런 서비스를 만들 때는 API 키와 URL 관리가 매우 중요하다는 것을 명심하자.
'AI 부트캠프 > 챕터3(11.08~12.04)' 카테고리의 다른 글
TIL 42 (1) | 2024.11.18 |
---|---|
TIL 41 (0) | 2024.11.17 |
WIL 6 (0) | 2024.11.15 |
TIL 39 필수 과제 (0) | 2024.11.15 |
TIL 38 개인 과제 (3) | 2024.11.14 |