안녕하세요.
이번 포스팅은 구글STT를 실행하면서 Recording하는 방법을
알려드리고 싶지만 현재 기술적으로 불가능해서
왜 안되는지에 대한 이유를 알려드리기 위해 적게 되었습니다.
구글STT는 Recording한 데이터를 가지고 서버에 보내서
해당 결과값을 받아 처리하게 되어있습니다.
이 과정에서 마이크 채널을 구글 STT가 점유하게 되는데
우리가 Recording을 하기 위해 AudioRecord나 MediaRecord를 쓸때도 마이크 채널을 씁니다.
즉 2개의 앱에서 마이크 채널을 사용하기 때문에 먼저 실행된 앱이
먼저 점유권을 가지에 되어 한쪽은 실행되고 다른 한쪽은 실행이 안되는 것입니다.
입력 공유에 대한 내용은 아래 사이트에서 확인하실 수 있습니다.
developer.android.com/guide/topics/media/sharing-audio-input?hl=ko
구글 STT를 실행하는데 왜 2개의 앱이라고 말하는지 이해가 안되실 수 있습니다.
저도 처음에 라이브러리 형태로 제공되는 줄 알았는데
알고보니 구글 앱 안에 있는 STT를 다른앱에 서비스 연결을 통해 실행되고 있었습니다.
서비스 연결은 우리가 알고 있는 그 4대 컴포넌트 중 하나인 Service가 맞습니다.
서비스를 바인딩하는 방법은 총 3가지가 있는데 이는 다음 포스팅에 올리겠습니다.
이 코드가 구글 STT를 실행하는 부분입니다. 보시면
IRecognitionListener가 있는데 이게 외부에 연결된 서비스의 인터페이스 역할을 합니다.
private void dispatchStartListening(Intent intent, final IRecognitionListener listener,
int callingUid) {
if (mCurrentCallback == null) {
if (DBG) Log.d(TAG, "created new mCurrentCallback, listener = " + listener.asBinder());
try {
listener.asBinder().linkToDeath(new IBinder.DeathRecipient() {
@Override
public void binderDied() {
mHandler.sendMessage(mHandler.obtainMessage(MSG_CANCEL, listener));
}
}, 0);
} catch (RemoteException re) {
Log.e(TAG, "dead listener on startListening");
return;
}
mCurrentCallback = new Callback(listener, callingUid);
RecognitionService.this.onStartListening(intent, mCurrentCallback);
} else {
try {
listener.onError(SpeechRecognizer.ERROR_RECOGNIZER_BUSY);
} catch (RemoteException e) {
Log.d(TAG, "onError call from startListening failed");
}
Log.i(TAG, "concurrent startListening received - ignoring this call");
}
}
그럼 STT와 Recording을 같이 쓸수 있는 방법은 무엇일까여?
결국 써드파티 라이브러리를 이용해서 해결할 수 밖에 없습니다.
물론 디바이스마다 구글STT와 Recording이 되는 기기도 있습니다.
마이크 채널이 2개여서 그런데 태블릿같은 채널이 1개인 기기는
동시 녹음이 안됩니다.
아무튼 긴글 읽어주셔서 감사합니다.
'개발 > 안드로이드' 카테고리의 다른 글
안드로이드 뷰가 그려지는 과정 (0) | 2021.06.09 |
---|---|
안드로이드 LiveData setValue 와 postValue (0) | 2021.05.13 |
Android MVVM Example 프로젝트 (0) | 2021.04.01 |
안드로이드 MVVM에 GraphQL 적용하기(2/2) (0) | 2020.07.19 |
안드로이드 MVVM에 GraphQL 적용하기(1/2) (0) | 2020.07.19 |
댓글