소개
EdgeTTS로 영어 음성 단어장 만들기, 4차 사례에서 wav 파일 재생이 성공
이제는 개인별 엑셀 영어 단어장을 읽어주는 기능을 구현.
단어 내용이 커서 터미날 화면에 표시 되면서 영어 / 한글 음성을 재생
진행 방법
어떤 도구를 사용했고, 어떻게 활용하셨나요?
커서에서 클로드 3.5버젼 에이젼트 기능을 사용
엑셀로 영어 단어장 준비
커서에 서 샘플 문장 대신 엑셀 파일의 영어 단어 및 한글뜻을 읽게 함
엑셀 단어장
커서에서 엑셀 파일명과 단어 범위를 알려주고
엑셀 파일과 범위를 지정, 한번에 성공적으로 실행
파이썬 코드 첫 부분
음성 재생 및 터미날 표시 내용
음성 속도가 너무 늦어서 음성 배속 기능을 추가
영어는 1.2배속, 한국어는 1.5배속
엑셀 파일명을 현재 폴더에 상대경로 입력 : './words.xls'
터미날 로깅 내용 재구성
영어 / 한글 음성 모델, 영어/ 한국어 재생속도
단어 번호, 영어 단어, 한글 뜻 표시
단어별 소요시간 파악을 위해 음성 재생 시간 표시
로깅 시간을 보면 한단어당 5초 정도 소요
Tip: 사용한 프롬프트 전문을 꼭 포함하고, 내용을 짧게 소개해 주세요.
Tip: 활용 이미지나 캡처 화면을 꼭 남겨주세요.
Tip: 코드 전문은 코드블록에 감싸서 작성해주세요. ( / 을 눌러 '코드 블록'을 선택)
결과와 배운 점
배운 점과 나만의 꿀팁을 알려주세요.
과정 중에 어떤 시행착오를 겪었나요?
앞으로의 계획이 있다면 들려주세요.
현재는 음성을 재생하면서 커서 화면 하단 터미날 부분에 엑셀 문장이 표시되고 있음
터미날 화면은 텍스트 폰트 사이즈나 가독성 측면에서 부족하므로 별로 화면 사용
다음차는
초기 화면을 먼저 표시하고 다양한 설정을 선택하는 기능 추가
단어 범위, 목소리 모델 선택, 영어-한글 음성 간격, 다음 단어 간격, 음성 배속
학습화면도 별도로 표시해서 시각 및 청각을 동시 활용하게
도움 받은 글 (옵션)
파이썬 코드
import asyncio
import edge_tts
from edge_tts import list_voices
import wave
import os
from pathlib import Path
import openpyxl
import time
from datetime import datetime
async def main():
try:
# 음성 설정
eng_voice = "en-US-SteffanNeural" # 영어 음성
kor_voice = "ko-KR-SunHiNeural" # 한글 음성
eng_speed = 1.2 # 영어 1.2배속
kor_speed = 1.5 # 한국어 1.5배속
# 사용 가능한 음성 목록 출력
voices = await list_voices()
print("\n사용 가능한 음성:")
print("\n영어 음성:")
english_voices = [voice for voice in voices if voice["Locale"].startswith("en")]
for voice in english_voices:
print(f"- {voice['ShortName']}: {voice['FriendlyName']}")
print("\n한국어 음성:")
korean_voices = [voice for voice in voices if voice["Locale"].startswith("ko")]
for voice in korean_voices:
print(f"- {voice['ShortName']}: {voice['FriendlyName']}")
print("\n현재 설정:")
print(f"영어 음성: {eng_voice}")
print(f"한글 음성: {kor_voice}")
print(f"재생 속도: 영어 {eng_speed}배속, 한국어 {kor_speed}배속")
# 스크립트 파일의 디렉토리 경로 가져오기
script_dir = Path(os.path.dirname(os.path.abspath(__file__)))
excel_path = script_dir / 'words.xlsx' # 스크립트와 같은 디렉토리의 엑셀 파일
if not os.path.exists(excel_path):
raise FileNotFoundError(f"엑셀 파일을 찾을 수 없습니다: {excel_path}")
workbook = openpyxl.load_workbook(excel_path)
sheet = workbook.active
# A2:B11 범위의 데이터 읽기
words = []
for row in range(2, 12): # 2부터 11까지
english = sheet[f'A{row}'].value
korean = sheet[f'B{row}'].value
if english and korean: # None 값 체크
# 한글 띄어쓰기 정리
korean = korean.replace(" ", "") # 모든 공백 제거
korean = korean.strip() # 앞뒤 공백 제거
words.append((english, korean))
if not words:
raise ValueError("엑셀 파일에서 단어를 읽어올 수 없습니다.")
print("\n읽어온 단어 목록:")
print("\n번호 영어 한글 시간")
print("-" * 60)
# TTS 설정
for i, (english, korean) in enumerate(words, 1):
# 영어 음성 생성 (영어 음성으로)
communicate = edge_tts.Communicate(
text=english,
voice=eng_voice, # 영어 음성
rate=f"+{int((eng_speed-1)*100)}%" # 영어 속도 조절
)
# 영어 WAV 파일 생성
eng_file = script_dir / f"output_eng_{i}.wav"
if os.path.exists(eng_file):
os.remove(eng_file)
await communicate.save(str(eng_file))
# 한글 음성 생성 (한글 음성으로)
communicate = edge_tts.Communicate(
text=korean,
voice=kor_voice, # 한글 음성
rate=f"+{int((kor_speed-1)*100)}%" # 한글 속도 조절
)
# 한글 WAV 파일 생성
kor_file = script_dir / f"output_kor_{i}.wav"
if os.path.exists(kor_file):
os.remove(kor_file)
await communicate.save(str(kor_file))
# 한글 문자열의 실제 표시 길이 계산 (한글은 2칸, 영문/숫자는 1칸 차지)
korean_display_length = sum(2 if ord(c) > 127 else 1 for c in korean)
padding = 40 - (28 + korean_display_length) # 28은 고정된 부분의 길이 (번호4 + 공백2 + 영단어20 + 공백2)
padding = max(padding, 1) # 최소 1칸의 공백 보장
# 로그 출력 및 재생
current_time = datetime.now().strftime("%H:%M:%S.%f")[:-3] # 밀리초까지 표시
print(f"{i:4d} {english:20} {korean}{' ' * padding}{current_time}")
os.system(f"afplay {eng_file}")
os.system(f"afplay {kor_file}")
# 임시 파일 삭제
os.remove(eng_file)
os.remove(kor_file)
except FileNotFoundError as e:
print(f"\n파일 오류: {e}")
print("스크립트 위치:", script_dir)
except Exception as e:
print(f"\n에러가 발생했습니다: {str(e)}")
# 임시 파일 정리
for f in ['eng_file', 'kor_file']:
if f in locals() and os.path.exists(locals()[f]):
os.remove(locals()[f])
if __name__ == "__main__":
asyncio.run(main())
참고한 지피터스 글이나 외부 사례를 알려주세요