티스토리 뷰

프로그램/안드로이드 강좌

음성인식

서.라.연 2012. 8. 15. 12:52


이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 - http://www.tipssoft.com/bulletin/tb.php/QnA/8406
* 안드로이드 강좌 목록 - http://www.tipssoft.com/bulletin/tb.php/old_bbs/501
음성 인식(Voice Recognition) 이란 컴퓨터를 이용하여 사람의 음성을 문자로 변환하는 기술입니다.
음성 녹음은 음파를 디지털로 변환하여 저장하는 것이고, 음성 인식은 디지털로 변환된 음파를 분석하여
해당 음파가 어떤 단어를 의미하는지 찾아내는 기술입니다. 이런 기술은 키보드와 같은 입력장치를
원활하게 사용할 수 없는 상황에 쓸 수 있도록 개발된 것이기 때문에 입력이 다소 불편한 모바일
기기에서도 효과적인 입력 대체 수단으로 사용될 수 있습니다.
음성 인식 기술은 상당한 이론적 배경을 요구하기 때문에 단순한 음파 분석으로는 구현하기 어렵습니다.
하지만 안드로이드가 탑재된 기기에서는 음성 인식 기술을 사용할 수 있도록 액티비티가 제공되기때문에
음성 인식에 대한 특별한 지식이 없더라도 자신의 어플리케이션에서 음성 인식을 사용할 수 있습니다.
따라서 음성 인식을 사용하기 위해서는 액티비티에 대한 사전 지식이 필요하기때문에 아래에 링크해드린
자료를 먼저 보시는 것이 좋습니다.
액티비티(Activity)의 이해 : http://www.tipssoft.com/bulletin/tb.php/FAQ/944
1. 음성 인식(Voice Recognize) 액티비티 사용하기
안드로이드에서는 음성 인식기(Voice Recognizer)를 음성 인식 액티비티를 통해 사용할 수 있습니다.
음성 인식 액티비티는 사용자의 음성을 인식하여 파형을 분석해주는 액티비티로서 액티비티 종료 후
음성 인식의 결과인 문자열의 리스트를 얻을 수 있습니다.
안드로이드 시스템이 권장하는 음성 인식 액티비티를 실행하기위해서는 음성 인식 행위를 의미하는
시스템 상수값을 이용하여 인텐트 객체를 생성해야합니다. 이처럼 안드로이드에서 음성 인식을 사용
하기위해 필요한 상수값이 RecognizerIntent 클래스에 정의되어 있습니다. 다음은 RecognizerIntent
클래스에서 자주 사용되는 상수값에 대한 설명입니다.
ACTION_RECOGNIZE_SPEECH
사용자의 음성을 인식하기위한 액티비티를 시작하도록 전달하는 상수 값으로, 이 상수값을 인자로
가지는 인텐트 객체를 이용하면 음성 인식 액티비티를 실행할 수 있습니다.
음성 인식 액티비티의 경우 음성 인식의 결과를 가져와야 하기 때문에 startActivityForResult 메소드를
이용하여 액티비티를 실행해야 하며, 그 결과는 onActivityResult 메소드에서 EXTRA_RESULTS 를
통해 반환받거나 PendingIntent 의 객체로 얻을 수있습니다. 아래 그림은 갤럭시S2 에서 이 상수값을
이용해 실행되어진 액티비티입니다.
이 상수값으로 음성 인식 액티비티를 실행하는 경우 putExtra 메소드를 이용하면 음성 인식기에
다양한 정보를 넘겨줄 수 있는데, 그 중 EXTRA_LANGUAGE_MODE 정보는 반드시 전달되어야
합니다. 이외에 선택적으로 EXTRA_MAX_RESULTS, EXTRA_LANGUAGE, EXTRA_PROMPT
EXTRA_RESULTS_PENDINGINTENT, EXTRA_RESULTS_PENDINGINTENT_BUNDLE 를 통해
정보를 전달할 수 있습니다.
ACTION_WEB_SEARCH
이 상수 값을 이용하여 음성 인식 액티비티를 실행시키면 음성 인식 결과로 웹 검색을 수행하여
검색 결과를 표시해줍니다. 아래 그림은 갤럭시S2 에서 이 상수값을 이용해 실행되어진 음성 검색
어플리케이션 액티비티입니다.
이 상수값으로 음성 인식 액티비티를 실행하는 경우 마찬가지로 EXTRA_LAGUAGE_MODE 정보는
반드시 전달되어야 합니다. 이외에 EXTRA_PARTIAL_RESULTS, EXTRA_MAX_RESULTS,
EXTRA_LANGUAGE, EXTRA_PROMPT 정보를 추가적으로 전달할 수 있습니다.
EXTRA_LANGUAGE_MODEL
음성 인식 액티비티를 실행하는 경우 음성 인식기에 사용되는 음성 모델(Speech model) 정보를
명시하기위해 사용되는 상수값입니다. 이 상수 값은 반드시 액티비티에 전달되어야 하며 전달할
수 있는 두 가지 음성 모델은 다음과 같습니다.
LANGUAGE_MODEL_FREE_FORM
free-form 기반의 음성 인식 모델을 사용합니다.
LANGUAGE_MODEL_WEB_SEARCH
웹 검색 조건을 기반으로 하는 언어 모델을 사용합니다.
EXTRA_PROMPT
사용자에게 음성을 요청할 때 보여주기위한 문장을 설정할 수 있는 상수값입니다.
EXTRA_LANGUAGE
음성 인식기에 인식되는 언어를 설정할 때 사용하는 상수값으로 IETE 언어 태그를 이용하여 설정
할 수 있습니다. 명시하지 않을 경우에는 기기의 환경 설정에 설정된 언어로 음성이 해석되지만,
이와 다른 언어로 음성 인식을 수행하기위해서는 그에 알맞는 값을 지정해주어야 합니다. 음성
인식에 사용되는 주요 국가들의 IETE 언어 태그는 다음과 같습니다.
한국어(대한민국) : ko-KR 일본어(일본) : ja-JP
중국어(중국,북경) : cmn-Hans-CN 영어(미국) : en-US
독일어(독일) : de-DE 프랑스어(프랑스) : fr-FR
EXTRA_MAX_RESULTS
음성 인식을 통해 반환될 결과의 수를 제한하는 상수값으로 그 값은 정수여야합니다.
EXTRA_RESULTS
ACTION_RECOGNIZE_SPEECH 를 이용하여 액티비티를 호출한 경우 사용자의 음성을 인식하고
해석된 결과를 onActivity 메소드내에서 ArrayList<String> 객체로 반환받기 위한 상수값입니다.
음성 인식 액티비티 종료 후 호출되는 onActivity 콜백 메소드에서 액티비티의 결과 코드가
RESULT_OK 가 아닌 에러 값인 경우 해당 값들은 아래의 오류 내용을 의미합니다.
RESULT_AUDIO_ERROR : 오디오 에러 시 반환되는 결과 값입니다.
RESULT_CLIENT_ERROR : 일반적인 클라이언트 에러의 결과 값입니다.
RESULT_NETWORK_ERROR : 네트워크 에러 시 반환되는 결과 값입니다.
RESULT_NO_MATCH : 일치하는 결과가 없을 시 반환된 결과 값입니다.
RESULT_SERVER_ERROR : 인식 서버에서 보내는 오류의 결과 값입니다.
2. 음성 인식 예제
RecognizerIntent 클래스를 이용하여 구성한 이 예제는 Speak 버튼을 클릭하여 실행된 액티비티를
통해 사용자의 음성을 입력받으면, 인식된 그 결과를 리스트뷰에 출력합니다. 아래의 실행화면처럼
3개의 버튼을 이용하면 인식된 음성을 각 언어에 알맞은 단어나 문장으로 출력해줍니다.
아래 음성 인식 예제에서 사용된 PackageManager 클래스는 기기에 설치된 어플리케이션의 정보를
가지는 클래스로서 이를 이용하여 현재 기기에서 음성 인식에 대한 행위를 제공하는 액티비티가 있는지
확인할 수 있습니다.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 리소스 파일에 정의된 id_btn 이라는 ID 의 버튼을 얻어온다.
Button btn = (Button) findViewById(R.id.id_btn);

// 리소스 파일에 정의된 ID 의 각 언어에 대한 버튼을 얻어온다.
Button english_btn = (Button) findViewById(R.id.id_english);
Button korean_btn = (Button) findViewById(R.id.id_korean);
Button japaness_btn = (Button) findViewById(R.id.id_japaness);

// 리소스 파일에 정의된 id_list 라는 ID 의 리스트뷰를 얻어온다.
m_list = (ListView) findViewById(R.id.id_list);

// 리소스 파일에 정의된 id_tv 라는 ID 의 텍스트뷰를 얻어온다.
TextView tv = (TextView) findViewById(R.id.id_tv);

// 현재 기기에 설치된 어플리케이션의 정보를 가지는 PackageManager 객체를 반환한다.
PackageManager pm = getPackageManager();
// 현재 기기에서 음성 인식에 대한 행위를 제공하는 액티비티 정보를 List<Resolveinfo> 로 반환한다.
List<ResolveInfo> activities = pm.queryIntentActivities( new Intent(
RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
// 기기에 음성 인식을 제공하는 액티비티가 존재하는 경우
if (activities.size() != 0) {
// 버튼에 리스너 인터페이스를 구현한 이 클래스를 넘겨 주어 리스너를 설정한다.
btn.setOnClickListener(this);
// 각 버튼에 리스너 인터페이스를 구현한 이 클래스를 넘겨 주어 리스너를 설정한다.
english_btn.setOnClickListener(this);
korean_btn.setOnClickListener(this);
japaness_btn.setOnClickListener(this);
// 기기에 음성 인식을 제공하는 액티비티가 존재하지 않는 경우
} else {

// 'Speak' 버튼을 비활성화시킨다.
btn.setEnabled(false);

// 사용자에게 음성 인식기가 제공되지 않음을 알린다.
tv.setText("Recognizer not present");
}
}

// OnClicklistener 인터페이스의 onClick 메소드를 정의한다.
public void onClick(View v) {
// 이벤트가 발생된 버튼이 'Speak' 버튼인 경우
if (v.getId() == R.id.id_btn)
// 음성 인식 액티비티를 실행하기위해 정의한 메소드를 호출한다.
startVoiceRecognitionActivity();
// 이벤트가 발생된 버튼이 음성 인식기의 언어를 설정하는 버튼인 경우
// 각 국가 언어에 대한 IETE 언어 태그값을 멤버변수에 저장한다.
else if (v.getId() == R.id.id_english) m_language = "en-US";
else if (v.getId() == R.id.id_korean) m_language = "ko-KR";
else if (v.getId() == R.id.id_japaness) m_language = "ja-JP";
}
// 음성 인식행위를 명시하여 음성 인식 액티비티를 실행하는 메소드를 정의한다.
private void startVoiceRecognitionActivity() {
// 음성 인식 행위에 대한 액티비티를 실행시킬 수 있는 인텐트 객체를 생성한다.
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

// 음성 인식기에 대한 언어 모델 정보를 실행될 액티비티에 전달한다.
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);

// 사용자가 언어 버튼을 클릭하여 음성 인식기의 언어를 임의로 설정한 경우
if( m_language.length() != 0)
// 음성 인식기에 대한 언어 정보를 실행될 액티비티에 전달한다.
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE , m_language );
// 사용자에게 음성 인식 요청시 보여줄 텍스트 정보를 실행될 액티비티에 전달한다.
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Voice Recognition Project");

// 인텐트 정보에 맞는 액티비티를 실행한다.
startActivityForResult(intent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 결과 값이 있고, 액티비티를 시작할 때 0로 설정해둔 결과값인 경우
if (requestCode == 0 && resultCode == RESULT_OK) {

// 사용자의 음성을 인식하여 해석한 결과를 String 객체로 반환한다.
ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);

// ArrayList 객체와 출력 리소스를 설정한 어댑터 객체를 생성하여 리스트뷰에 설정한다.
m_list.setAdapter(new ArrayAdapter<String>(this, R.layout.listview_item ,matches));
}
super.onActivityResult(requestCode, resultCode, data);
}


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

그림그리기의 기초와 구조  (0) 2012.08.15
음성인식을 이용한 발음 테스트 예제  (0) 2012.08.15
사진 촬영 서버전송  (0) 2012.08.15
TTS(TextToSpeech)  (0) 2012.08.15
사진촬영 이미지뷰  (0) 2012.08.15
댓글