글
음성파일의 재생속도를 조절하기 위해서 검색을 해보니 그중에 가장 간단한 방식을 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/
'안드로이드' 카테고리의 다른 글
SoundTouch 라이브러리를 사용한 재생 속도 제어 (0) | 2014.11.28 |
---|---|
ffmpeg 라이브러리를 사용한 오디오 재생 (1) | 2014.11.20 |
ringdroid에 libmpg123 적용하기 (0) | 2014.09.15 |
ringdroid에 JLayer MP3 디코더 적용하기 (0) | 2014.09.12 |
ringdroid에서 mp3 waveform이 잘못 나오는 문제 수정 (0) | 2014.09.09 |
RECENT COMMENT