Cursor 파이썬 입코딩, 고품질 음성 EdgeTTS 영어 단어장 사례

소개

비손실 압축방식이며 자연스러운 목소리를 만들어주는 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: 코드 전문은 코드블록에 감싸서 작성해주세요. ( / 을 눌러 '코드 블록'을 선택)

https://han.gl/JszkV

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 사용자 피드백
- 시각적 피드백
  - 단어 전환 애니메이션
  - 버튼 클릭 효과
- 청각적 피드백
  - 버튼 클릭음
  - 단어 전환음
- 진행 상태 표시
  - 로딩 인디케이터
  - 진행률 표시 

도움 받은 글 (옵션)

참고한 지피터스 글이나 외부 사례를 알려주세요.

https://han.gl/JszkV

1

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요