Python에 Text-to-Speech API 사용

1. 개요

1215f38908082356.png

Text-to-Speech API를 사용하면 개발자가 인간과 유사한 음성을 생성할 수 있습니다. API는 텍스트를 WAV, MP3, Ogg Opus와 같은 오디오 형식으로 변환합니다. 또한 음성 합성 마크업 언어 (SSML) 입력을 지원하여 일시중지, 숫자, 날짜 및 시간 형식, 기타 발음 지침을 지정할 수 있습니다.

이 튜토리얼에서는 Python에서 Text-to-Speech API를 사용하는 방법을 중점적으로 살펴봅니다.

학습할 내용

  • 환경을 설정하는 방법
  • 지원되는 언어를 나열하는 방법
  • 사용 가능한 음성 나열 방법
  • 텍스트에서 오디오를 합성하는 방법

필요한 항목

  • Google Cloud 프로젝트
  • 브라우저(Chrome 또는 Firefox 등)
  • Python 사용에 관한 지식

설문조사

이 튜토리얼을 어떻게 사용하실 계획인가요?

읽기만 할 계획입니다 읽은 다음 연습 활동을 완료할 계획입니다

귀하의 Python 사용 경험이 어떤지 평가해 주세요.

초급 중급 고급

귀하의 Google Cloud 서비스 경험을 평가해 주세요.

<ph type="x-smartling-placeholder"></ph> 초보자 중급 숙련도

2. 설정 및 요건

자습형 환경 설정

  1. Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
  • 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔은 고유한 문자열을 자동으로 생성합니다. 일반적으로는 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로 PROJECT_ID로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 다른 임의 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다.
  • 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
  1. 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스 또는 프로젝트를 삭제하면 됩니다. Google Cloud 신규 사용자는 300달러(USD) 상당의 무료 체험판 프로그램에 참여할 수 있습니다.

Cloud Shell 시작

Google Cloud를 노트북에서 원격으로 실행할 수도 있지만 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Cloud Shell을 사용합니다.

Cloud Shell 활성화

  1. Cloud Console에서 Cloud Shell 활성화853e55310c205094.png를 클릭합니다.

3c1dabeca90e44e5.png

Cloud Shell을 처음 시작하는 경우에는 무엇이 있는지 설명하는 중간 화면이 표시됩니다. 중간 화면이 표시되면 계속을 클릭합니다.

92662c6a846a5c.png

Cloud Shell을 프로비저닝하고 연결하는 데 몇 분 정도만 걸립니다.

9f0e51b578fecce5.png

가상 머신에는 필요한 개발 도구가 모두 들어 있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저를 사용하여 수행할 수 있습니다.

Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 자신의 프로젝트 ID로 설정된 것을 확인할 수 있습니다.

  1. Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.
gcloud auth list

명령어 결과

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell에서 다음 명령어를 실행하여 gcloud 명령어가 프로젝트를 알고 있는지 확인합니다.
gcloud config list project

명령어 결과

[core]
project = <PROJECT_ID>

또는 다음 명령어로 설정할 수 있습니다.

gcloud config set project <PROJECT_ID>

명령어 결과

Updated property [core/project].

3. 환경 설정

Text-to-Speech API를 사용하려면 먼저 Cloud Shell에서 다음 명령어를 실행하여 API를 사용 설정합니다.

gcloud services enable texttospeech.googleapis.com

다음과 같은 결과를 확인할 수 있습니다.

Operation "operations/..." finished successfully.

이제 Text-to-Speech API를 사용할 수 있습니다.

홈 디렉터리로 이동합니다.

cd ~

Python 가상 환경을 만들어 종속 항목을 격리합니다.

virtualenv venv-texttospeech

가상 환경을 활성화합니다.

source venv-texttospeech/bin/activate

IPython 및 Text-to-Speech API 클라이언트 라이브러리를 설치합니다.

pip install ipython google-cloud-texttospeech

다음과 같은 결과를 확인할 수 있습니다.

...
Installing collected packages: ..., ipython, google-cloud-texttospeech
Successfully installed ... google-cloud-texttospeech-2.16.3 ...

이제 Text-to-Speech API 클라이언트 라이브러리를 사용할 준비가 되었습니다.

다음 단계에서는 이전 단계에서 설치한 대화형 Python 인터프리터인 IPython을 사용합니다. Cloud Shell에서 ipython를 실행하여 세션을 시작합니다.

ipython

다음과 같은 결과를 확인할 수 있습니다.

Python 3.9.2 (default, Feb 28 2021, 17:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.18.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

이제 첫 번째 요청을 하고 지원되는 언어를 나열할 준비가 되었습니다.

4. 지원되는 언어 목록

이 섹션에는 지원되는 모든 언어 목록이 표시됩니다.

다음 코드를 IPython 세션에 복사합니다.

from typing import Sequence

import google.cloud.texttospeech as tts


def unique_languages_from_voices(voices: Sequence[tts.Voice]):
    language_set = set()
    for voice in voices:
        for language_code in voice.language_codes:
            language_set.add(language_code)
    return language_set


def list_languages():
    client = tts.TextToSpeechClient()
    response = client.list_voices()
    languages = unique_languages_from_voices(response.voices)

    print(f" Languages: {len(languages)} ".center(60, "-"))
    for i, language in enumerate(sorted(languages)):
        print(f"{language:>10}", end="\n" if i % 5 == 4 else "")
        

잠시 코드를 살펴보고 list_voices 클라이언트 라이브러리 메서드를 사용하여 지원되는 언어 목록을 빌드하는 방법을 알아보세요.

함수 호출

list_languages()

다음과 같은 (또는 더 큰) 목록이 표시됩니다.

---------------------- Languages: 58 -----------------------
     af-ZA     am-ET     ar-XA     bg-BG     bn-IN
     ca-ES    cmn-CN    cmn-TW     cs-CZ     da-DK
     de-DE     el-GR     en-AU     en-GB     en-IN
     en-US     es-ES     es-US     eu-ES     fi-FI
    fil-PH     fr-CA     fr-FR     gl-ES     gu-IN
     he-IL     hi-IN     hu-HU     id-ID     is-IS
     it-IT     ja-JP     kn-IN     ko-KR     lt-LT
     lv-LV     ml-IN     mr-IN     ms-MY     nb-NO
     nl-BE     nl-NL     pa-IN     pl-PL     pt-BR
     pt-PT     ro-RO     ru-RU     sk-SK     sr-RS
     sv-SE     ta-IN     te-IN     th-TH     tr-TR
     uk-UA     vi-VN    yue-HK

이 목록에는 다음과 같은 58개의 언어와 방언이 표시됩니다.

  • 중국어 및 대만어,
  • 영어(오스트레일리아, 영국, 인도, 미국 영어)
  • 캐나다와 프랑스에서 온 프랑스어는
  • 브라질과 포르투갈에서 온 포르투갈어

이 목록은 고정되어 있지 않으며 새로운 목소리가 들어올 때마다 늘어납니다.

요약

이 단계를 통해 지원되는 언어를 나열할 수 있었습니다.

5. 사용 가능한 음성 나열

이 섹션에서는 다양한 언어로 제공되는 음성 목록을 확인할 수 있습니다.

다음 코드를 IPython 세션에 복사합니다.

import google.cloud.texttospeech as tts


def list_voices(language_code=None):
    client = tts.TextToSpeechClient()
    response = client.list_voices(language_code=language_code)
    voices = sorted(response.voices, key=lambda voice: voice.name)

    print(f" Voices: {len(voices)} ".center(60, "-"))
    for voice in voices:
        languages = ", ".join(voice.language_codes)
        name = voice.name
        gender = tts.SsmlVoiceGender(voice.ssml_gender).name
        rate = voice.natural_sample_rate_hertz
        print(f"{languages:<8} | {name:<24} | {gender:<8} | {rate:,} Hz")
        

잠시 코드를 살펴보고 클라이언트 라이브러리 메서드 list_voices(language_code)를 사용하여 특정 언어에 사용 가능한 음성을 나열하는 방법을 알아보세요.

이제 사용 가능한 독일어 음성 목록을 가져옵니다.

list_voices("de")

다음과 같은 결과를 확인할 수 있습니다.

------------------------ Voices: 20 ------------------------
de-DE    | de-DE-Neural2-A          | FEMALE   | 24,000 Hz
de-DE    | de-DE-Neural2-B          | MALE     | 24,000 Hz
...
de-DE    | de-DE-Standard-A         | FEMALE   | 24,000 Hz
de-DE    | de-DE-Standard-B         | MALE     | 24,000 Hz
...
de-DE    | de-DE-Studio-B           | MALE     | 24,000 Hz
de-DE    | de-DE-Studio-C           | FEMALE   | 24,000 Hz
de-DE    | de-DE-Wavenet-A          | FEMALE   | 24,000 Hz
de-DE    | de-DE-Wavenet-B          | MALE     | 24,000 Hz
...

표준, WaveNet, Neural2, Studio 음성뿐 아니라 여러 여성 및 남성 음성을 사용할 수 있습니다.

  • 표준 음성은 신호 처리 알고리즘에 의해 생성됩니다.
  • WaveNet, Neural2, Studio 음성은 머신러닝 모델에 의해 합성된 고품질 음성이며 더 자연스럽습니다.

이제 사용 가능한 영어 음성 목록을 가져옵니다.

list_voices("en")

다음과 같이 표시됩니다.

------------------------ Voices: 90 ------------------------
en-AU    | en-AU-Neural2-A          | FEMALE   | 24,000 Hz
...
en-AU    | en-AU-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-GB    | en-GB-Neural2-A          | FEMALE   | 24,000 Hz
...
en-GB    | en-GB-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-IN    | en-IN-Standard-A         | FEMALE   | 24,000 Hz
...
en-IN    | en-IN-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-US    | en-US-Neural2-A          | MALE     | 24,000 Hz
...
en-US    | en-US-News-K             | FEMALE   | 24,000 Hz
...
en-US    | en-US-Standard-A         | MALE     | 24,000 Hz
...
en-US    | en-US-Studio-M           | MALE     | 24,000 Hz
...
en-US    | en-US-Wavenet-A          | MALE     | 24,000 Hz
...

다양한 성별과 품질의 여러 음성 선택 외에도 오스트레일리아, 영국, 인도, 미국 영어 등 다양한 억양을 사용할 수 있습니다.

잠시 시간을 내어 선호하는 언어 및 방언 (또는 모든 언어)에서 사용할 수 있는 음성을 나열해 보세요.

list_voices("fr")
list_voices("pt")
list_voices()

요약

이 단계를 통해 사용 가능한 음성을 나열할 수 있었습니다. 지원되는 음성 및 언어에 대해 자세히 알아보세요.

6. 텍스트에서 오디오 합성

Text-to-Speech API를 사용하여 문자열을 오디오 데이터로 변환할 수 있습니다. 고유한 음성을 선택하거나 출력의 높낮이, 볼륨, 말하기 속도, 샘플링 레이트를 조정하는 등 다양한 방법으로 음성 합성 출력을 구성할 수 있습니다.

다음 코드를 IPython 세션에 복사합니다.

import google.cloud.texttospeech as tts


def text_to_wav(voice_name: str, text: str):
    language_code = "-".join(voice_name.split("-")[:2])
    text_input = tts.SynthesisInput(text=text)
    voice_params = tts.VoiceSelectionParams(
        language_code=language_code, name=voice_name
    )
    audio_config = tts.AudioConfig(audio_encoding=tts.AudioEncoding.LINEAR16)

    client = tts.TextToSpeechClient()
    response = client.synthesize_speech(
        input=text_input,
        voice=voice_params,
        audio_config=audio_config,
    )

    filename = f"{voice_name}.wav"
    with open(filename, "wb") as out:
        out.write(response.audio_content)
        print(f'Generated speech saved to "{filename}"')
        

잠시 코드를 살펴보고 synthesize_speech 클라이언트 라이브러리 메서드를 사용하여 오디오 데이터를 생성하고 wav 파일로 저장하는 방법을 알아보세요.

이제 몇 가지 억양으로 문장을 생성해 보겠습니다.

text_to_wav("en-AU-Neural2-A", "What is the temperature in Sydney?")
text_to_wav("en-GB-Neural2-B", "What is the temperature in London?")
text_to_wav("en-IN-Wavenet-C", "What is the temperature in Delhi?")
text_to_wav("en-US-Studio-O", "What is the temperature in New York?")
text_to_wav("fr-FR-Neural2-A", "Quelle est la température à Paris ?")
text_to_wav("fr-CA-Neural2-B", "Quelle est la température à Montréal ?")

다음과 같은 결과를 확인할 수 있습니다.

Generated speech saved to "en-AU-Neural2-A.wav"
Generated speech saved to "en-GB-Neural2-B.wav"
Generated speech saved to "en-IN-Wavenet-C.wav"
Generated speech saved to "en-US-Studio-O.wav"
Generated speech saved to "fr-FR-Neural2-A.wav"
Generated speech saved to "fr-CA-Neural2-B.wav"

생성된 모든 파일을 한 번에 다운로드하려면 Python 환경에서 다음 Cloud Shell 명령어를 사용하면 됩니다.

!cloudshell download *.wav

유효성을 검사하면 브라우저에서 파일을 다운로드합니다.

44382e3b7a3314b0.png 4dbccf007cd73b91.png

각 파일을 열고 결과를 듣습니다.

요약

이 단계에서는 Text-to-Speech API를 사용하여 문장을 오디오 wav 파일로 변환할 수 있었습니다. 음성 오디오 파일 만들기에 관해 자세히 알아보세요.

7. 축하합니다.

1215f38908082356.png

Python으로 Text-to-Speech API를 사용하여 사람과 비슷한 음성을 생성하는 방법을 알아봤습니다.

삭제

Cloud Shell에서 개발 환경을 삭제하려면 다음 안내를 따르세요.

  • 아직 IPython 세션에 있다면 셸로 돌아갑니다. exit
  • Python 가상 환경 사용 중지: deactivate
  • 가상 환경 폴더 삭제: cd ~ ; rm -rf ./venv-texttospeech

Google Cloud 프로젝트를 삭제하려면 Cloud Shell에서 다음 안내를 따르세요.

  • 현재 프로젝트 ID를 가져옵니다. PROJECT_ID=$(gcloud config get-value core/project)
  • 삭제하려는 프로젝트가 맞는지 확인합니다. echo $PROJECT_ID
  • 프로젝트 삭제: gcloud projects delete $PROJECT_ID

자세히 알아보기

라이선스

이 작업물은 Creative Commons Attribution 2.0 일반 라이선스에 따라 사용이 허가되었습니다.