티스토리 뷰
Amazon Polly를 이용해서 TTS를 만드는 간단한 셈플을 만들어 보도록 하겠습니다.
완성이되면 이런 화면에서 한글을 입력하고 폴리야~ 버튼을 클릭하면 설현(?) 목소리로 내용을 읽어 줍니다.
1. 준비
1) AWS를 이용하기 때문에 Amazon Web Service 계정이 필요합니다.
저도 없어서 새로 만들었습니다.
https://aws.amazon.com/ko/polly/
이 페이지를 상단에 무료 계정 생성하기 버튼을 클릭해서 계정을 만들면 됩니다.
2) 계정을 만들고 나면, IAM 관리자 및 계정을 만들어 주어야 합니다.
https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/getting-started_create-admin-group.html
이 페이지를 참고하셔서 IAM 계정을 생성하고, 그룹도 추가해 주시면 됩니다.
3) Polly 서비스를 사용하기 위해서 AccessKeyID와 SecretAccessKey가 필요합니다.
https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/id_credentials_access-keys.html
이 페이지를 참고하시면 만드실 수 있습니다.
2. 프로젝트 생성
Visual Stduio 2017를 실행하고, Windows Template Studio를 이용해서 단일 화면 프로젝트를 생성 했습니다.
3. NuGet Package 설치
AWSSDK.Core, AWSSDK.Polly 2개의 패키지를 선택해서 설치 합니다.
4. MainPage.xaml
<StackPanel Grid.Row="1" Grid.Column="1">
<TextBox Header="한글을 입력하세요" Text="{Binding InputText, Mode=TwoWay}"/>
<Button Content="폴리야" Command="{Binding TTSCommand}"/>
<MediaElement x:Name="MediaElement" RealTimePlayback="True">
<interactivity:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="MediaEnded">
<core:InvokeCommandAction Command="{Binding MediaEndedCommand}"/>
</core:EventTriggerBehavior>
<behaviors:MediaBehavior Stream="{Binding RandomAccessStream, Mode=TwoWay}"/>
</interactivity:Interaction.Behaviors>
</MediaElement>
</StackPanel>
일반적인 코드입니다. 여기서 사용된 MediaBehavior는 지난번에 공유했던 내용이라 설명은 생략 합니다.
내부 코드는 좀 변경이 되었으니 맨 아래 공유해드리는 소스를 참고 하시면 될 것 같습니다.
5. MainViewModel.cs
/// <summary>
/// TTS 커맨드 실행
/// </summary>
private async void ExecuteTTSCommand()
{
if (string.IsNullOrEmpty(InputText)) return;//폴리 클라이언트 생성
var pc = new AmazonPollyClient("AccessKeyID를 입력하세요", "SecretAccessKey를 입력하세요"
, RegionEndpoint.APNortheast2);//요청 생성
var sreq = new SynthesizeSpeechRequest
{
Text = $"<speak>{InputText}</speak>",
OutputFormat = OutputFormat.Mp3,
VoiceId = VoiceId.Seoyeon,
LanguageCode = "ko-KR",
TextType = TextType.Ssml
};InputText = string.Empty;
//서비스 요청
var sres = await pc.SynthesizeSpeechAsync(sreq);//서비스 요청 결과 확인
if (sres.HttpStatusCode != HttpStatusCode.OK)
return;//파일명 생성
var fileName = $@"{ApplicationData.Current.LocalFolder.Path}\{DateTime.Now:yyMMddhhmmss}.mp3";
//파일에 AudioStream 쓰기
using (var fileStream = File.Create(fileName))
{
sres.AudioStream.CopyTo(fileStream);
fileStream.Flush();
fileStream.Close();
}
//생성된 파일을 가져오기
var file = await StorageFile.GetFileFromPathAsync(fileName);
//파일을 열어서 RandomAccessStream 프로퍼티에 입력
RandomAccessStream = await file.OpenAsync(FileAccessMode.Read);//RandomAccessStream과 바인딩이 되어있는 MediaBehavior에서 MediaPlayer를 통해서 재생
}
리즌 종류는 여기서 확인하세용
https://docs.aws.amazon.com/ko_kr/general/latest/gr/rande.html
6. 다운 받은 셈플 보이스
7. 소스
https://github.com/kaki104/AWSSamples
'UWP & Windows App' 카테고리의 다른 글
Windows App SDK가 뭐에요? (0) | 2021.09.16 |
---|---|
Using Logger in UWP (0) | 2019.12.12 |
UWP 앱 개발자의 숙원 해결2 - Multi-Instance UWP App (0) | 2018.06.19 |
BroadFileSystemAccess - 2021/01/14 업데이트 (8) | 2018.05.31 |
harman/kardon INVOKE with Cortana AI 스피커 셋업 및 실행기 (0) | 2018.02.06 |
- Total
- Today
- Yesterday
- Windows 10
- Visual Studio 2022
- IOT
- .net 5.0
- LINQ
- #uwp
- Cross-platform
- .net
- uno platform
- uno-platform
- UWP
- visual studio 2019
- WPF
- ef core
- C#
- #prism
- Bot Framework
- ComboBox
- Behavior
- windows 11
- MVVM
- kiosk
- dotNETconf
- #MVVM
- #Windows Template Studio
- PRISM
- Build 2016
- Microsoft
- Always Encrypted
- XAML
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |