티스토리 뷰

반응형

WPF프로그램 - Using Speech.Synthesis

프레임워크에는 기본적으로 System.Speech.Synthesis 과 System.Speech.Recognition 의 네임스페이스를 가지고 있습니다.

그럼 사용해 봅시다.

SDK에 보면 WPF용 Speech Sample 이 있습니다.
흔히 TTS라 불리는 예제 프로그램이지요. (텍스트로 친걸 음성으로 출력해주는)


Echo Textbox 버튼을 클릭하며 음성을 들을 수 있어요. Sample string에 있는 "Hello World"라고 외쳐 주겠죠?

Speaking rate 를 올리면 말하는 속도도 빨라지구요. Volume.도 마찬가지겠죠?

Say DateSay Time 버튼을 클릭하면 현재 날짜와 시간을 말해줍니다.
Say Name 버튼은 컴퓨터이름을 말해주지요.

자 그럼 XAML 파일을 자세히 살펴 봅시다.
그야말로 초간단 소스입니다.
텍스트박스 컨트롤은 MyWindow.xaml파일에 정의되어 있어요.

<!-- Text to display -->
<
Label Grid.Column="0" Grid.Row="0">Sample string:</Label>
<
TextBox
  Grid.Column="1" Grid.Row="0"
  HorizontalAlignment="Left"
  TextWrapping="Wrap"
  AcceptsReturn="True"
  VerticalScrollBarVisibility="Visible"
  FontSize="12"
  Height="100"
  Width="400"
  Name="TextToDisplay">Hello, world!</TextBox>


볼륨 슬라이드 컨트롤은 아래와 같아요.

<!-- Volume property: 0 to 100 -->
<
Label Grid.Column="0" Grid.Row="1">Volume (%):</Label>
<
Slider Name="VolumeSlider" Grid.Column="1" Grid.Row="1" Value="50" Minimum="0" Maximum="100" TickFrequency="5" ValueChanged="VolumeChanged"/>


이건 목소리 비율 조절하던 컨트롤이지요.
<!-- Rate property: -10 to 10 (adjust to reasonable range of -5 to 7) -->
<
Label Grid.Column="0" Grid.Row="2">Speaking rate:</Label>
<
Slider Name="RateSlider" Grid.Column="1" Grid.Row="2" Value="-1" Minimum="-5" Maximum="7" TickFrequency="1" ValueChanged="RateChanged"/>

음성 출력에 쓰이는 버튼 4개 세트는 아래와 같이 구성되어 있습니다.

<!-- Buttons -->
<
Button Grid.Column="1" Grid.Row="3" Click="ButtonEchoOnClick">Echo Textbox</Button
>
<
Button Grid.Column="1" Grid.Row="4" Click="ButtonDateOnClick">Say Date</Button
>
<
Button Grid.Column="1" Grid.Row="5" Click="ButtonTimeOnClick">Say Time</Button
>
<
Button Grid.Column="1" Grid.Row="6" Click="ButtonNameOnClick">Say Name</Button>

그럼 CS코드를 봅시다.
cs코드는 같은 파일명에 .cs가 붙지요. MyWindow.xaml.cs
기본적으로 System.Speech.Synthesis: 이 네임스페이스를 사용합니다.

using System;
using
System.Windows;
using
System.Windows.Controls;
using
System.Speech.Synthesis;

MyWindow 클래스에 SpeechSynthesizer 객체를 생성합니다.

public partial class MyWindow : Window
{
    SpeechSynthesizer _speechSynthesizer = new SpeechSynthesizer();


아래와 같이 버튼 클릭했을때 텍스트 내용을 메소드에 보내주면 됩니다.
단지 저게 끝입니다! 코드 끝!

void ButtonEchoOnClick(object sender, RoutedEventArgs args)
{
    _speechSynthesizer.SpeakAsync(TextToDisplay.Text);
}

그럼 현재시간, 날짜등도 감이 오시죠?
아래와 같이 저렇게만 보내주면 됩니다.

void ButtonDateOnClick(object sender, RoutedEventArgs args)
{
    _speechSynthesizer.SpeakAsync(
"Today is " + DateTime.Now.ToShortDateString());
}

void ButtonTimeOnClick(object sender, RoutedEventArgs args)
{
    _speechSynthesizer.SpeakAsync(
"The time is " + DateTime.Now.ToShortTimeString());
}

컴퓨터 이름도 아래와 같이 해서 알아오지요. 핫핫

void ButtonNameOnClick(object sender, RoutedEventArgs args)
{
    _speechSynthesizer.SpeakAsync(
"My name is " + _speechSynthesizer.Voice.Name);
}

자 그럼 슬라이드컨트롤(볼륨과 목소리속도)은 어떻게 할까요?
좀 고민되시나요?

훗... 간단할꺼라 생각하셨죠?
int값으로 변환해서 그냥 넣어주면 됩니다.! 끝!. 저걸로 코드 끝!

void VolumeChanged(object sender, RoutedEventArgs args)
{
    _speechSynthesizer.Volume = (
int)((Slider)args.OriginalSource).Value;
}

void RateChanged(object sender, RoutedEventArgs args)
{
    _speechSynthesizer.Rate = (
int)((Slider)args.OriginalSource).Value;
}

이렇게해서 TTS 프로그램을 만들어 보았네요. 참 쉽죠?

- Lorin 씀

반응형
댓글