안녕하세요 아즈라엘 입니다.
이번에 AudioRecord 를 통해서 음성을 녹음을 하고 음성이 어느정도 되면
자동으로 AudioTrack 을 통해서 사운드를 출력합니다.
쉽게 말하면 Talking Tom 과 같이 말을 하면 알아서 들어먹고 같은 말을 하는거죠..
음원을 조금 빠르게 해서 변조도 합니다...
문제는 사람이 말하는게 아니라 디바이스에서 나오는 소리도 마이크로 다시 들어가서
그걸 녹음하니.. 원하지 않는 동작을 하게 됩니다.
-- 소스 내용 --
dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File(recordingFile))));
int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, audioEncoding, bufferSize);
while (isRecording) {
if (isPlaying) {
continue;
}
short[] buffer = new short[bufferSize];
audioRecord.startRecording();
int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);
for (int i = 0; i < bufferReadResult; i++) {
if (recordingEnable) {
dos.writeShort(buffer[i]);
}
if (buffer[i] > 0x2FF0) {
recordingEnable = true;
}
}
}
대충 이렇게 해서 어느정도 음성체크를 합니다 근데 정확하게 말하자면 음성이라기 보단 마이크로 들어온 데쉬벨 크기정도라
생각하면 되겠네요.. 그냥 잡음의 크기가 얼마나?에 따라 반응하게 만든것입니다만..
혹시 마이크 보이스 필터링 할 수 있는 방법은 어떻게 해야 할까요?
아니면 디바이스에서 마이크로 들어오는 소리를 어떻게 막을까요? (이게 더 어려워 보입니다만..)
점점 일반 SDK 영역을 벗어나야 하는가? 라는 생각이 드는군요
TalkingTom 이 왜 FFMpeg 와 SoundTouch 를 사용했는지 이해가 가기도 하고..
단지 멀티플렛폼 지원때문에 한것이라 생각했는데 ... 기능때문에 한거 같기도 하네요..
윽...ㅠㅠ
원하시는 기능을 구현하시려면, VAD(voice activity detection) 에 대해서 검색해보시기 바랍니다. 간단히 설명 드리자면, 신호처리 관련 용어 인데, 해당 알고리즘을 이용하여, 잡음 상황에서 말구간을 검출하는 것을 말합니다. 알고리즘을 구현해야 하는데, 오픈된 라이브러리가 있는지 까지는 잘모르겠네요... 이걸 적용할경우 확실히 좀더 명확하게 잡음 과 말소리를 구분하는데 도움이 되겠죠...
정보가 도움이 되셨으면 좋겠네요 ^^;
속도 때문에...Native 영역으로 내려가야 할 판이네요 ㅠㅠ
http://mobilepearls.com/labs/native-android-api/opensles/index.html
에서 참고 하고 있습니다.
NDK folder platforms/android-9/samples/native-audio/. 에 볼만한 샘플이 있긴하네요..
문제가 버전이...
소리 출력이 다시 입력으로 들어가는 것을 막기 위해서 보통은 echo cancellation 이라는 기술을 사용합니다. 많이 사용하는 용어이니 검색해보시면 자료가 나올 것 같네요. 저도 자세히 알지는 못하지만 혹시나 도움이 될까해서 적고 갑니다.
여러분들의 도움이 커서 잘 되었습니다.
특히 MediaRecorder.AudioSource.MIC / MediaRecorder.AudioSource.VOICE_RECOGNITION 차이가
엄청 크게 나오는데..
일단 마이크에서 자체 보이스 필터링을 약간하는게 .VOICE_RECOGNITION 입니다만
마이크에서 멀리 떨어지면 에코가 생겨서 들어갑니다.
그냥가자님과 ayoung님 조언이 크게 도움이 되었습니다. 감사합니다.




MediaRecorder.AudioSource.MIC 대신에 MediaRecorder.AudioSource.VOICE_RECOGNITION 함 넣어보시죠...
약간 차이가 난다고 들은거 같은데요...