1. 'Okay. Google' 기능으로 앱 실행시키기
이 기능은 별다른 추가 없이 실행시키고자 하는 앱의 이름을 넣어서 부르면 된다.
ex) 만약 앱 이름이 '점냥'이라면
"Okay Google 점냥 시작"
2. SpeechRecognizer 의 단순 인식
이 기능은 기기 내부 음성 인식 API를 이용하여 음성을 읽어 오는 클래스이다. 때문에 특정 기기에 음성 인식 API가 없다면 사용할 수 없다.
퍼미션 추가
* 안드로이드 마시멜로 이상부터 권한 허가를 요청하는 부분이 필요하다.
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
RecognitionListener 생성
음성인식 API 호출시 발생하는 콜백 메소드 정의
RecognitionListener listener = new RecognitionListener() {
@Override
public void onReadyForSpeech(Bundle params) {
}
@Override
public void onBeginningOfSpeech() {
}
@Override
public void onRmsChanged(float rmsdB) {
Log.d("sound",""+rmsdB);
//입력되는 데시벨 크기를 상수로
}
@Override
public void onBufferReceived(byte[] buffer) {
}
@Override
public void onEndOfSpeech() {
}
@Override
public void onError(int error) {
}
@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);
//rs에 인식된 결과 값이 들어가 있다.
((TextView)(findViewById(R.id.text))).setText("" + rs[index]);
}
@Override
public void onPartialResults(Bundle partialResults) {
}
@Override
public void onEvent(int eventType, Bundle params) {
}
};
써 본 경험으로는 onRmsChanged 함수와 onResults 함수만 주로 사용하면 될 것같다. onRmsChanged 함수는 들어오는 입력을 UI에서 다이나믹에서 보여줄 때 사용할 수 있고, onRsults 함수는 음성 인식으로 출력(추정) 값이 나오는 데 보통 첫번째 배열의 값이 정확도가 높다.
주요 나타날수 있는 에러들
ERROR_SPEECH_TIMEOUT : 아무 음성도 못들었을 때
ERROR_NO_MATCH : 적당한 결과를 찾이 못했을 때
ERROR_INSUFFICIENT_PERMISSIONS : 퍼미션이 없을 때
ERROR_NETWORK : 네트워크 없을 때
ERROR_NETWORK_TIMEOUT : 네트워크 타임아웃
SpeechRecognizer 정의
SpeechRecognizer mRecognizer;
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getPackageName());
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ko-KR"); //한국어 인식
mRecognizer = SpeechRecognizer.createSpeechRecognizer(MainActivity.this);
mRecognizer.setRecognitionListener(listener); //위에서 정의한 콜백 리스너
mRecognizer.startListening(intent); //음성인식 기능을 키는 함수
'띵~' 소리 끄기
위 코드로 구현하면 띵 소리가 난다. 앱의 완성을 위해 해당 소리를 끄기위해서는 AudioManager로 Mute처리하면 된다.
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!mAudioManager.isStreamMute(AudioManager.STREAM_MUSIC)) {
mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, 0);
}
}else {
mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, true);
}
3. '시리'처럼 실시간 음성인식 구현
아이폰의 시리처럼 백그라운드에서 음성인식을 구현해보고 싶어졌다.
때문에 Service에서 포그라운드로 실행시키고 Handler를 이용해 무한히 호출한다.
해당 코드
https://github.com/jaeryo2357/AndroidAlwaysListener
문제점
1. 서비스가 실행되는 동안 계속 음성인식이 동작하기 때문에 많은 배터리를 소요한다.
2. 음성인식이 시작되는 타이밍이 있어 시리처럼 매끄러운 동작이 불가능하다.
'Android > Common' 카테고리의 다른 글
[Android] Firebase ML Kit - Translate에 대한 소개 (6) | 2020.03.29 |
---|---|
[Android]SharedPreferences by Kotlin (0) | 2020.03.27 |
[Android] AAC - View Binding (0) | 2020.03.12 |
[Android] 면접에서 헷갈릴수 있는 Activity Lifecycle (0) | 2020.03.05 |
[Android]Keybard Show/Hide 감지하기 (0) | 2020.02.12 |