android background 음성인식 동작

zerolism ㅣ 2012. 12. 14. 16:36

SMALL

안드로이드 앱을 개발하다보면 사용자의 보이스 입력을 텍스트로 변환해야 할 경우가 있다. 이런 것을 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 이다.




전체 샘플 코드 첨부하였습니다.

*글과 자료는 출처만 밝히시면 얼마든지 가져다 쓰셔도 됩니다.

 

LIST