본문 바로가기

Cloud/AWS

[AWS] Amazon Polly 한국어 서비스 지원

반응형

지난 포스팅에서  Naver Clova Speech Synthesis (CSS) 를 통한 Text To Speech 서비스에 대해 간략하게 알아보았습니다.

http://devstory.ibksplatform.com/2017/11/naver-clova-speech-synthesiscss-api.html

AWS 에서는 아직 한국어 서비스가 지원되지 않고 있었는데
16일부터 Amazon Polly 서비스가 한국어 읽기 서비스를  지원한하고 합니다.

Amazon Polly 는 AWS의 딥러닝 기반 TTS 서비스 로 2016년 처음 선을 보인 이후로
드디어  한국어 서비스를 지원하고 있습니다.


AWS 콘솔을 통해 Amazon Polly 에 접속해 보면
image
현재 Seoyeon (서연) 이라는 이름의 여성 음성 한가지를 지원 중입니다.


Naver 서비스와 조금 다른점은 API 콘솔을 통해서 바로 음성듣기 기능 테스트가 가능합니다.
첫인상은 네이버 CSS 서비스 보다 조금 더 자연스러운 느낌입니다.

스트리밍 방식을 사용하기 때문에 긴 텍스트를 한번에 입력해도 바로 음성재생 가능하다고 합니다.


추가적으로 SSML (Speech Synthesis Markup Language (SSML) Version 1.1, W3C Recommendation) 에 정의된 SSML 마크업 태그를 지원합니다.
image

지원되는 SSML 태그 형식을 활용하여 좀더 자연스럽운 말투나 효과 적용이 가능합니니다.


<speak>   // SSML태그 루트


<break>   // 스피치에서 일시 중지


<lang>    // 특정단어 및 구


<mark>    // 텍스트 내에 사용자 정의 태그 배치


<p>       // 텍스트 단락


<phoneme> // 음성발음 지정


<prosody> // 텍스트의 볼륨, 속도 및 음색을 제어


<s>       // 텍스트에서 문장을 나타냄 


<say-as>  // 텍스트 해석 방식 지정


<sub>     // 태그로 묶인 텍스트의 발음을 alias 속성의 발음으로 대체 


<w>       // 스피치의 단어 부분을 지정하여 단어 발음을 사용자 정의 


<amazon:effect name="whispered"> // 속삭임 음성

cs

SSML 태그관련 상세 사용방법은 아래 링크에서 확인가능 합니다.
http://docs.aws.amazon.com/ko_kr/polly/latest/dg/supported-ssml.html




Python을 통한 예제 소스를 테스트 해보고 싶다면 아래 예제 소스를
example.py에 저장하여 확인해 볼수 있습니다.


"""Getting Started Example for Python 2.7+/3.3+"""


from boto3 import Session


from botocore.exceptions import BotoCoreError, ClientError


from contextlib import closing


import os


 import sys


import subprocess


from tempfile import gettempdir


 


# Create a client using the credentials and region defined in the [adminuser]


# section of the AWS credentials file (~/.aws/credentials).


 session = Session(profile_name="adminuser")


 polly = session.client("polly")


 


try:


     # Request speech synthesis


     response = polly.synthesize_speech(Text="Hello world!", OutputFormat="mp3",


                                        VoiceId="Joanna")


 except (BotoCoreError, ClientError) as error:


     # The service returned an error, exit gracefully


     print(error)


     sys.exit(-1)


 


# Access the audio stream from the response


 if "AudioStream" in response:


     # Note: Closing the stream is important as the service throttles on the


     # number of parallel connections. Here we are using contextlib.closing to


     # ensure the close method of the stream object will be called automatically


     # at the end of the with statement's scope.


     with closing(response["AudioStream"]) as stream:


         output = os.path.join(gettempdir(), "speech.mp3")


 


        try:


             # Open a file for writing the output as a binary stream


             with open(output, "wb") as file:


                 file.write(stream.read())


         except IOError as error:


             # Could not write to file, exit gracefully


             print(error)


             sys.exit(-1)


 


else:


     # The response didn't contain audio data, exit gracefully


     print("Could not stream audio")


     sys.exit(-1)


 


# Play the audio using the platform's default player


 if sys.platform == "win32":


     os.startfile(output)


 else:


    # the following works on Mac and Linux. (Darwin = mac, xdg-open = linux).


     opener = "open" if sys.platform == "darwin" else "xdg-open"


 subprocess.call([opener, output])


 

cs


Amazon Polly 서비스는 현재 월 500만자 까지 무료로 사용이 가능하며
음성인식 서비스인 Amazon Lex 서비스도 곧 지원 예정라고 합니다.