파이썬 EdgeTTS 영어 단어장 (1차) 엑셀 단어장을 동영상 단어장으로

소개

  • EdgeTTS로 영어 음성 단어장 만들기, 4차 사례에서 wav 파일 재생이 성공

  • 이제는 개인별 엑셀 영어 단어장을 읽어주는 기능을 구현.

  • 단어 내용이 커서 터미날 화면에 표시 되면서 영어 / 한글 음성을 재생

진행 방법

어떤 도구를 사용했고, 어떻게 활용하셨나요?

  • 커서에서 클로드 3.5버젼 에이젼트 기능을 사용

  • 엑셀로 영어 단어장 준비

  1. 커서에서 샘플 문장 대신 엑셀 파일의 영어 단어 및 한글뜻을 읽게 함

    1. 엑셀 단어장

      한국어 사전 - 스크린샷
    2. 커서에서 엑셀 파일명과 단어 범위를 알려주고

      한국 프로그램의 스크린샷
      한국어 텍스트가 있는 검은 화면
  2. 엑셀 파일과 범위를 지정, 한번에 성공적으로 실행

    1. 파이썬 코드 첫 부분

      컴퓨터에 있는 코드 편집기의 스크린샷
    2. 음성 재생 및 터미날 표시 내용

  3. 음성 속도가 너무 늦어서 음성 배속 기능을 추가

    1. 영어는 1.2배속, 한국어는 1.5배속

    2. 엑셀 파일명을 현재 폴더에 상대경로 입력 : './words.xls'

      한국어 프로그램 스크린샷

  4. 터미날 로깅 내용 재구성

    1. 영어 / 한글 음성 모델, 영어/ 한국어 재생속도

    2. 단어 번호, 영어 단어, 한글 뜻 표시

    3. 단어별 소요시간 파악을 위해 음성 재생 시간 표시

      1. 로깅 시간을 보면 한단어당 5초 정도 소요

Tip: 사용한 프롬프트 전문을 꼭 포함하고, 내용을 짧게 소개해 주세요.

Tip: 활용 이미지나 캡처 화면을 꼭 남겨주세요.

Tip: 코드 전문은 코드블록에 감싸서 작성해주세요. ( / 을 눌러 '코드 블록'을 선택)

결과와 배운 점

배운 점과 나만의 꿀팁을 알려주세요.

과정 중에 어떤 시행착오를 겪었나요?

앞으로의 계획이 있다면 들려주세요.

  • 현재는 음성을 재생하면서 커서 화면 하단 터미날 부분에 엑셀 문장이 표시되고 있음

  • 터미날 화면은 텍스트 폰트 사이즈나 가독성 측면에서 부족하므로 별로 화면 사용

  • 다음차는

    • 초기 화면을 먼저 표시하고 다양한 설정을 선택하는 기능 추가

      • 단어 범위, 목소리 모델 선택, 영어-한글 음성 간격, 다음 단어 간격, 음성 배속

    • 학습화면도 별도로 표시해서 시각 및 청각을 동시 활용하게

  • https://youtu.be/ABIY7EYWICs?si=CgPCg4R9eQc6yZZq

도움 받은 글 (옵션)

https://han.gl/JszkV

파이썬 코드

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())

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

👉 이 게시글도 읽어보세요