안드로이드 앱을 개발하다보면 사용자의 보이스 입력을 텍스트로 변환해야 할 경우가 있다. 이런 것을 Speech To Text, STT라고 하는데 구글에서는 이런 기능을 구현하여 보다 쉽게 사용 할 수 있게 만들었다.
구글의 STT는 2가지 사용법을 제공하고 있다. 한가지는 구글 음성인식 앱을 실행시켜 결과값을 얻는 방법이다. 이 방법은 구현이 굉장히 쉽다. 하지만 구글 음성인식 앱을 사용하기에 UI 부분에 있어서 자신의 앱과는 맞지 않을 수 있다. 2번째는 방법은 UI는 개발자들에게 맡기고 음성인식하는 기능 자체만 제공하는 방법이다. 이 방법은 개발자가 사용자의 입력 시작/종료, 인식 결과 성공/실패 같은 이벤트가 발생할 때 마다 그에 맞게 개발을 해야 해서 조금은 번거로울 수 있다.
1. 구글 음성인식 앱을 실행시켜 결과만 받아보기
*구글 음성인식 실행하기
Intent i = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); //intent 생성
i.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getPackageName()); //호출한 패키지
i.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ko-KR"); //음성인식 언어 설정
i.putExtra(RecognizerIntent.EXTRA_PROMPT, "말을 하세요."); //사용자에게 보여 줄 글자
startActivityForResult(i, GOOGLE_STT); //구글 음성인식 실행
*결과 받기
음성인식 결과는 onActivityResult 메소드를 통해서 받게 된다. 결과는 ArrayList 형태로 넘어오게 된다.
String key = RecognizerIntent.EXTRA_RESULTS;
mResult = data.getStringArrayListExtra(key); //인식된 데이터 list 받아옴.
String[] result = new String[mResult.size()]; //배열생성. 다이얼로그에서 출력하기 위해
mResult.toArray(result); // list 배열로 변환
//1개 선택하는 다이얼로그 생성
AlertDialog ad = new AlertDialog.Builder(this).setTitle("선택하세요.")
.setSingleChoiceItems(result, -1, new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int which) {
mSelectedString = mResult.get(which); //선택하면 해당 글자 저장
}
})
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int which) {
mResultTextView.setText("인식결과 : "+mSelectedString); //결과 출력
}
})
.setNegativeButton("취소", new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int which) {
mResultTextView.setText(""); //취소버튼 누르면 초기화
mSelectedString = null;
}
}).create();
ad.show();
2. 자신이 만든 UI에 음성인식 기술만 사용하기
음성인식의 또 다른 방법은 SpeechRecognizer 와 RecognitionListener를 이용하는 방법이다.
*음성인식 시작하기
Intent i = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); //음성인식 intent생성
i.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getPackageName()); //데이터 설정
i.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ko-KR"); //음성인식 언어 설정
mRecognizer = SpeechRecognizer.createSpeechRecognizer(this); //음성인식 객체
mRecognizer.setRecognitionListener(listener); //음성인식 리스너 등록
mRecognizer.startListening(i);
*음성인식 이벤트 받기
이벤트는 RecognitionListener를 통해서 받을수 있다.
//음성인식 리스너
private RecognitionListener listener = new RecognitionListener() {
//입력 소리 변경 시
@Override public void onRmsChanged(float rmsdB) {}
//음성 인식 결과 받음
@Override public void onResults(Bundle results) {}
//음성 인식 준비가 되었으면
@Override public void onReadyForSpeech(Bundle params) {}
//음성 입력이 끝났으면
@Override public void onEndOfSpeech() {}
//에러가 발생하면
@Override public void onError(int error) {}
@Override public void onBeginningOfSpeech() {} //입력이 시작되면
@Override public void onPartialResults(Bundle partialResults) {} //인식 결과의 일부가 유효할 때
//미래의 이벤트를 추가하기 위해 미리 예약되어진 함수
@Override public void onEvent(int eventType, Bundle params) {}
@Override public void onBufferReceived(byte[] buffer) {} //더 많은 소리를 받을 때
};
*결과 받기
음성인식 결과는 RecognitionListener의 onResults(Bundle results)로 받을수 있다. 결과는 ArrayList 형태로 Bundle에 담겨 넘어오게 된다.키 값은 SpeechRecognizer.RESULTS_RECOGNITION 이다.
전체 샘플 코드 첨부하였습니다.
*글과 자료는 출처만 밝히시면 얼마든지 가져다 쓰셔도 됩니다.
SpeechToText.zip
출처 http://blog.daum.net/mailss/20