본문 바로가기

졸업 프로젝트

구글 코랩(Google Colab)에서 pyttsx3로 tts(text-to-speech) 변환한 mp3 파일 구글 드라이브에 저장하기

안녕하세요! 오늘은 파이썬에서 tts(text-to-speech) 기능을 지원해주는 pyttsx3를 이용하여 원하는 문장을 speech로 변환한 mp3 파일을 구글 코랩을 통해 구글 드라이브에 저장하는 방법을 배워보겠습니다

 

pyttsx3를 이용하면 mp3 파일을 바로 재생할 수 있는데 굳이 구글 드라이브에 올리는 이유는 무엇일까요? 예를 들면 안드로이드 앱에서도 구글 드라이브에 접근해서 mp3 파일을 재생할 수 있게 되기 때문에 flask를 통해 빌드한 API 서버와 안드로이드 앱을 간단하게 연결해줄 수 있습니다 (제 졸업 프로젝트에서도 이 방법을 사용하여 안드로이드 앱과 API 서버를 연결하였습니다!) 

 

 

 

 


from flask import Flask, request

!pip install flask-ngrok
!pip install flask-cors
from flask_cors import cross_origin

 

제가 프로젝트에서 flask를 사용하고 있으므로 flask를 사용하기 위해 필요한 것들을 기본적으로 위와 같이 설치해주었는데 위 과정은 pyttsx3를 이용하여 파일을 구글 드라이브에 저장할 때 필수적인 과정은 아닙니다!

 

 

pip install pyttsx3
import pyttsx3

 

우선 pip install pyttsx3를 입력하여 pyttsx3를 설치해준 뒤 pyttsx3를 import합니다 

 

 

 

 

from google.colab import drive
drive.mount('/content/drive')

 

구글 코랩에서는 이 코드를 입력하면 자신의 구글 드라이브에 있는 파일들에 쉽게 접근할 수 있습니다

위와 같이 입력한 후 셀을 실행하고 나서

 

 

 

Google Drive에 연결을 클릭하고 

 

구글 계정을 선택한 뒤

 

허용 버튼을 누르면 접근할 수 있습니다

만약 인증을 위해 키를 입력해야 할 경우 키를 복사하여 셀에 입력한 뒤 엔터 키를 누르면 됩니다

 

 

 

path="/content/drive/MyDrive"

 

우리는 나중에 pyttsx3의 결과물을 구글 드라이브에 저장하고 싶기 때문에 파일을 저장할 구글 드라이브의 경로를 path라는 전역 변수로 선언해주었습니다

 

 

!sudo apt-get update && sudo apt-get install espeak

 

나중에 OSError: libespeak.so.1: cannot open shared object file: No such file or directory가 발생하는 것을 방지하기 위해 입력해줍니다

 

 

 

 

from flask_ngrok import run_with_ngrok
app = Flask(__name__)
run_with_ngrok(app)

engine=pyttsx3.init() # 콜백 에러 방지하기 위함 

def text_to_speech(text, gender): # TTS
    voice_dict = {'Male': 0, 'Female': 1}
    code = voice_dict[gender]
    
    #engine=pyttsx3.init()
    engine.setProperty('rate', 150)  # 말하기 속도
    engine.setProperty('volume', 1)  # 볼륨 (min=0, MAX=1)
    voices = engine.getProperty('voices')
    engine.setProperty('voice', voices[code].id)

    engine.say(text)
    engine.save_to_file(text, path+"/sample.mp3")
    engine.runAndWait()

@app.route("/tts", methods=["GET"])
@cross_origin()
def homepage():
  text="아이스 아메리카노 하나 주세요"
  gender=request.args.get('voices')
  text_to_speech(text, gender)
  return path+"/sample.mp3"

if __name__ == "__main__":
    app.run()

 

text_to_speech 함수가 pyttsx3를 이용한 tts 기능이 구현되는 부분입니다

(engine=pyttsx3.init()을 전역으로 선언한 이유는 콜백에러를 방지하기 위함입니다)

 

mp3 파일을 저장하는 부분은 engine.save_to_file()입니다

save_to_file이 사용되는 사례들을 살펴보니 대부분 매개변수로 텍스트와 파일명을 받고 있어서 원하는 경로에 저장해줄 수 없는 건지 헷갈렸는데 결론은 save_to_file()을 원하는 경로에 저장해줄 수 있습니다!

제가 사용한 것처럼 첫 번째 매개변수에는 mp3로 변환해줄 텍스트를 담고 있는 변수명, 두 번째 매개변수에는 저장할 mp3 파일명을 포함한 구글 드라이브의 경로를 입력해주면 됩니다

 

 

또한 지금부터는 flask에만 해당되는 내용으로

GET 메소드를 이용하고 있으므로 파라미터를 query param 형태로 주고받아야 합니다 

그래서 셀을 실행한 뒤 주소가 배정되면 접속할 때 반드시 ~.ngrok.io/tts?voices=Male 이런 식으로 ? 뒤쪽으로 필요한 정보를 전달해준 주소로 접속해야 합니다!

 

 

 

 

 

 

모든 셀을 실행하면

주소에 접속하면 return 값으로 mp3 파일이 저장된 구글 드라이브의 경로가 나오게 되고 

 

 

 

 

구글 드라이브에도 정상적으로 저장된 것을 확인해볼 수 있습니다!