# TTS(Text-To-Speech)
우리의 핵심..까지는 아니지만 기술 중 하나인 TTS 기술 구현하기.
원래는 이 부분을 AI로 잘..구현하려고 했는데 어렵기도 하고 시중에 나와있는 TTS API가 잘 되어있어서 이걸 이용하기로 했다.
Google TTS를 이용하기로 함.
잘 모를때는 그냥 type이나 pitch, speed 등의 voice 정보를 주면 프론트에서 변환하면 된다고 생각했지만...프론트는 보안상(?)의 이유로 안된다고 함.
그럼 내가 구현해야지..🥲 인터넷 많이 참고했다.
# Google API 사용하기
1. Google cloud plaform에 가입하고 프로젝트 만들고 사용할 라이브러리(API) 설치
이때 결제 정보 입력해야 하는데 유료 결제 활성화만 안하면 결제 안된다.
https://console.cloud.google.com/apis/dashboard?pli=1&project=dislodged-tts-project
이제 내 콘솔에서 확인 가능!
2. 프로젝트에 사용자 인증 정보 추가.
구글 API를 사용하려면 사용자 인증 정보를 추가해야 한다.
머 자기가 생각하는 프로젝트 선택 후 만들면 된다.
API키는 서비스 계정에 들어가서 만들면 됨.
처음 만들때 json 파일을 다운받을 수 있다.
3. Google SDK를 설치한다.
머 next누르고 동의하고 내 프로젝트 선택하면 알아서 된다.
4. 라이브러리 설치
가상환경에 pip install --upgrade google-cloud-texttospeech 설치
아까 키 발급할때 저장한 json 파일을 내 프로젝트에 넣는다.
json 경로를 환경변수에 넣고 view 만들기. 일단 임시로 views.py에 다 넣었는데 settings.py에 정리하고 경로도 나중에 수정 예정.
import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]="내 파일 경로"
# views.py
from django.http import HttpResponse
from rest_framework.views import APIView
from google.cloud import texttospeech
class TextToSpeechAPIView(APIView):
permission_classes = []
def get(self, request, *args, **kwargs):
text = request.query_params.get('text', None)
speed = int(request.query_params.get('speed', None))
pitch = int(request.query_params.get('pitch', None))
type = request.query_params.get('type', None)
if not text:
return HttpResponse("No text provided", status=400)
# Google TTS 처리
client = texttospeech.TextToSpeechClient()
synthesis_input = texttospeech.SynthesisInput(text=text)
voice = texttospeech.VoiceSelectionParams(
language_code="ko-KR", name=type # type인데....어케할까 일단 아는게 "ko-KR-Wavenet-D"
)
audio_config = texttospeech.AudioConfig(
audio_encoding=texttospeech.AudioEncoding.LINEAR16,
pitch=pitch, # 0, -20.0~20.0 사이만 가능
speaking_rate=speed # 1, 0.25~4.0 사이만 가능
)
response = client.synthesize_speech(
input=synthesis_input,
voice=voice,
audio_config=audio_config
)
# 음성 파일을 HttpResponse 객체로 반환
return HttpResponse(response.audio_content, content_type="audio/wav")
아직 수정이 필요하지만...
# urls.py
urlpatterns = [
path('', include(router.urls)),
path('tts/', TextToSpeechAPIView.as_view(), name='text_to_speech'),
]
이렇게 하고 테스트하기~
5. 테스트
플레이 버튼 누르면 음성이 나온다!
# 코드 리팩토링
일단 환경변수 경로는 상대경로로 바꾼 후 settins.py로 옮겨 주었다. 근데 이건 나중에 수정할 듯.
상위 폴더면 .. 현재 폴더면 . 하위 폴더면 /
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]="../../../dislodged-tts-project-11e592a89e01.json" # tts를 위한..경로 지정
# 배포할때는 꼬여서 local에서만 적는다.
https://cloud.google.com/text-to-speech/docs/reference/rest
공식 문서 참조해서 가능하면 더 예쁘게 바꿔야겠다...
일단은 배포 후 프론트랑 잘 연결 되는지 확인하고 나중에 바꾸면 수정 예정ㅎ
# 배포
googletts 라이브러리를 설치했더니 따라오는 라이브러리가 굉장히 많다...
그중 grpcio를 설치하다 마주친 FileNotFoundError: [Errno 2] No such file or directory: 'c++'오류
# DockerFile
# grpcio 설치를 위한...
RUN pip3 install --upgrade pip
RUN pip3 install --upgrade setuptools
RUN apk add g++
이렇게 해결했다. c++이 없다는데 g++를 설치해도 되네? 신기
google.auth.exceptions.DefaultCredentialsError: File (경로) was not found. 해결
또, 이전에 settings.py에서 설정한 환경변수는 Docker가 못찾길래 수정해주었다.
# docker-compose.yml
version: '3'
services:
db:
# 생략
web:
container_name: web
build: .
command: sh -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
environment:
MYSQL_ROOT_PASSWORD: mysql
DATABASE_NAME: mysql
DATABASE_USER: 'root'
DATABASE_PASSWORD: mysql
DATABASE_PORT: 3306
DATABASE_HOST: db
DJANGO_SETTINGS_MODULE: dislodged_project.settings.dev
GOOGLE_APPLICATION_CREDENTIALS: dislodged-tts-project-11e592a89e01.json
restart: always
ports:
- "8000:8000"
volumes:
- .:/app
depends_on:
- db
volumes:
app:
dbdata:
environment에 추가!
그리고 혹시 몰라 json 파일은 .gitignore에 넣어서 git에 commit되지 않도록 했다. (검색해보면 그리 중요한 정보는 없다는 사람도 있고...그래도 commit 하지 말라는 사람도 있고...난 불안해서 안올림)
따라서 github에는 없는 json 파일을 참조하기 위해 github secrets를 이용했다.
# deploy.yml
jobs:
build:
- name: create-json file
id: create-json
uses: jsdaniell/create-json@1.1.2
with:
name: "secrets.json"
json: ${{ secrets.GOOGLE_SERVICES_JSON }}
# docker-compose.prod.yml
version: '3'
services:
web:
container_name: web
build:
context: ./
dockerfile: Dockerfile
command: gunicorn dislodged_project.wsgi:application --bind 0.0.0.0:8000
environment:
DJANGO_SETTINGS_MODULE: dislodged_project.settings.prod
GOOGLE_APPLICATION_CREDENTIALS: secrets.json
env_file:
- .env
expose:
- 8000
volumes:
- static:/home/app/web/static
- media:/home/app/web/media
entrypoint:
- sh
- config/docker/entrypoint.prod.sh
github secrets에 GOOGLE_SERVICES_JSON이라는 이름으로 변수를 만들고 .json 파일을 옮겨줬다.
배포 성공!^^^^^
# 회고
외부 API 사용은 늘 어렵다ㅜ
프론트에서 잘 될지도 모르고...
https://lee-lou2.notion.site/TTS-API-5e0c2fd16cc143e2a5323bbbb016ebbb
많은 도움이 된 블로그들...
'졸업 프로젝트' 카테고리의 다른 글
mp3 파일 다루기 - S3 업로드&객체 가져오기 (1) (0) | 2024.04.09 |
---|---|
이미지 파일 다루기(AWS S3 이용) (0) | 2024.03.28 |
Signal을 이용하여 Profile 자동 생성하기 + RDS 접속 (0) | 2024.03.12 |
cors + 기능 수정하기 (0) | 2024.02.29 |
카테고리 기능 + 배포 (0) | 2024.02.18 |