안녕하세요! 오늘은 파이썬에서 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 파일이 저장된 구글 드라이브의 경로가 나오게 되고
구글 드라이브에도 정상적으로 저장된 것을 확인해볼 수 있습니다!
'졸업 프로젝트' 카테고리의 다른 글
파이썬 Flask로 마이크에서 입력받은 음성을 텍스트로 띄우는 웹페이지 만들기 (7) | 2021.05.28 |
---|