음성파일의 재생속도를 조절하기 위해서 검색을 해보니 그중에 가장 간단한 방식을 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/

by dumpcookie 2014. 10. 2. 23:17