라즈베리 파이에서 google cloud api 사용기 - 1

2022. 8. 4. 12:27라즈베리파이

학교 캡스톤 디자인 제한 사항이

1. 라즈베리를 사용할 것.
2. 언어는 python을 쓸 것.

이 두 개였는데, 주제로 라즈베리 파이에서 google cloud api 중 클라이언트 부분만 건드리면 되는 아주 god-like API인 texttospeech를 소개하고자 한다.

https://cloud.google.com/text-to-speech

 

Text-to-Speech: 생동감 있는 음성 합성  |  Google Cloud

Google의 머신러닝 기술에 기반한 API를 통해 40개가 넘는 언어 및 방언을 지원하는 220여 개의 자연스러운 음성으로 텍스트를 변환합니다.

cloud.google.com

 

문서에 업데이트 되어있는 내용만 따라가면 누구나 만들 수 있지만, 내 전공이 소프트웨어 관련이 아니기 때문에 다들 익숙하지 않음에서 오는 어려움이 있는 것 같았다.

 

그 뿐만 아니라 라즈베리파이 OS를 32bit로 설치해서 arm프로세서에서 그냥 에러를 뿜어내서 정말 고생고생해서 나도 익숙해졌기 때문에 그 팁을 공유해보고자 한다.

 

 Text-to-Speech API는 뭘 할 수 있나요?

문서에 들어가면 바로 데모를 확인할 수 있지만, 파파고나 구글 번역기에 있는 음성 재생 버튼 처럼 텍스트를 음성형태로 출력할 수 있다.

 

첫눈에 느낀 섬띵 누~ 아카이빙 블로그에서 배워봐요!

 

우리 팀은 한술 더 떠서 아날로그 텍스트를 카메라로 읽은 뒤에 pytesseract로 string을 치환한 뒤, 그걸 이 tts나 혹은 우리가 직접 만든 우리 목소리의 tts로 읽어주는 걸 목표로 한다.

 

일단 먼저 테스트를 해보자!

 

1. 클라이언트 라이브러리 설치

pip install --upgrade google-cloud-texttospeech

 

만약 이걸 실행했는데 glibc 2.33이 없다거나 하는 오류가 일어난다거나 했다면, glibc를 설치하기 위해 노력하지 않아도 됨을 알려주고 싶다. 그건 십중팔구 OS의 비트가 맞지 않음이 확실하다.

 

처음에 라즈베리파이 OS를 32bit로 설치했는데 opencv도 pytesseract도 google tts도 어느것 하나 제대로 설치되지 않았다. 이유는 모든 라이브러리가 64bit를 기준으로 설계 되었음이 분명하다. OS를 밀고나니 제대로 동작하는 걸 확인할 수 있었다.

 

또, 웬만하면 venv 환경에서 하는 걸 추천하고 싶다. venv란 문자 그대로 python 개발 가상환경을 구축해줘서 딱 그 프로젝트에 맞는 패키지가 설치된 걸 확인 할 수 있다!

 

Linux 환경(라즈베리파이 OS)에서 venv 설정

cd your-project
python3 -m venv env
source env/bin/activate

 

순서는 가상환경 venv를 먼저 실행 시킨 뒤에 google-cloud-texttospeech를 설치해야한다.

 

2. 콘솔 설정

서비스 계정을 만듭니다.
  1. 콘솔에서 서비스 계정 만들기 페이지로 이동합니다.서비스 계정 만들기로 이동
  2. 프로젝트를 선택합니다.
  3. 서비스 계정 이름 필드에 이름을 입력합니다. 콘솔은 이 이름을 기반으로 서비스 계정 ID 필드를 채웁니다.
  4. 서비스 계정 설명 필드에 설명을 입력합니다. 예를 들면 Service account for quickstart입니다.
  5. 만들고 계속하기를 클릭합니다.
  6. 프로젝트에 대한 액세스 권한을 제공하려면 서비스 계정에 프로젝트 > 소유자 역할을 부여합니다.역할을 추가하려면  다른 역할 추가를 클릭하고 각 역할을 추가합니다.참고: 역할 필드는 서비스 계정이 프로젝트에서 액세스할 수 있는 리소스에 영향을 줍니다. 이러한 역할을 취소하거나 나중에 추가 역할을 부여할 수 있습니다. 프로덕션 환경에서는 소유자, 편집자 또는 뷰어 역할을 부여하지 마세요. 대신 요구사항을 충족하는 사전 정의된 역할 또는 커스텀 역할을 부여합니다.
  7. 역할 선택 목록에서 역할을 선택합니다.
  8. 계속을 클릭합니다.
  9. 완료를 클릭하여 서비스 계정 만들기를 마칩니다.
  10. 브라우저 창을 닫지 마세요. 다음 단계에서 사용합니다.
서비스 계정 키 만들기
  1. 콘솔에서 만든 서비스 계정의 이메일 주소를 클릭합니다.
  2. 를 클릭합니다.
  3. 키 추가를 클릭한 후 새 키 만들기를 클릭합니다.
  4. 만들기를 클릭합니다. JSON 키 파일이 컴퓨터에 다운로드됩니다.
  5. 닫기를 클릭합니다.

이건 정말 공식문서 그대로 하면 된다.

그나마 같이 보면 좋을 건 다른 로컬 환경에서 프로젝트를 구동할 때 키를 따로 발급받아야되는데 그 때마다 그림처럼 새로 발급받고 넣어주면 편하다는거?

새 키를 생성할 때마다 자동으로 json 파일이 다운받아지니 정말 편하다.

 

2-1. 환경변수 설정

private key가 담긴 json 파일을 받았으니 다음은 우리가 클라이언트 측에서 프로젝트를 실행할 때 유효한 클라이언트인지 확인하는 작업에서 써주면 되겠다. 받아놓은 json 파일의 경로를 환경변수로 설정해줘야한다.

 

방법은 두 가지가 있다.

 

1. 매번 세션에서 선언해주는 방식

export GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"

얘를 매번 스크립트 실행전에 매번 넣어준다. 당연히 저 KEY_PATH는 여러분들의 json 파일 경로이다.

 

2. 시스템에 환경변수로 넣어주는 방식

// bashrc를 켜서 설정을 본다.
sudo ~/.bashrc

//맨 아래로 가서 이걸 넣어준다. 당연히 경로는 여러분들껄로 바꿔줘야한다.
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

//변경된 bash를 적용시킨다.
source ~/.bashrc

 

이렇게 해주면 이제 더이상 세션마다 저걸 쳐줄 필요가 없다!

 

3. 대망의 클라이언트

"""Synthesizes speech from the input string of text or ssml.
Make sure to be working in a virtual environment.

Note: ssml must be well-formed according to:
    https://www.w3.org/TR/speech-synthesis/
"""
from google.cloud import texttospeech

# Instantiates a client
client = texttospeech.TextToSpeechClient()

# Set the text input to be synthesized
synthesis_input = texttospeech.SynthesisInput(text="Hello, World!")

# Build the voice request, select the language code ("en-US") and the ssml
# voice gender ("neutral")
voice = texttospeech.VoiceSelectionParams(
    language_code="en-US", ssml_gender=texttospeech.SsmlVoiceGender.NEUTRAL
)

# Select the type of audio file you want returned
audio_config = texttospeech.AudioConfig(
    audio_encoding=texttospeech.AudioEncoding.MP3
)

# Perform the text-to-speech request on the text input with the selected
# voice parameters and audio file type
response = client.synthesize_speech(
    input=synthesis_input, voice=voice, audio_config=audio_config
)

# The response's audio_content is binary.
with open("output.mp3", "wb") as out:
    # Write the response to the output file.
    out.write(response.audio_content)
    print('Audio content written to file "output.mp3"')

 

파이썬은 참 이게 좋다. 영어 읽듯이 그냥 너무 잘 읽힌다.

중간에 VoiceSelectionParams의 설정을 통해 언어와 성별을 입맛대로 골라줄 수 있다.(한글이면 "ko-KR"이다.)

여기에서 다양한 설정을 확인할 수 있다. 원하는 국적, 입맛대로 가져다 쓰면 되겠다.

 

https://cloud.google.com/text-to-speech/docs/voices

 

지원되는 음성 및 언어  |  Cloud Text-to-Speech 문서  |  Google Cloud

의견 보내기 지원되는 음성 및 언어 Text-to-Speech는 다음과 같은 음성을 제공합니다. 이 목록에는 표준, WaveNet, Neural2 음성이 포함됩니다. WaveNet 및 Neural2 음성은 가격이 다른 고품질 음성입니다. 이

cloud.google.com

 

자! 여기까지 따라왔다면 일단 테스트는 해냈다.

그리고 생각보다 openCV나 pytesseract 예제 써보는게 쉬워서 (물론 성능은 보장하지 않지만..)

다 할만한 것 같다.

다만, 이걸 전부 엮어서 shell script로 한 흐름으로 만들고 분기처리하는게 뭔가 기대된다.

그럼 이만!