매번 전환프로그램을 찾거나 텍스트로 만들지 음성으로 만들지에 따른 고민 없이 특정 음성이나 텍스트 파일을 받아 원하는 언어의 텍스트와 음성으로 변경해 주는 프로그램을 만들어 보겠습니다.
chatGPT가 얼마나 구현해줄지 확인해 보죠.
프롬프트
문서번역 프로그램을 만들고 싶어 특정언어에서 특정언어로 거기에 추가해서 그리고 해당 텍스트파일을 음성으로도 자동저장하고 싶어 특정언어에서 특정언어로 그러니까 인풋값을 특정 텍스트파일이나 음성파일을 입력받으면 변경하고 싶은 나라의 텍스트나 음성파일로 변경하는 프로그램을 만들고 싶어 일단 전환하고 싶은 언어를 선택하면 받은 텍스트나 음성파일을 전황하고 싶은 언어의 텍스트와 음성으로 전환해 주는 프로그램이지 입력값은 텍스트나 음성 두 가지가 될 수 있지만 결괏값은 두 가지다 저장해줘야 해
ChatGPT 결과
코드 설명:
- translate_text: 텍스트를 선택한 언어로 번역하는 함수입니다.
- text_to_speech: 텍스트를 음성으로 변환해 파일로 저장하는 함수입니다.
- speech_to_text: 음성 파일을 텍스트로 변환하는 함수입니다.
- main: 사용자 입력을 받고, 텍스트 또는 음성에 따라 적절한 작업을 진행하는 함수입니다.
이렇게 하면 텍스트나 음성 파일을 입력받아 번역하고, 결과를 텍스트 파일과 음성 파일로 저장할 수 있습니다. 추가적으로 필요한 기능이나 수정할 부분이 있으면 알려주세요!
프롬프트 2
자 그럼 GUI를 구현해서 번역하고 싶은 음성이나 텍스트파일을 받도록 처리하고 어떤 언어로 변경하고 싶은지도 인풋값으로 받도록 하자 그리고 결과물을 저장할 파일경로도 같이 받도록 설정하고 파일경로에 텍스트와 음성파일 두 가지를 저장해 주면 될거같아
ChatGPT 결과
필요한 라이브러리
- tkinter: GUI 구현
- googletrans: 번역
- speech_recognition: 음성 -> 텍스트
- gTTS: 텍스트 -> 음성
- filedialog: 파일 선택을 위한 다이얼로그
코드 설명:
- 파일 선택: 사용자가 번역할 파일을 선택할 수 있도록 filedialog.askopenfilename()을 사용했습니다. 선택된 파일 경로는 file_entry 입력창에 표시됩니다.
- 언어 코드 입력: 사용자가 번역할 언어를 직접 입력하도록 합니다 (예: ko for 한국어, en for 영어).
- 저장 경로 선택: 번역된 텍스트와 음성 파일을 저장할 경로를 filedialog.asksaveasfilename()을 통해 지정합니다.
- 프로세스 처리: 사용자가 입력한 파일 경로와 언어를 바탕으로 번역 및 음성 변환을 처리한 후, 결과를 지정된 경로에 저장합니다.
실행 흐름:
- 사용자는 번역할 파일을 선택합니다 (텍스트 파일 또는 음성 파일).
- 번역할 언어를 입력하고, 결과 파일을 저장할 경로를 설정합니다.
- "번역 및 저장" 버튼을 누르면, 번역과 음성 변환이 이루어지고, 결과 파일이 지정된 경로에 저장됩니다.
코드
import tkinter as tk
from tkinter import filedialog, messagebox
from googletrans import Translator
import speech_recognition as sr
from gtts import gTTS
import os
def translate_text(input_text, target_language):
translator = Translator()
translated = translator.translate(input_text, dest=target_language)
return translated.text
def text_to_speech(text, language, output_file):
tts = gTTS(text=text, lang=language)
tts.save(output_file)
def speech_to_text(audio_file):
recognizer = sr.Recognizer()
with sr.AudioFile(audio_file) as source:
audio = recognizer.record(source)
text = recognizer.recognize_google(audio)
return text
def browse_file():
file_path = filedialog.askopenfilename(title="파일 선택", filetypes=(("텍스트 파일", "*.txt"), ("음성 파일", "*.wav;*.mp3")))
file_entry.delete(0, tk.END) # 기존 입력 지우기
file_entry.insert(0, file_path)
def save_file():
save_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=(("텍스트 파일", "*.txt"), ("음성 파일", "*.mp3")))
save_entry.delete(0, tk.END) # 기존 입력 지우기
save_entry.insert(0, save_path)
def process():
input_file = file_entry.get()
target_language = language_entry.get().strip()
save_path = save_entry.get()
if not input_file or not target_language or not save_path:
messagebox.showerror("입력 오류", "모든 입력을 채워주세요.")
return
try:
# 텍스트 파일 입력 처리
if input_file.endswith('.txt'):
with open(input_file, 'r', encoding='utf-8') as f:
text = f.read()
translated_text = translate_text(text, target_language)
with open(save_path + ".txt", 'w', encoding='utf-8') as f:
f.write(translated_text)
text_to_speech(translated_text, target_language, save_path + ".mp3")
messagebox.showinfo("성공", "텍스트 번역 및 음성 파일이 저장되었습니다.")
# 음성 파일 입력 처리
elif input_file.endswith('.wav') or input_file.endswith('.mp3'):
text_from_audio = speech_to_text(input_file)
translated_text = translate_text(text_from_audio, target_language)
with open(save_path + ".txt", 'w', encoding='utf-8') as f:
f.write(translated_text)
text_to_speech(translated_text, target_language, save_path + ".mp3")
messagebox.showinfo("성공", "음성 번역 및 텍스트 파일이 저장되었습니다.")
else:
messagebox.showerror("파일 오류", "지원되지 않는 파일 형식입니다.")
except Exception as e:
messagebox.showerror("처리 오류", f"오류가 발생했습니다: {e}")
# GUI 설정
root = tk.Tk()
root.title("문서 및 음성 번역 프로그램")
# 파일 입력
file_label = tk.Label(root, text="파일 선택:")
file_label.pack(pady=5)
file_entry = tk.Entry(root, width=50)
file_entry.pack(pady=5)
file_button = tk.Button(root, text="파일 선택", command=browse_file)
file_button.pack(pady=5)
# 번역 언어 입력
language_label = tk.Label(root, text="변경할 언어 코드 (예: 'ko' for 한국어):")
language_label.pack(pady=5)
language_entry = tk.Entry(root, width=50)
language_entry.pack(pady=5)
# 저장 경로 입력
save_label = tk.Label(root, text="저장할 경로:")
save_label.pack(pady=5)
save_entry = tk.Entry(root, width=50)
save_entry.pack(pady=5)
save_button = tk.Button(root, text="저장 경로 선택", command=save_file)
save_button.pack(pady=5)
# 처리 버튼
process_button = tk.Button(root, text="번역 및 저장", command=process)
process_button.pack(pady=20)
root.mainloop()
결과도출 하기 위한 과정
역시 위에 나온 필요한 라이브러리를 무시해 오류가 발생합니다.
하지만 뭐가 필요한지 어떤 거 때문에 오류가 나는지 고민하기 힘들기에 일단 부딪혀보고 즉각적으로 해결해나가 보겠습니다.
File "C:\Users\qwe\pythonPG\translate.py", line 3, in <module>
from googletrans import Translator
ModuleNotFoundError: No module named 'googletrans'
설치 방법:
- **터미널(명령 프롬프트)**을 열고, 다음 명령어를 입력하여 googletrans를 설치하세요:
- 설치가 완료되면, 코드에서 다시 실행해 보세요. 만약 여전히 문제가 발생하면 googletrans의 다른 버전이나, 대체 API인 deep-translator를 사용할 수 있습니다.
이제 googletrans가 설치되었으면, 코드가 정상적으로 실행될 것입니다.
설치가 완료되었습니다.
자 다음 에러입니다.
1. 파이썬 버전 업그레이드
httpx와 googletrans를 사용할 때 파이썬 버전이 3.8 이상일 경우 cgi 모듈이 더 이상 필요하지 않도록 변경된 버전의 라이브러리를 사용할 수 있습니다. 파이썬 버전을 3.8 이상으로 업데이트하는 것을 고려해보세요.
2. httpx 대신 다른 라이브러리 사용
httpx 라이브러리의 의존성 문제를 피하려면, deep-translator와 같은 다른 번역 라이브러리를 사용하는 것도 좋은 방법입니다.
deep-translator를 설치하고 사용하는 방법은 다음과 같습니다:
deep-translator 설치 방법:
gTTS 설치 방법:
- **터미널(명령 프롬프트)**을 열고, 다음 명령어를 입력하여 gTTS를 설치합니다
결과확인 및 테스트
일단 이렇게 프로그램이 작성되었습니다. 이제 실행해 가면서 오류를 잡아보도록 하겠습니다.
간단하게 특정 글을 txt 문서를 만들어보겠습니다.
-내용-
민원창구 야간 민원실 이용
이용시간 : 매주 목요일 18:00~20:00 (법정 공휴일 제외) (2023년 7월 3일부터 야간근무일 매주 월 → 매주 목요일로 변경 운영합니다.)
대상업무 : 여권신청·교부, 주민등록등·초본발급, 인감, 가족관계증명서 발급, 출생, 사망, 혼인 등 신고
(단, 국제가족관계 등록신고 업무는 제외)
일단 변경해야 할 언어 선택이 불편합니다 차후 개선하도록 하고 일단 맞는 언어코드를 입력해 보겠습니다.
그리고 저장할 경로 선택 시 파일명을 받도록 되어있네요. 파일경로와 파일명을 따로 받는 형태가 좋을 듯합니다.
일단 위처럼 그럼 결과 파일이 어떻게 저장되었는지 보겠습니다.
결과가 나왔습니다.
음성도 동일한 이름으로 저장되었습니다.
고도화 프롬프트
저장할 경로와 파일명을 따로 받도록 GUI를 변경했으면 좋겠어 만약 파일명이입력되지 않았다면 년도월일시분초 명칭으로 파일을 작성해주면 좋겠어 경로는 필수 체크를 부탁해. 언어코드는 일반인이 알기 힘드니 콤보박스로 선택할수 있도록 변경해줘
알겠습니다! 저장할 경로와 파일명을 따로 받도록 변경하고, 파일명이 입력되지 않은 경우에는 년도월일시분초 형식으로 자동 생성하는 기능을 추가하겠습니다. 또한, 경로는 필수 입력으로 체크하여, 경로가 비어 있으면 경고 메시지를 표시하도록 할게요. 언어 코드를 일반인이 쉽게 선택할 수 있도록, 콤보박스를 사용하여 언어를 선택할 수 있게 변경하겠습니다. 콤보박스에는 사용자가 선택할 수 있도록 대표적인 언어 목록을 제공할 것입니다. 선택된 언어에 맞는 언어 코드가 자동으로 설정되도록 할 수 있습니다.
주요 변경 사항:
- 저장 경로 필수 체크:
- 저장 경로가 입력되지 않으면 messagebox.showerror를 통해 경고 메시지를 출력하고, 저장 경로가 비어 있으면 처리되지 않도록 합니다.
- 파일명 입력:
- 파일명 입력란을 추가했습니다. 파일명이 입력되지 않으면, 년도월일시분초 형식으로 자동 생성합니다.
- 자동 생성된 파일명은 datetime.now().strftime("%Y%m%d%H%M%S")로 설정됩니다.
- 저장할 폴더 선택:
- 저장 경로는 askdirectory를 사용하여 폴더를 선택하도록 하였습니다.
- 언어 선택 콤보박스:
- ttk.Combobox를 사용하여 언어 선택 콤보박스를 만들었습니다. 사용자는 콤보박스에서 언어를 선택할 수 있습니다.
- 콤보박스에는 사용자가 쉽게 알 수 있는 언어 이름(예: "한국어", "영어", "스페인어")을 나열하고, 내부적으로 deep-translator에서 사용할 수 있는 언어 코드로 변환하여 번역을 진행합니다.
- 기본값 설정:
- 언어 콤보박스의 기본값은 "한국어"로 설정되어 있습니다. 사용자가 언어를 선택하지 않으면 기본값이 사용됩니다.
- 언어 코드 맵핑:
- languages 딕셔너리를 사용하여 언어 이름과 해당하는 언어 코드(예: "한국어": "ko", "영어": "en")를 매핑합니다.
고도화 결과
자 이렇게 입력하도록 변경되었고 결과를 보겠습니다.
역시 한 번에 알아서 해주진 못했군요.
위에 에러를 보시면 스페인어 나는 건 제공되지 않는 언어라고 나오네요.
그렇다면 선택된 스페인어라는 값이 그대로 넘어가서 생기는 오류라고 볼 수 있습니다.
해결책은 선택된 언어의 언어코드값을 넘겨주도록 변경하는 것입니다.
이런 식으로 매핑을 시켜주도록 변경되었습니다.
다시 실행해 보겠습니다.
정상적으로 처리되었습니다.
결과를 보시겠습니다.
파일명이 정확하게 원하는 대로 생성되었습니다.
간단한 지시만으로 텍스트번역과 음성전환까지 한 번에 해주는 음성변환기 프로그램이었습니다.
정말 간단하지만 유용한 프로그램이 될 수 있겠습니다.
이처럼 본인의 생각을 chatGPT에게 정확하게 전달하게 AI프로그램을 사용할 수 있게 됩니다.
그럼 이상 IT아재였습니다. ^^
'IT정보 > AI프로그래밍' 카테고리의 다른 글
엑셀파일에서 이메일을 읽어 자동으로 발송하기 (0) | 2025.03.17 |
---|---|
이메일을 수집해서 엑셀파일로 관리하는 프로그램 (0) | 2025.03.17 |
프린트스크린샷 기능을 단축키로 변경해주는 프로그램 (0) | 2025.03.14 |
내컴퓨터 정보확인하는 프로그램 (0) | 2025.03.14 |
QR코드를 만들어주는 프로그램 (0) | 2025.03.14 |