티스토리 뷰



이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 - http://www.tipssoft.com/bulletin/tb.php/QnA/8406
* 안드로이드 강좌 목록 - http://www.tipssoft.com/bulletin/tb.php/old_bbs/501
이번 강좌에서는 텍스트를 음성으로 변환해주는 TTS (TextToSpeech) 에 대해 알아보도록 하겠습니다.
TTS (TextToSpeech) 는 인위적으로 사람의 음성을 합성하는 기술로 주로, 글을 볼 수 없는 시각
장애인을 위하여 컴퓨터에 있는 문자를 소리로 전달하기위해 사용되며 대부분의 안드로이드용 기기에는
이 TTS 엔진이 제공되고 있습니다.
이번 자료에서는 TTS 엔진을 사용할 수 있도록 제공되는 TextToSpeech 클래스와 이를 이용한 간단한
예제를 살펴보고, 스마트 폰에 설치된 TTS 엔진을 확인하고 설정하는 방법에 대해서도 알아보도록
하겠습니다.
1. TextToSpeech 클래스
TextToSpeech 는 TTS 를 사용할 수 있도록 제공하는 클래스입니다. 이 클래스는 android.speech.tts
패키지에 정의되어 있으므로 반드시 이 패키지를 참조하여 사용해야합니다.
안드로이드에서 지원하는 TTS 엔진을 사용하기위해서는 먼저 TextToSpeech 클래스의 객체를
생성하고 해당 엔진을 초기화시켜야합니다. TextToSpeech 의 객체 생성자는 다음과 같습니다.
TextToSpeech( Context context , TextToSpeech.OnInitListener listener )
TextToSpeech 의 생성자에는 두개의 매개 인자를 사용하는데 첫번째 매개 인자에는 context 를
사용하며 두번째 매개 인자에는 TextToSpeech.OnInitListener 인터페이스의 객체를 사용합니다.
TTS 엔진이 초기화될 때 TextToSpeech.OnInitListener 인터페이스의 onInit 메소드를 호출하므로
해당 콜백 메소드에 TTS 초기화에 관한 코드를 구성해주어야 합니다.
위와 같은 방법으로 TextToSpeech 클래스의 객체가 생성되면 생성자의 두번째 인자로 넘겨줬던
인터페이스 객체의 onInit 메소드가 호출되어 TTS 엔진이 초기화됩니다.
다음은 자주 사용되는 TTS 엔진을 설정하는 TextToSpeech 클래스의 메소드들 입니다.
int setLanguage(Locale loc)
TextToSpeech 엔진의 언어를 설정합니다. 반환 값으로 TTS 엔진에서 지원하는 해당 언어에 대한
정보를 반환하는데, 반환값으로는 LANG_AVAILABLE, LANG_COUNTRY_AVAILABLE,
LANG_MISSING_DATA, LANG_COUNTRY_VAR_AVAILABLE 그리고 LANG_NOT_SUPPORTED 가
있습니다.
int setPitch(float pitch)
TextToSpeech 엔진의 음성의 높낮이를 설정합니다. 1 값은 보통 높낮이이며, 1 보다 작으면 상대
적으로 낮은 톤의 음성이 출력되며, 1 보다 큰 경우에는 높은 톤의 음성이 출력됩니다.
int setSpeechRate(float speechRate)
TextToSpeech 엔진의 말의 빠르기를 설정합니다. 1 값은 보통 빠르기이며, 0.5 는 보통보다 반
정도 느린 음성으로 출력되고, 2 는 두 배 빠른 음성으로 합성되어 출력됩니다.
int speak(String text, int queueMode, HashMap<String, String> params)
텍스트를 지정된 Queue 방식과 음성 매개 변수를 사용하여 음성 합성한 뒤 출력해주는 함수입니다.
TextToSpeech.speak 메소드를 이용하여 텍스트를 음성으로 변환하기 위해서 다음의 두 가지
Queue 방식이 제공됩니다.
QUEUE_ADD
재생되기 위한 음성과 합성되기 위한 텍스트가 출력되지 못하고 Queue 에 남아있는 경우 현재
합성될 문장이 그 뒤에 추가되어 이전에 남겨진 데이터가 모두 출력된 뒤에 출력됩니다.
QUEUE_FLUSH
재생되기 위한 음성과 합성되기 위한 텍스트가 출력되지 못하고 Queue 에 남아있는 경우
Queue 를 비운 뒤 현재 합성할 텍스트를 음성 합성하여 출력합니다.
int stop()
현재 음성 출력을 중단하고 Queue 에 대기 중인 데이터를 버립니다.
void shutdown()
TextToSpeech 엔진에 사용된 리소스를 해제합니다.
2. TextToSpeech 예제
TextToSpeech 클래스를 이용하여 구성한 이 예제는 에디트텍스트에 입력한 영문을 Speak 버튼을
클릭하여 음성으로 출력합니다. 아래의 실행화면처럼 6개의 버튼을 이용하면 음성의 출력 속도와
높낮이를 조절할 수 있습니다.
2.1 TextToSpeech 객체 생성
TTS 엔진을 사용하기위해 TextToSpeech 클래스를 멤버 변수로 선언하고, TTS 엔진이 성공적으로
초기화될 경우 Speak 버튼이 활성화될 수 있도록 해당 버튼을 멤버 변수로 선언합니다. 그리고
TTS 엔진의 음성 출력 속도와 높낮이를 설정할 수 있도록 버튼에 리스너를 등록해줍니다.
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// TextToSpeech 클래스의 객체를 생성하고, TextToSpeech 시스템을 초기화한다.
// TTS 초기화가 완료된 후에는 두 번째 인자에 정의된 TextToSpeech.OnInitListener
// 인터페이스의 콜백 메소드인 onInit() 이 호출된다.
m_tts = new TextToSpeech( this , this );

// 리소스 파일에 정의된 id_btn 이라는 ID의 버튼을 얻어온다.
m_btn = (Button) findViewById(R.id.id_btn);
// 버튼에 리스너 인터페이스를 구현한 이 클래스를 넘겨주어 리스너를 설정한다.
m_btn.setOnClickListener( this );

// 리소스 파일에 정의된 음의 빠르기(Speech Rate) 에 대한 해당 ID 의 버튼을 얻고,
// 리스너 인터페이스를 구현한 이 클래스를 넘겨주어 리스너를 설정한다.
Button quick_btn = (Button) findViewById(R.id.id_quick_btn);
quick_btn.setOnClickListener( this );
Button normal_rate_btn = (Button) findViewById(R.id.id_normal_rate_btn);
normal_rate_btn.setOnClickListener( this );
Button slow_btn = (Button) findViewById(R.id.id_slow_btn);
slow_btn.setOnClickListener( this );

// 리소스 파일에 정의된 음의 높낮이(Pitch) 에 대한 해당 ID 의 버튼을 얻고,
// 리스너 인터페이스를 구현한 이 클래스를 넘겨주어 리스너를 설정한다.
Button high_btn = (Button) findViewById(R.id.id_high_btn);
high_btn.setOnClickListener( this );
Button normal_pitch_btn = (Button) findViewById(R.id.id_normal_pitch_btn);
normal_pitch_btn.setOnClickListener( this );
Button low_btn = (Button) findViewById(R.id.id_low_btn);
low_btn.setOnClickListener( this );
}
2.2 onInit() 메소드 정의
TTS 엔진의 초기화가 완료된 경우 호출되는 TextToSpeech.OnInitListener 인터페이스의 onInit
메소드를 현재 액티비티 클래스에 구현합니다. 만약 TTS 엔진이 성공적으로 초기화되지 못한 경우
사용자에게 현재 TTS 엔진의 상태를 알리고, 엔진이 성공적으로 초기화된 경우에는 Speak 버튼을
활성화하여 TTS 엔진을 사용할 수 있도록 합니다.
// TextToSpeech.OnInitListener 인터페이스의 onInit 메소드를 정의한다.
public void onInit(int status) {
// 리소스 파일에 정의된 id_tv 라는 ID의 TextView 를 얻어온다.
TextView tv = (TextView) findViewById(R.id.id_tv);
// TextToSpeech 엔진의 초기화가 완료되어 사용할 수 있도록 준비된 상태인 경우
if (status == TextToSpeech.SUCCESS) {
// 음성 합성하여 출력하기위한 언어를 Locale.US 로 설정한다.
// 안드로이드 시스템의 환경 설정에서도 동일한 언어가 선택되어 있어야만
// 해당 언어의 문장이 음성변환 될 수 있다.
int result = m_tts.setLanguage(Locale.US);
// 해당 언어에 대한 데이터가 없거나 지원하지 않는 경우
if (result == TextToSpeech.LANG_MISSING_DATA ||
result == TextToSpeech.LANG_NOT_SUPPORTED) {
// 해당 언어는 사용할 수 없음을 알린다.
tv.setText("Language is not available.");
// TTS 엔진이 해당 언어를 지원하며 데이터도 가지고 있는 경우
} else {
// TTS 엔진이 성공적으로 초기화된 경우
// EditText 에 쓰여지는 문장을 음성 변환할 수 있도록 버튼을 활성화한다.
m_btn.setEnabled(true);
}
// TextToSpeech 엔진 초기화에 실패하여 엔진이 TextToSpeech.ERROR 상태인 경우
} else {
// TextToSpeech 엔진이 초기화되지 못했음을 알린다.
tv.setText("Could not initialize TextToSpeech.");
}
}
2.3 onClick() 메소드 정의
EditView 의 문장을 음성으로 출력하기위한 Speak 버튼과 TTS 엔진의 음성 빠르기와 높낮이를
조절하기위한 여섯 개의 버튼이 클릭되었을 때 호출되는 OnClickListener 인터페이스의 onClick
메소드를 정의합니다.
// OnClickListener 인터페이스의 onClick 메소드를 정의한다.
public void onClick(View view) {
// 이벤트가 발생된 버튼이 'Speak' 버튼인 경우
if( view.getId() == R.id.id_btn ) {
// 리소스 파일에 정의된 id_edit 이라는 ID 의 EditText 를 얻어온다.
EditText edit = (EditText) findViewById(R.id.id_edit);

// EditText 에 적힌 문자열을 가져온다.
String str = edit.getText().toString();
// Queue 에 대기중인 데이터가 존재하는 경우 Queue 를 비우고 현재 문장을 출력하는
// Queue 방식을 사용하여 EditText 로 부터 가져온 문자열을 음성 변환합니다.
m_tts.speak( str , TextToSpeech.QUEUE_FLUSH , null );
// 이벤트가 발생된 버튼이 음의 빠르기를 설정하는 'Slow' 버튼인 경우
} else if( view.getId() == R.id.id_slow_btn) {
// TextToSpeech 엔진의 말하는 속도를 느리게 설정한다.
m_tts.setSpeechRate( (float)0.5 );
// 이벤트가 발생된 버튼이 음의 빠르기를 설정하는 'Normal' 버튼인 경우
} else if( view.getId() == R.id.id_normal_rate_btn ) {
// TextToSpeech 엔진의 말하는 속도를 보통으로 설정한다.
m_tts.setSpeechRate( (float)1 );
// 이벤트가 발생된 버튼이 음의 빠르기를 설정하는 'Quick' 버튼인 경우
} else if( view.getId() == R.id.id_quick_btn ) {
// TextToSpeech 엔진의 말하는 속도를 빠르게 설정한다.
m_tts.setSpeechRate( (float)2 );
// 이벤트가 발생된 버튼이 음의 높낮이를 설정하는 'High' 버튼인 경우
} else if( view.getId() == R.id.id_high_btn ) {
// TextToSpeech 엔진의 음의 높이를 높게 설정한다.
m_tts.setPitch( (float)2 );
// 이벤트가 발생된 버튼이 음의 높낮이를 설정하는 'Normal' 버튼인 경우
} else if( view.getId() == R.id.id_normal_pitch_btn ) {
// TextToSpeech 엔진의 음의 높이를 보통으로 설정한다.
m_tts.setPitch( (float)1 );
// 이벤트가 발생된 버튼이 음의 높낮이를 설정하는 'Low' 버튼인 경우
} else if( view.getId() == R.id.id_low_btn) {
// TextToSpeech 엔진의 음의 높이를 낮게 설정한다.
m_tts.setPitch( (float)0.5 );
}
}
2.4 TextToSpeech 리소스 해제
현재 재생되는 음성 출력을 중단하고 Queue 에 대기하는 데이터를 비운 뒤, TextToSpeech 엔진에
의해 사용된 기본 리소스를 해제하기 위해 shutdown 메소드를 호출합니다.

@Override
public void onDestroy() {
// TextToSpeech 객체가 생성된 경우
if (m_tts != null) {
// 음성 출력을 중단하고 대기 Queue 의 데이터를 비운다.
m_tts.stop();
// TTS 엔진에 할당된 리소스를 해제하기위해 반드시 호출한다.
m_tts.shutdown();
}
super.onDestroy();
}
3. TextToSpeech 환경 설정
안드로이드 1.6 버전부터 지원하는 TextToSpeech 엔진과 엔진의 속성을 변경하기위한 방법에 대해
살펴보도록 하겠습니다. TextToSpeech 환경 설정을 위한 설명에 사용되는 스마트폰은 안드로이드
2.3.3 버전이 설치된 갤럭시 S2 입니다.
① 환경 설정에 들어가면 음성 입력&출력 에 대한 설정 항목이 있습니다.
② 음성 입력&출력 항목에 들어가면 음성 인식과 음성 출력인 TTS 설정에 대한 항목이 있습니다.
③ TTS 설정에 들어가면 스마트폰에 지원되는 TextToSpeech 엔진과 현재 선택된 엔진이 지원하는
언어를 보여주는 '언어' 항목이 있습니다. 언어 항목에서 선택된 언어의 데이터가 설치되어 있는 경우
예문 듣기를 통해 TTS 엔진의 사용 여부를 테스트해 볼 수 있습니다.
④ 안드로이드에서 제공하는 pico TTS 엔진 이외에 각 스마트폰 회사별로 별도의 TTS 가 지원되기도
하며 선택한 TTS 엔진에서 지원하는 언어와 말하는 속도 등의 속성을 변경할 수 있습니다.
위의 예제에서도 설명했지만 setLanguage 메소드를 이용하여 TTS 엔진의 언어를 설정할 때 반드시
TTS(text-to-speech) 설정에서 설정된 언어와 동일하게 설정해주어야만 해당 언어의 텍스트를 음성
변환하여 출력할 수 있습니다.
갤럭시 S2 에서 지원하는 TTS 엔진은 Samsung TTS 와 Pico TTS 두 가지이며, 안드로이드 스마트
폰에 기본적으로 설치되어 있는 Pico TTS 엔진에 설치된 언어 데이터는 오른쪽의 리스트와 같습니다.
다른 회사 제품이나 다른 모델인 경우 Pico TTS 엔진이 지원되지만 언어 데이터가 설치되어있지 않은
경우 별도로 데이터를 다운 받아 설치하셔야 합니다.
또한 Pico TTS 에는 한국어 데이터가 설치되어있지 않기 때문에 한국어 TTS 를 사용하기 위해서는
안드로이드 마켓에서 TTS 한국어 데이터를 다운 받아 설치하거나 한국어 데이터를 가지는 TTS 엔진을
설치하셔야 합니다.

 

'프로그램 > 안드로이드 강좌' 카테고리의 다른 글

음성인식  (0) 2012.08.15
사진 촬영 서버전송  (0) 2012.08.15
사진촬영 이미지뷰  (0) 2012.08.15
컨텍스트(Context)  (0) 2012.08.15
엑티비티 전환하기 명시적  (0) 2012.08.15
댓글