본문 바로가기
개발/안드로이드

안드로이드 구글STT에서 Recording이 안되는 이유

by 창이2 2021. 4. 26.

안녕하세요.

이번 포스팅은 구글STT를 실행하면서 Recording하는 방법을

알려드리고 싶지만 현재 기술적으로 불가능해서

왜 안되는지에 대한 이유를 알려드리기 위해 적게 되었습니다.

구글STT는 Recording한 데이터를 가지고 서버에 보내서

해당 결과값을 받아 처리하게 되어있습니다.

이 과정에서 마이크 채널을 구글 STT가 점유하게 되는데

우리가 Recording을 하기 위해 AudioRecord나 MediaRecord를 쓸때도 마이크 채널을 씁니다.

즉 2개의 앱에서 마이크 채널을 사용하기 때문에 먼저 실행된 앱이

먼저 점유권을 가지에 되어 한쪽은 실행되고 다른 한쪽은 실행이 안되는 것입니다.

 

입력 공유에 대한 내용은 아래 사이트에서 확인하실 수 있습니다.

developer.android.com/guide/topics/media/sharing-audio-input?hl=ko

 

오디오 입력 공유  |  Android 개발자  |  Android Developers

일반적으로 오디오 입력은 내장 마이크, 외부 마이크 또는 기기에 연결된 오디오 인터페이스에서 들어옵니다. 또한 전화 통화에서도 오디오가 입력될 수 있습니다. 두 개 이상의 앱이 동일한 오

developer.android.com

 

구글 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개인 기기는

동시 녹음이 안됩니다.

 

아무튼 긴글 읽어주셔서 감사합니다.

댓글