Kotlin을 이용한 음성 녹음 어플 만들기
by Cori회의록을 자동으로 작성해주는 프로젝트를 진행하는 과정에서, 음성 녹음 어플이 필요해 만들어보았다.
음성 녹음 프로그램은 음성 녹음, 음소거, 녹음 중지 기능을 가지고 있고, 각각에 대해 짤막하게 다뤄본다.
디자인
음성 녹음, 음소거, 녹음 중지 기능은 버튼을 만들어 각 버튼이 눌릴 때마다 호출되도록 설정했다.
음성 녹음
녹음 버튼을 클릭하면 녹음이 진행중인지 우선 확인하고, 이후 기기에서 녹음 권한을 허용했는지 확인한다.
두 과정에서 문제가 없다면, 음성 녹음 객체(AudioRecord)와 녹음 품질 개선을 위한 NoiseSuppressor를 생성한다.
이후 음성 녹음을 진행하며, 녹음데이터는 쓰레드를 활용해 하이브리드 방식으로 메모리 및 기기에 저장된다.
* 하이브리드 방식이란 ?
녹음 데이터를 메모리 버퍼 상에 저장하고, 버퍼 크기가 일정량 이상이면 버퍼에 쌓인 데이터를 파일로 내보내는 방식.
파일로 내보낸 후, 버퍼에 쌓인 데이터를 초기화 시킴으로써 메모리 과부화를 방지할 수 있다.
음소거
음소거 기능은 isMuted 기능으로 관리한다. 음소거 버튼을 누르면 isMuted가 True인 경우 False로, False인 경우
True로 바꾼다. 음소거 설정이 되어 있는 동안은, 음성 데이터 값이 0으로 설정되어 파일에 저장된다.
(음소거 기간 동안 데이터가 저장 안되는게 아님 !)
녹음 중지
녹음 중지 버튼을 클릭하면 음성 녹음 객체와 NoiseSuppressor 객체에 대해 자원 해제한다.
이후 쓰레드를 사용해 백그라운드에서, 앞서 실시간으로 저장한 pcm 녹음 파일을 wav 파일로 변환한다.
pcm 파일을 wav 파일로 변환하기 위해서는 추가적인 wavHeader를 준비해주어야 한다.
파일 저장 경로
녹음이 완료된 파일을 기기의 저장소에 저장하기 위해 경로 설정을 해주는 과정에서 살짝 애를 먹었다.
경로는 다음과 같이 설정해주면 되고, 적용이 되지 않았던 경로 설정은 더보기에서 확인할 수 있다.
"${Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)}/audiorecord_${System.currentTimeMillis()}.pcm" // outputFile
* "${getExternalFilesDir(Environment.DIRECTORY_MUSIC)}/audiorecord_${System.currentTimeMillis()}.pcm" 이렇게 적용할 시 파일이 보이지 않는다.
전체 코드
전체 코드 및 테스트해 볼 수 있는 apk 파일은 다음 깃허브 레포에 올려두었다.
'CS > Kotlin' 카테고리의 다른 글
맥북에서 Kotlin 사용하기 (4) | 2024.11.25 |
---|
블로그의 정보
코딩하는 오리
Cori