본문 바로가기

졸업 프로젝트

Google Cloud TTS 이용하기 + 배포 오류 해결

# 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

 

Google 클라우드 플랫폼

로그인 Google 클라우드 플랫폼으로 이동

accounts.google.com

이제 내 콘솔에서 확인 가능!

 

 

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

 

Cloud Text-to-Speech API  |  Google Cloud

Cloud Text-to-Speech API Stay organized with collections Save and categorize content based on your preferences. Synthesizes natural-sounding speech by applying powerful neural network models. Service: texttospeech.googleapis.com To call this service, we re

cloud.google.com

공식 문서 참조해서 가능하면 더 예쁘게 바꿔야겠다...

일단은 배포 후 프론트랑 잘 연결 되는지 확인하고 나중에 바꾸면 수정 예정ㅎ


# 배포

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 파일을 옮겨줬다.

 

배포 성공!^^^^^

tts~


# 회고

 

외부 API 사용은 늘 어렵다ㅜ

프론트에서 잘 될지도 모르고...

https://lee-lou2.notion.site/TTS-API-5e0c2fd16cc143e2a5323bbbb016ebbb

 

[찐 개발자용👍 장고] 거~의 무료! 초간단 TTS API 만드는 방법 | Notion

📗 요약

lee-lou2.notion.site

https://youngq.tistory.com/35

 

[Python] 구글 API로 문자 읽어주기 (1/2)

구글 API로 문자를 음성으로 구글 API 등록부터 입력한 문자를 음성으로 저장하는 방법을 정리합니다. Python코드는 다음 페이지에 있습니다. 구글 API 관리 : https://console.developers.google.com Google Cloud P

youngq.tistory.com

https://velog.io/@hnnynh/Github-Actions%EC%97%90%EC%84%9C-secrets.json-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0

 

[CI] Github Actions에서 secrets.json 생성하기

[Github Actions] django secrets.json 생성 트러블슈팅

velog.io

 

많은 도움이 된 블로그들...