본문 바로가기
MOBILE/Android

안드로이드 음성인식, 음성출력 기능 구현하기 (STT/TTS)

by 지구 2018. 8. 10.

이번엔 android 에서 음성인식과 음성출력 기능을 구현하고 싶어서 공부하여 구현했고

또 포스팅으로 끄적끄적 하자면, 먼저 음성인식부터 구현하는 방법에 대해 적는다...




* STT : Speech-To-Text *

음성인식 : 마이크로 유저의 목소리를 판독하여 String화함

* TTS : Text-To-Speech *

음성출력 : 문자열을 음성화 하여 유저에게 들려줌




* 음성인식 구현방법 *

1. AndroidManifest.xml 에서 음성인식에 필요한 권한을 선언한다

1
2
<!-- 음성인식에 필요함 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
cs

2. 전역변수로 intent 와 음성인식에 필요한 SpeechRecognizer 를 선언하고,

1
2
Intent i;
SpeechRecognizer mRecognizer;
cs

3. onCreate() 메소드에서 앞서 전역변수로 선언한 intent 와 SpeechRecognizer 를 초기화해준다

1
2
3
4
5
6
//음성인식
= new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
i.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getContext().getPackageName());
i.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ko-KR");
mRecognizer = SpeechRecognizer.createSpeechRecognizer(getContext());
mRecognizer.setRecognitionListener(listener);
cs

4. 그리고 버튼클릭시 실행될 수 있도록 mRecognizer.startListening(i) 을 하면 되지만, 권한강화로 인해 권한체크를 한번 더 해야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//음성인식 버튼
((ImageView)getView().findViewById(R.id.home_record)).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        System.out.println("-------------------------------------- 음성인식 시작!");
        if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.RECORD_AUDIO)!=PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.RECORD_AUDIO}, MY_PERMISSIONS_RECORD_AUDIO);
            //권한을 허용하지 않는 경우
        } else {
            //권한을 허용한 경우
            try {
                mRecognizer.startListening(i);
            } catch(SecurityException e) {
                e.printStackTrace();
            }
         }
    }
});
cs

5. 마지막으로 오버라이드 메소드들을 정의해서 커스텀하면 끝!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*
     * 음성인식을 위한 메소드
     */
    private RecognitionListener listener = new RecognitionListener() {
        @Override
        public void onReadyForSpeech(Bundle params) {
            System.out.println("onReadyForSpeech.........................");
        }
        @Override
        public void onBeginningOfSpeech() {
            Toast.makeText(getContext(), "지금부터 말을 해주세요!", Toast.LENGTH_SHORT).show();
        }
 
        @Override
        public void onRmsChanged(float rmsdB) {
            System.out.println("onRmsChanged.........................");
        }
 
        @Override
        public void onBufferReceived(byte[] buffer) {
            System.out.println("onBufferReceived.........................");
        }
 
        @Override
        public void onEndOfSpeech() {
            System.out.println("onEndOfSpeech.........................");
        }
 
        @Override
        public void onError(int error) {
            Toast.makeText(getContext(), "천천히 다시 말해주세요.", Toast.LENGTH_SHORT).show();
        }
 
        @Override
        public void onPartialResults(Bundle partialResults) {
            System.out.println("onPartialResults.........................");
        }
 
        @Override
        public void onEvent(int eventType, Bundle params) {
            System.out.println("onEvent.........................");
        }
 
        @Override
        public void onResults(Bundle results) {
            String key= "";
            key = SpeechRecognizer.RESULTS_RECOGNITION;
            ArrayList<String> mResult = results.getStringArrayList(key);
            String[] rs = new String[mResult.size()];
            mResult.toArray(rs);
            Toast.makeText(getContext(), rs[0], Toast.LENGTH_SHORT).show();
            mRecognizer.startListening(i); //음성인식이 계속 되는 구문이니 필요에 맞게 쓰시길 바람
        }
    };
cs



* 음성출력 사용방법 *

1. AndroidManifest.xml 에서 음성인식에 필요한 권한을 선언한다

1
2
<!-- 음성인식에 필요함 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
cs

2. 전역변수로 음성출력에 필요한 TextToSpeech 를 선언하고,

1
2
TextToSpeech tts;
cs

3. onCreate 나 onActivityCreated 에서 음성출력(tts)을 생성하고 리스너를 초기화한다. 한국어 사용을 위해 Locale.KOREAN 으로~

1
2
3
4
5
6
7
8
9
//음성출력 생성, 리스너 초기화
tts = new TextToSpeech(getContext(), new TextToSpeech.OnInitListener() {
    @Override
    public void onInit(int status) {
        if(status!=android.speech.tts.TextToSpeech.ERROR) {
            tts.setLanguage(Locale.KOREAN);
        }
    }
});
cs

4. 버튼 클릭시 음성이 출력되도록 메소드 설정해주면 끝!

1
2
3
4
5
6
7
8
9
10
11
12
//음성출력 버튼
((ImageView)getView().findViewById(R.id.home_speak)).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        System.out.println("-------------------------------------- 음성출력 시작!");
        String totalSpeak = "안녕하세요 음성인식입니다!";
 
        tts.setPitch(1.5f); //1.5톤 올려서 
        tts.setSpeechRate(1.0f); //1배속으로 읽기
        tts.speak(totalSpeak, TextToSpeech.QUEUE_FLUSH, null);
    }
});
cs



아, 마지막엔 내가 설정한 객체들을 닫아주는 편이 좋다 :) 이렇게

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
* 음성인식/출력 객체가 남아있다면 실행을 중지하고 메모리에서 제거
*/
@Override
public void onDestroy() {
    super.onDestroy();
    if(tts != null){
        tts.stop();
        tts.shutdown();
        tts = null;
    }
 
    if(mRecognizer!=null){
        mRecognizer.destroy();
        mRecognizer.cancel();
        mRecognizer = null;
    }
}
cs


반응형

댓글