python

"Python으로 텍스트를 음성으로 변환하기: gTTS와 ffmpeg 사용법"

알세지 2024. 6. 30. 23:30
이 코드는 사용자가 입력한 텍스트를 음성으로 변환하여 mp3 파일로 저장하는 프로그램입니다. 프로그램은 gTTS 라이브러리를 사용하여 텍스트를 음성으로 변환하고, ffmpeg를 사용하여 음성 파일의 속도를 조정할 수 있습니다. 아래는 코드의 주요 부분에 대한 분석입니다.

코드 설명
▶ ffmpeg 설치 확인: check_ffmpeg_installation() 함수는 ffmpeg의 설치 여부를 확인하고 그 결과를 사용자에게 알립니다.
▶ 디렉토리 생성: ensure_dir_exists(save_directory) 함수는 음성 파일을 저장할 디렉토리가 존재하지 않을 경우 생성합니다.
▶ 사용자 입력 처리: 사용자가 텍스트를 입력하고, 'end'를 입력할 때까지 반복합니다. 입력된 텍스트는 리스트에 저장됩니다.
▶ 음성 변환 및 저장: speak_with_gtts() 함수는 입력된 텍스트를 음성 파일로 저장하고, 필요한 경우 속도를 조정합니다.

 

■ 주요 모듈 및 설정

1. 모듈 임포트

import os
from gtts import gTTS
import shutil
import subprocess
import uuid

 

2. FFMPEG 경로 설정

FFMPEG_PATH = "/opt/homebrew/bin/ffmpeg"

3. 저장 디렉토리 설정

save_directory = os.path.join(os.path.expanduser("~"), "Desktop", "espeak_outputs")

 

 함수 설명

1. 디렉토리 존재 확인 및 생성 함수

def ensure_dir_exists(directory):
	if not os.path.exists(directory):
		os.makedirs(directory)
		print(f"Created directory: {directory}")

 


2. ffmpeg 설치 확인 함수

def check_ffmpeg_installation():
	global FFMPEG_PATH
	if not os.path.exists(FFMPEG_PATH):
		print(f"ffmpeg not found at {FFMPEG_PATH}")
		ffmpeg_in_path = shutil.which("ffmpeg")
		if (ffmpeg_in_path):
			FFMPEG_PATH = ffmpeg_in_path
			print(f"Found ffmpeg in PATH: {FFMPEG_PATH}")
		else:
			print("ffmpeg not found in PATH. Please install ffmpeg or update the FFMPEG_PATH.")
			return False
	return True

 

3. 속도 조정 함수

def change_speed(input_file, output_file, speed):
    command = f'{FFMPEG_PATH} -i "{input_file}" -filter:a "atempo={speed}" "{output_file}"'
    print(f"Executing command: {command}")
    try:
        result = subprocess.run(command, shell=True, check=True, capture_output=True, text=True)
        print(f"Changed speed of {input_file} and saved as {output_file}")
    except subprocess.CalledProcessError as e:
        print(f"Error occurred during speed change: {e}")
        print(f"Error output: {e.stderr}")

 

4. 텍스트를 음성으로 변환하고 저장하는 함수

def speak_with_gtts(text, output_file, lang='ko', speed=1.6):
    tts = gTTS(text=text, lang=lang)
    temp_mp3_file = os.path.join(save_directory, "temp_" + output_file)
    final_mp3_file = os.path.join(save_directory, output_file)
    tts.save(temp_mp3_file)
    print(f"Audio saved as {temp_mp3_file}")
    if speed != 1.0:
        change_speed(temp_mp3_file, final_mp3_file, speed)
        os.remove(temp_mp3_file)  # 임시 파일 삭제
    else:
        os.rename(temp_mp3_file, final_mp3_file)  # 속도 조정이 필요 없는 경우

 

■ 메인 함수

  • ffmpeg 설치 확인
  • 저장 디렉토리 존재 확인 및 생성
  • 사용자로부터 텍스트 입력 받기
  • 입력받은 텍스트를 음성 파일로 변환
def main():
    if not check_ffmpeg_installation():
        return

    ensure_dir_exists(save_directory)

    print("텍스트를 입력하세요. 종료하려면 'end'를 입력하세요.")
    test_cases = []
    while True:
        text = input("텍스트: ")
        if text.lower() == 'end':
            break
        output_file = f"{uuid.uuid4()}.mp3"
        lang = 'ko'
        speed = 1.6
        test_cases.append((text, output_file, lang, speed))

    for text, output_file, lang, speed in test_cases:
        speak_with_gtts(text, output_file, lang, speed)

if __name__ == "__main__":
    main()