솜은 코튼

[Android] STT, Speech-To-Text 본문

Android/Java

[Android] STT, Speech-To-Text

솜.코 2021. 1. 20. 11:41

 

 

 

음성인식 후 텍스트 출력 (STT)

    :음성을 인식하여 텍스트 값(String)으로 출력한다.

 

     해당 모드로 설정하면 외부 라이브러리 사용을 제한할 수 있다.

     (단, 기존 External Libraries에 받아놓은 라이브러리들은 영향이 가지 않으니 걱정하지 않아도 된다.)

 

    1. AndroidManifest.xml   

    : 오디오 녹음 퍼미션 설정

     (Android 6.0 이상부터는 해당 퍼미션의 권한 요청을 해주셔야 합니다.)

1
2
<!--STT-->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
cs

 

    2. Speech-To-Text 실행

1
2
3
4
5
6
7
8
9
10
11
private SpeechRecognizer mRecognizer;
 
public void startSTT(){
    Intent i = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    i.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, context.getPackageName());
    i.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ko-KR");
    mRecognizer = SpeechRecognizer.createSpeechRecognizer(context);
    mRecognizer.setRecognitionListener(listener);
 
    mRecognizer.startListening(i); //음성 인식 시작
}
cs

 

    3. RecognitionListener

    : 음성 인식 동작 관련 리스너

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
private RecognitionListener listener = new RecognitionListener() {
    @Override
    public void onReadyForSpeech(Bundle params) {
    }
 
    @Override
    public void onBeginningOfSpeech() {
    }
 
    @Override
    public void onRmsChanged(float rmsdB) {
    }
 
    @Override
    public void onBufferReceived(byte[] buffer) {
    }
 
    @Override
    public void onEndOfSpeech() {
    }
 
    @Override
    public void onError(int error) {
        String message;
        switch(error) {
            case SpeechRecognizer.ERROR_AUDIO:
                message = "오디오 녹음 오류입니다.";
                break;
            case SpeechRecognizer.ERROR_CLIENT:
                message = "기타 클라이언트 측 오류.";
                break;
            case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
                message = "권한이 부족합니다.";
                break;
            case SpeechRecognizer.ERROR_NETWORK:
                message = "기타 네트워크 관련 오류.";
                break;
            case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
                message = "네트워크 작업 시간이 초과되었습니다.";
                break;
            case SpeechRecognizer.ERROR_NO_MATCH:
                message = "일치하는 인식 결과가 없습니다.";
                break;
            case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
                message = "RecognitionService가 사용 중입니다.";
                break;
            case SpeechRecognizer.ERROR_SERVER:
                message = "서버가 오류 상태를 보냅니다.";
                break;
            case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
                message = "음성 입력 없음";
                break;
            default:
                message = "알 수 없는 오류";
                break;
        }
    }
 
    @Override
    public void onPartialResults(Bundle partialResults) {
    }
 
    @Override
    public void onEvent(int eventType, Bundle params) {
    }
 
    @Override
    public void onResults(Bundle results) {
        String key = SpeechRecognizer.RESULTS_RECOGNITION;
        ArrayList<String> mResult = results.getStringArrayList(key);
        String[] rs = new String[mResult.size()];
        mResult.toArray(rs);
        Log.i(Const.GLOBAL_LOG_TAG, "onResults : " + rs[0]);
//            mRecognizer.startListening(i); //음성인식 계속
    }
};
cs

 

    4. Speech-To-Text 중단

    : 계속 실행되는 경우를 방지하기 위한 선택적 적용

1
2
3
4
5
6
7
public void stopSTT(){
    if(mRecognizer!=null){
        mRecognizer.destroy();
        mRecognizer.cancel();
        mRecognizer = null;
    }
}
cs