파이썬으로 AI 음성합성하기

Amazon Polly 와 파이썬으로 음성을 합성하는 방법을 알아보겠습니다.

 

우선 AWS에서 IAM사용자를 만들고 액세스키까지는 만들어야 합니다.

 

이 부분은 AWS 문서를 찾아보면 온라인에서 상세한 자료를 찾을 수 있습니다.

 

읽어야 할 내용이 많긴하지만 구글에 검색하면 한글 공식문서가 많아서 조금 노력하면 어렵지 않게 만들 수 있습니다.

 

다음은 AWS CLI 를 설치합니다. 아래 링크에서 OS를 선택하여 설치할 수 있습니다.

 

 

AWS 명령줄 인터페이스

aws-shell은 명령줄 셸 프로그램으로서, AWS 명령줄 인터페이스를 사용하는 새로운 사용자와 고급 사용자 모두에게 도움이 되는 편의 기능 및 생산성 기능을 제공합니다. 주요 기능은 다음과 같습

aws.amazon.com

AWS CLI 가 설치되었으면 API 액세스키를 설정합니다. 명령모드에서 다음을 입력합니다. aws configure

액세스키, 시크릿 액세스키 그리고 리전이 필요합니다. IAM 사용자의 액세스키를 입력합니다.

 

위 이미지는 키들이 이미 설정이 된 경우 입니다. output format 은 json 으로 합니다.

 

윈도우10 기준으로 유저폴더\.aws 안에 credentials config 파일에 profile 이 저장됩니다. 여러개의 profile 을 운영하는 것도 가능합니다. 이것은 default 값입니다.

 

작동하는지 확인을 하려면 명령모드에서 아래와 같이 입력합니다.

aws polly synthesize-speech  --text-type ssml --text "<speak>Hello World</speak>"  --output-format mp3  --voice-id Joanna  speech.mp3

접속이 성공하면 speech.mp3 파일이 생성됩니다. 실행하면 음성합성을 들을 수 있습니다.

 

파이썬 코드

파이썬 코드를 짜보겠습니다. mp3 로 저장해서 들어도 되는데 pygame 에 믹서로 바로 출력할 수 있으므로 pygame의 mixer 모듈을 사용합니다. pip install pygame 설치합니다.

 

boto3 는 AWS CLI를 작동시키는 모듈입니다. pip install boto3 설치합니다.

 

import boto3
from pygame import mixer
import os

polly = boto3.client('polly')

text = "<speak>Hi<break time='300ms'/> I am Matthew.<break time='500ms'/> It is nice to talk to you. I hope everything is well</speak>"

spoken_text = polly.synthesize_speech(TextType='ssml', Text=text, OutputFormat='mp3', VoiceId='Matthew')


with open('output.mp3', 'wb') as f:
    f.write(spoken_text['AudioStream'].read())
    f.close()

mixer.init()
mixer.music.load('output.mp3')
mixer.music.play()

while mixer.music.get_busy() == True:
    pass

mixer.quit()
os.remove('output.mp3')

 

polly.synthesize_speech 에서 TextType 을 ssml 로 놓으면 태그를 사용할 수 있습니다.

 

polly ssml 로 검색하면 AWS 에 문서화가 잘되어 있습니다. ssml 은 음성을 좀 더 생동감있게 만들기 위해 사용하는 태그입니다.

 

AWS polly 서비스를 사용하면 VoiceId를 바꿀 수 있습니다.

 

영어권은 미국, 영국 등 열명이 넘는 다양한 음성을 선택할 수 있는데 아쉽게도 한국어는 여성 한명 'Seoyeon' 만 사용할 수 있습니다.

 

text = "<speak>안녕하세요?<break time='300ms'/>저는 서연입니다<break time='500ms'/>아마존 폴리의 인공지능으로 만든 음성이에요</speak>"

spoken_text = polly.synthesize_speech(TextType='ssml', Text=text, OutputFormat='mp3', VoiceId='Seoyeon')

 

합성된 음성파일입니다. 밋밋하지만 ssml 을 사용하면 좀 더 인간같은 음성을 합성할 수 있습니다.

 

output.mp3
0.04MB

 

요약

AWS 의 Polly API는 문자 100만 건까지 무료이고 추가로 사용한 만큼 비용이 들기 때문에 사용횟수를 모니터링 합니다. 또 자신의 액세스키와 시크릿 액세스키는 절대 노출하지 않도록 합니다.

 

깃허브 등에 올린 소스코드에 액세스키가 노출되어 누군가 자신의 AWS계정으로 비트코인을 채굴한다던가 하는 피해사례가 많이 있습니다.

 

이런 위험이 많아서 액세스키를 만들때는 IAM 사용자를 사용해야 합니다. 루트계정은 위험이 너무 크구요. 노출이 되었다 싶어서 불안하면 재빨리 액세스키를 삭제하고 새로운 키로 변경하는 것이 좋습니다.

 

 

polly 를 출시한지가 꽤 됐는데 한국어는 처음과 그대로인 여성 한명이라서 좀 아쉽긴 합니다. 그렇지만 영어 성능은 해외에서도 꽤 인정한 부분입니다. polly 가 다른 것들과 다른 부분은 ssml 을 사용해서 lifelike (살아있는 것 같은) 음성을 합성한다는 부분인데요. 음성전문가들은 polly와 별도의 프로그램을 사용해서 더 생동감있는 음성을 만들기도 합니다.

 

아무리 그래도 polly의 음성합성은 아직까지 기계음의 한계를 벗어나진 못하는 것 같은데요.

 

국내서비스로는 클로바더빙이 좀 더 자연스럽습니다. 성인남녀와 어린이남녀 캐릭터로 4명이고 가입해서 사용하면 웹, 유튜브 등의 컨텐츠에 사용할 수 있습니다. 무료서비스는 더빙 글자수 3000개와 다운로드 10회 제한이 있으니 더 많이 사용하려면 유료 서비스를 사용해야합니다.

 

 

앞으로 음성합성 API가 좀더 인간처럼 느껴지고 종류가 다양해질 날이 머지 않은 것 같습니다.

 

이 기술에 대하여 그런 이야기를 하는데요. AI가 좀더 인간처럼 보이는 등 여러가지 장점이 있습니다.

 

그런데 AI가 아니라 사람에게 큰 의미가 있다고 봅니다.

 

신체적 장애가 있어 말을 못하시는 분들이 음성합성 기술로 세상과 음성으로 소통할 수 있는 날이 올 것이다. 그러면 큰 의미가 있을 것 같습니다.

 

나만의 또다른 음성을 가지기 위해서는 목소리의 커스터마이징과 감정표현이 다양해져야 할 것인데 이 부분은 현재 AI음성합성을 연구하시는 분들에게 달려있습니다.

 

목소리를 결정하는 것도 과학이라고 하니까 못할 일은 아닌 것 같습니다.

 

공유하기

facebook twitter kakaoTalk kakaostory naver band