소개
비손실 압축방식이며 자연스러운 목소리를 만들어주는 MS EdgeTTS로 영어 단어장 만들기(1월10일밤 GPTers AI Talk 특강 발표내용 WAV 작성 코드)
진행 방법
어떤 도구를 사용했고, 어떻게 활용하셨나요?
Tip: 사용한 프롬프트 전문을 꼭 포함하고, 내용을 짧게 소개해 주세요.
커서 챗기능을 이용, EdgeTTS를 활용한 기본 코드를 요청
1단계 : 한번의 에러 및 수정 기능을 통해 wav 파일 성공
2단계 : wav 파일을 저장하는 대신 실시간 재생 방식으로 수정 요청
3단계 : 텍스트 문구 대신 엑셀 단어장의 영어, 한글 A2:B11 범위를 읽게 수정
4단계 : 엑셀 단어장의 내용을 터미날에 표시하라고 요청
지피터스 Cursor 입코딩 스터디 1주차 수업 예정(매주 목요일 9PM)
5단계 : 터미날 대신 별도 화면을 이용해서 시각적으로 표시
6단계 : 단어범위 및 반복, 배속 등 조건을 입력하는 초기화면 구성
7단계 : 영한 버젼, 한영 버젼,
8단계 : 중국어, 베트남어, 일본어 등 다양한 언어 단어장
8단계 : 무작위 재생, 다크 모드, 진도 관리 등 다양한 업그레이드
https://youtu.be/ADsZ13KljxE?si=tPYvJqPdalflNfkC
Tip: 활용 이미지나 캡처 화면을 꼭 남겨주세요.
Tip: 코드 전문은 코드블록에 감싸서 작성해주세요. ( / 을 눌러 '코드 블록'을 선택)
1번 간단한 101코드, 2번 엑셀문서를 이용한 버젼
import asyncio
import edge_tts
from edge_tts import list_voices
import wave
import os
async def main():
try:
# 사용 가능한 음성 목록 출력
voices = await list_voices()
korean_voices = [voice for voice in voices if voice["Locale"].startswith("ko")]
print("\n사용 가능한 한국어 음성:")
for voice in korean_voices:
print(f"- {voice['ShortName']}: {voice['FriendlyName']}")
# TTS 설정
communicate = edge_tts.Communicate(
text="안녕하세요, 한국 최대 지피터스에서 커서 파이썬 입코딩 강좌를 맡은 오쌤입니다. 잘 들리시나요?",
voice="ko-KR-SunHiNeural",
rate="+0%"
)
# 직접 파일로 저장
output_file = "output.wav"
if os.path.exists(output_file):
os.remove(output_file)
print("\n음성을 생성하는 중...")
await communicate.save(output_file)
# 파일 크기 확인
if os.path.exists(output_file):
file_size = os.path.getsize(output_file)
print(f"\n생성된 파일 크기: {file_size} bytes")
if file_size == 0:
raise Exception("생성된 파일이 비어있습니다.")
# 파일 재생
print("\n재생을 시작합니다...")
os.system(f"afplay {output_file}")
print("재생이 완료되었습니다.")
else:
raise Exception("파일이 생성되지 않았습니다.")
except Exception as e:
print(f"\n에러가 발생했습니다: {str(e)}")
if __name__ == "__main__":
asyncio.run(main())2번째 엑셀 단어장 이용 코드
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.2 # 한국어 1.2배속
# 사용 가능한 음성 목록 출력
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())결과와 배운 점
앞으로의 계획이 있다면 들려주세요.
향후 영어 단어장 업그레이드 계획
# 영어-한글 단어 학습 시스템 PRD
## 1. 제품 개요
### 1.1 제품 설명
- Edge TTS를 활용한 영어-한글 단어 학습 시스템
- 엑셀 파일에서 단어를 읽어와 음성으로 변환하여 학습을 지원하는 프로그램
### 1.2 목적
- 사용자가 영어 단어와 한글 의미를 청각적으로 학습할 수 있도록 지원
- 자연스러운 발음과 조절 가능한 속도로 효과적인 학습 환경 제공
## 2. 기능 요구사항
### 2.1 음성 설정
- 영어 음성: en-US-SteffanNeural
- 한글 음성: ko-KR-SunHiNeural
- 재생 속도: 영어 1.2배속, 한글 1.2배속
- 사용 가능한 모든 음성 목록 출력 기능
### 2.2 데이터 관리
- Excel 파일(.xlsx) 형식으로 단어 데이터 관리
- A열: 영어 단어
- B열: 한글 의미
- 기본 읽기 범위: A2:B11 (10개 단어)
### 2.3 음성 생성 및 재생
- 영어, 한글 각각 별도의 WAV 파일 생성
- 순차적 재생: 영어 단어 → 한글 의미
- 임시 파일 자동 삭제 기능
### 2.4 초기 설정 화면
#### 2.4.1 음성 설정
- 영어/한글 음성 선택
- 드롭다운 목록에서 선택
- 현재 설정된 음성 미리듣기 기능
- 기본값: 영어(en-US-SteffanNeural), 한글(ko-KR-SunHiNeural)
#### 2.4.2 재생 속도 설정
- 영어/한글 각각 독립적인 속도 조절
- 슬라이더로 0.5x ~ 2.0x 범위 조절
- 0.1x 단위로 조절 가능
- 기본값: 1.2x
#### 2.4.3 학습 설정
- 단어 표시 시간 설정
- 영어/한글 단어 표시 지속 시간
- 1초 ~ 5초 범위 설정
- 기본값: 2초
- 반복 횟수 설정
- 1회 ~ 5회
- 기본값: 1회
- 무작위 재생 여부
- ON/OFF 토글
- 기본값: OFF
#### 2.4.4 파일 설정
- Excel 파일 경로 설정
- 파일 탐색기 통한 선택
- 최근 사용 파일 목록 제공
- 학습 범위 설정
- 시작 행, 종료 행 입력
- 전체 선택 옵션
### 2.5 학습 화면
#### 2.5.1 상단 정보 표시
- 현재 진행 상황
- 전체 단어 수 대비 현재 위치
- 프로그레스 바로 표시
- 현재 설정 정보
- 선택된 음성, 재생 속도
- 반복 횟수, 무작위 재생 여부
#### 2.5.2 메인 학습 영역
- 단어 카드 형식 디스플레이
- 큰 폰트로 현재 단어 표시
- 영어 단어 → 한글 의미 순차 표시
- 발음 기호 표시 (IPA)
- 영어 단어 아래에 표시
- 토글 가능
#### 2.5.3 컨트롤 영역
- 재생 제어
- 일시정지/재생
- 이전/다음 단어
- 현재 단어 반복
- 음량 조절
- 영어/한글 개별 음량 조절
- 화면 모드 전환
- 라이트/다크 모드
- 전체화면 모드
#### 2.5.4 부가 정보 표시
- 단어 학습 이력
- 학습 날짜, 시간
- 반복 횟수
- 메모 기능
- 단어별 메모 입력/표시
- 즐겨찾기 표시
### 2.6 단축키 지원
- Space: 일시정지/재생
- →: 다음 단어
- ←: 이전 단어
- R: 현재 단어 반복
- F: 전체화면 전환
- M: 음소거
- N: 메모 입력
## 3. 기술 요구사항
### 3.1 필수 라이브러리
- edge_tts
- openpyxl
- asyncio
- wave
- pathlib
### 3.2 시스템 요구사항
- Python 3.x
- macOS (afplay 명령어 사용)
- 인터넷 연결 필수
## 4. 제약사항 및 한계
- Excel 파일이 프로그램과 동일한 디렉토리에 위치해야 함
- 인터넷 연결이 필요한 온라인 서비스
- macOS 환경에 최적화됨
## 5. 향후 개선사항
1. 크로스 플랫폼 지원 (Windows, Linux)
2. 사용자 정의 음성 및 속도 설정 기능
3. GUI 인터페이스 추가
4. 단어 학습 진도 관리 기능
5. 발음 평가 및 피드백 시스템
## 6. 성능 요구사항
- 단어당 처리 시간: 음성 생성 및 재생 포함 3초 이내
- 메모리 사용량: 임시 파일 즉시 삭제로 최소화
- 안정적인 인터넷 연결 필요
## 7. 보안 요구사항
- 임시 생성된 음성 파일 즉시 삭제
- 사용자 데이터는 로컬 Excel 파일로만 관리
## 8. UI/UX 요구사항
### 8.1 디자인 원칙
- 미니멀리즘 디자인 적용
- 직관적인 인터페이스
- 시각적 피로도 최소화
- 반응형 디자인 지원
### 8.2 접근성
- 고대비 모드 지원
- 키보드 네비게이션 지원
- 화면 읽기 프로그램 호환성
- 글자 크기 조절 기능
### 8.3 사용자 피드백
- 시각적 피드백
- 단어 전환 애니메이션
- 버튼 클릭 효과
- 청각적 피드백
- 버튼 클릭음
- 단어 전환음
- 진행 상태 표시
- 로딩 인디케이터
- 진행률 표시 도움 받은 글 (옵션)
참고한 지피터스 글이나 외부 사례를 알려주세요.