안드로이드
Sonic 라이브러리
dumpcookie
2014. 10. 2. 23:17
음성파일의 재생속도를 조절하기 위해서 검색을 해보니 그중에 가장 간단한 방식을 sonic 라이브러리(LGPL)가 지원하고 있었다. sonic-ndk라는 안드로이드에 직접 적용한 간단한 앱 소스도 있었다.
https://github.com/waywardgeek/sonic-ndk
이게 약간 낡아서 최신 빌드환경에서 빌드가 제대로 안되길래 몇가지 메시지를 추가해 주었으며 변경된 소스는 다음에서 받을 수 있다.
https://github.com/wkpark/sonic-ndk
Sonic라이브러리에서 쓰는 재생속도 조절 방식은 음성에 대해서 적합하다고 하며 빠른 재생속도에도 아주 자연스러운 목소리를 들을 수 있는 장점이 있었다. (자세한 내용은 다음 링크를 참조하세요)
http://dev.vinux-project.org/sonic/
소스를 보면 매우 간단한 방식으로 처리하고 있으며, 다음과 같은 방식으로 사용된다.
... Sonic sonic = new Sonic(sampleRate, nChannels); // sampleRate는 오디오 파일로부터, 채널도 오디오파일로부터 byte samples[] = new byte[4096]; byte modifiedSamples[] = new byte[2048]; sonic.setSpeed(speed); // 재생속도 설정 do { try { bytesRead = soundFile.read(samples, 0, samples.length); // WAV파일로부터 읽음 } catch (IOException e) { e.printStackTrace(); return; } if (bytesRead > 0) { sonic.putBytes(samples, bytesRead); // sonic라이브러리로 변형. } else { sonic.flush(); } int available = sonic.availableBytes(); if (available > 0) { if(modifiedSamples.length < available) { modifiedSamples = new byte[available*2]; } sonic.receiveBytes(modifiedSamples, available); track.write(modifiedSamples, 0, available); // AudioTrack에 쓴다. } } while (bytesRead > 0); track.flush(); ...
추가: 참고로 sonic 라이브러리는 안드로이드 M 버전부터 정식으로 채용되어 안드로이드에서도 사용할 수 있게 되었고 이를 이용한 재생 속도 조절이 안드로이드 자체적으로도 가능하게 되었다.
추가된 sonic 소스: https://android.googlesource.com/platform/external/sonic/