ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AWS Polly 설명및 Unity와의 연동 (1)
    CS/졸업 프로젝트(Duk to Me) 2023. 12. 6. 21:07
    반응형

    https://www.cxtoday.com/data-analytics/amazon-polly-transforming-text-into-speech/

     

    ¶ AWS Polly란?

    AWS Polly는 아마존 웹 서비스(AWS)의 음성 합성 서비스로, 텍스트를 자연스러운 음성으로 변환해 주는 도구입니다. Polly를 사용하면 다양한 언어와 목소리로 텍스트를 음성으로 변환할 수 있습니다. 이 서비스는 텍스트를 음성으로 변환하는 고급 기술을 제공하여 음성 합성을 자동화하고 개선하는 데 도움이 됩니다.

    Polly는 API를 통해 손쉽게 통합할 수 있으며, 다양한 음성 속도, 톤, 언어 등의 매개 변수를 조절할 수 있습니다. 또한, Polly는 실시간 스트리밍 및 저장된 음성을 제공하여 응용 프로그램, 웹사이트, 모바일 애플리케이션 등에서 다양한 음성 기능을 구현할 수 있습니다.

    이를 통해 Polly는 음성 내비게이션, 음성 푸시 알림, 화자 변환, 문서 읽기 등 다양한 응용 분야에서 활용될 수 있습니다.

     


     

    ¶ Unity와 연동하기

     

    ① AWS 계정이 없다면 AWS 공식 웹사이트(https://aws.amazon.com)에 접속하여 AWS 사용을 위해 계정을 생성한다. 회원가입 페이지로 들어가서 입력해야 하는 정보들을 입력하여 회원가입을 진행한다. 또한 가입을 위해서는 Cloud 사용료 결제를 위한 카드 정보를 입력해야 한다.

     

     

    ② 회원가입을 완료하였으면, 로그인한다. 로그인을 하면 사용자 콘솔 페이지가 보일 것이다. 여기서 'polly'를 검색하여 오늘 우리가 사용할 AWS Polly를 잠시 살펴본다.

    사용자 콘솔페이지
    Amazon Polly 소개

     

    ③ 이제 Amazon Polly를 살펴봤으면 이제 Amazon Polly 사용을 위해서 Scet Access Key를 생성해야 한다. 상단 Navigation bar에서 내 계정으로 등록된 이름을 선택하면 Security Credentials(보안 자격 증명)이라는 메뉴로 이동한다. 그리고 Access Keys > Create Access Key로 이동하여 Check box를 Check해주고 Access Key를 생성한다. 이렇게 생선된 두개의 Access Key와 Secret Access Key는 후에 사용을 위해서 메모장에 복사하여 보관하는 것이 좋다. 특히 Scret Access Key는 생성한 당시에 한번밖에 볼 수 밖에 없어서 꼭 따로 저장하여 보관해야 한다. 여기까지 마쳤다면 완료하기 버튼을 눌러 생성을 마무리한다.

     

     

    ④ 이제 연동하려는 해당 Unity Project를 열어준다. Unity에 SDK와 DLL파일들을 이용하여 연동해줄 것이다. 필요한 zip 파일을 AWS link(https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/unity-special.html)에 접속하여 Version 정보를 확인하고 알맞은 Version으로 Download 받는다. (빨간박스 표시) Unity Project에 알맞은 Version 정보 확인은 Project Settings > Player > Configuration > Scripting Backend와 Api Compatibility Level을 확인하면 된다.

    Unity Project Versoin 정보 확인

     

     

    ⑤ 다시 SDK zip파일을 Download 받았으면 다시 이 link(https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/unity-special.html)로 돌아가서 이번에는 필요한 DLL파일을 Download 받는다.

     

     

    ⑥ DLL파일을 Download 받은 경로로 들어가보면 파일 확장자명이 nupkg파일로 되어있다. 이 파일 자체가 zip파일이므로 파일 확장자 명을 zip으로 바꾸어 파일 압축을 풀어주면 파일 안에 있는 내용들을 볼 수 있다.

     

     

    ⑦ 이제 위에서 Download 받았던 zip 파일 안에서 우리가 필요한 파일만 찾아보자. 먼저 위에서 압축풀었던 nupkg 폴더안에 lib > netstandard2.1 경로로 들어가서 dll 파일을 찾는다. 이게 우리가 필요한 dll 파일이다. 그리고 aws-sdk 폴더에서는 'AWSSDK.Polly.dll'과 'AWSDSK.Core.dll'을 찾는다. 이렇게 3개의 파일이 우리가 Unity 연동을 위해 사용할 필요한 파일들이다. 

     

     

    ⑧ 이제 Unity Project로 돌아가서 Assets 파일 경로 밑에 'Plugins'라는 새폴더를 만들어 주고 그 밑으로 위에서 찾은 3개의 파일을 넣어준다.

     

     

    ⑨ Assets 폴더 경로 밑에 SDK 파일들을 실행시킬 'TextToSpeech'라는 명의 C# Script 파일을 하나 생성해주고, Script 파일을 열어준다. (Script 파일을 열어줄 Editor는 원하는 대로 써도 좋다. 필자는 해당 Project에서 VS Code를 사용했다.)

     

    ⑩ 'TextToSpeech' C# Script 파일을 아래와 같은 내용으로 작성해준다.

    using System.Collections;
    using System.Collections.Generic;
    using Amazon;
    using Amazon.Polly;
    using Amazon.Polly.Model;
    using Amazon.Runtime;
    using UnityEngine;
    using System.IO;
    using UnityEngine.Networking;
    using System.Threading.Tasks;
    using OpenAI; // Make sure this namespace matches the one where ChatGPT is defined
    
    public class TextToSpeech : MonoBehaviour
    {
        [SerializeField] private AudioSource audioSource;
    
        public async void MakeAudioRequest(string npcResponse)
        {
            var credentials = new BasicAWSCredentials("...", "..."); // 따옴표 안에 Secret Key 입력하기
            var client = new AmazonPollyClient(credentials, RegionEndpoint.USEast1);
    
            // Access the npcResponse from ChatGPT
            // string npcResponse = FindObjectOfType<ChatGPT>().NpcResponse;
    
            var request = new SynthesizeSpeechRequest()
            {
                Text = npcResponse, // Use the npcResponse here
                Engine = Engine.Neural,
                VoiceId = VoiceId.Aria,
                OutputFormat = OutputFormat.Mp3
            };
    
            var response = await client.SynthesizeSpeechAsync(request);
    
            WriteIntoFile(response.AudioStream);
    
            using (var www = UnityWebRequestMultimedia.GetAudioClip($"{Application.persistentDataPath}/audio.mp3", AudioType.MPEG))
            {
                var UnityWebRequestAsyncOperation = www.SendWebRequest();
    
                while (!UnityWebRequestAsyncOperation.isDone) await Task.Yield();
    
                var clip = DownloadHandlerAudioClip.GetContent(www);
    
                audioSource.clip = clip;
                audioSource.Play();
            }
        }
    
        private void WriteIntoFile(Stream stream)
        {
            using (var fileStream = new FileStream($"{Application.persistentDataPath}/audio.mp3", FileMode.Create))
            {
                byte[] buffer = new byte[8 * 1024];
                int bytesRead;
    
                while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    fileStream.Write(buffer, 0, bytesRead);
                }
            }
        }
    }

     

     

    Reference

     

    반응형
Designed by Tistory.