이 프로젝트는 PCM Human Voice Audio 데이터의 음성 변화 처리를 사용해야합니다. 일주일 동안 고군분투 한 후 마침내 순수한 Java 구현 (Tarsosdsp)의 프레임 워크를 찾았습니다. 매우 강력합니다! 실시간 오디오 처리! 물론 파일 처리 만 사용했습니다. 실제로 논리는 동일합니다
tarsosdsp의 github 주소 : https://github.com/jorensix/tarsosdsp는 자체 프로젝트 프로젝트에 통합합니다.
특정 Java 도구 클래스 코드 :
/*** 음성 변경* @param rawpcminputStream 원시 PCM 데이터 입력 스트림* @Param SpeedFactor 변동 속도 (0,2) 1보다 큰 음성 속도를 가속화하고 있으며 1 미만은 음성 속도 속도 속도를 늦추고 있습니다* @Param 속도 변형기 톤 변경 속도 (0,2) 1보다 큰 피치 (깊은). public static inputStream SpectionPitchshift (최종 입력 스트림 RAWPCMINPUTSTREAM, Double SpeedFactor, Double RateFactor) {tarsosdspaudioformat 형식 = 새로운 tarsosdspaudioformat (16000,16,1, true, false); AudioInputStream inputStream = new AudioInputStream (rawpcminputStream, jvmaudioinputstream.toaudioformat (형식), 오디오 시스템.not_specified); JVMAUDIOINPUTSTREAM 스트림 = 새로운 JVMAUDIOINPUTSTREAM (inputStream); WaveFormsImilarityBasedOverLapAdd w = new waveformsimilarityBasedOverLapAdd (weveFormsImilarityBasedOverLapAdd.parameters.SpeechDefaults (SpeedFactor, 16000)); int inputbuffersize = w.getInputBuffersize (); int 겹침 = w.getoverlap (); Audiodispatcher Dispatcher = 새로운 Audiodispatcher (스트림, 입력 부패 규모, 오버랩); W.SetDispatcher (디스패처); AudioOutputToByTeAreRay Out = 새로운 AudioOutputToByTeAreRay (); Dispatcher.addaudioprocessor (w); Dispatcher.addaudioprocessor (New Ratetransposer (ratefactor)); Dispatcher.addaudioprocessor (Out); dispatcher.run (); 새로운 BytearRayInputStream을 반환합니다 (out.getData ()); }Data Transcript (AudioOutputTobyTeArray) 코드는 다음과 같습니다.
공개 클래스 AudioOutputToByteAreRray는 오디오 프로세서 {private boolean isdone = false; 개인 바이트 [] out = null; 개인 BytearRayoutputStream BOS; public audiooutputtobytearray () {bos = new BytearRayoutputStream (); } public byte [] getData () {while (! isdone && out == null) {try {thread.sleep (10); } catch (InterpruptedException 무시) {}} retove out; } @override public boolean process (audioevent audioevent) {bos.write (audioevent.getBytebuffer (), 0, audioevent.getBytebuffer (). length); 진실을 반환하십시오. } @override public void processingFinished () {out = bos.tobytearRay (). clone (); bos = null; isdone = 참; }}이 도구를 통해 오디오를 재생할 수 있습니다.
/** * PCM 플레이 * * 비 데스 탑 환경에서 호출하지 마십시오. . . 무슨 일이 일어날 지 아는 것* @param rawpcminputstream raw pcm data input stream* @throws lineunavailableException*/ public static void play (최종 입력 rewpcminputstream) 라인 afailableableexception {tarsosdspudioformat = new tarsosdspaudioformat (16,000,1, true, false); AudioInputStream inputStream = new AudioInputStream (rawpcminputStream, jvmaudioinputstream.toaudioformat (형식), 오디오 시스템.not_specified); JVMAUDIOINPUTSTREAM 스트림 = 새로운 JVMAUDIOINPUTSTREAM (inputStream); Audiodispatcher Dispatcher = New Audiodispatcher (Stream, 1024, 0); Dispatcher.addaudioprocessor (New Audioplayer (Format, 1024)); dispatcher.run (); }