โครงการต้องการการใช้ การประมวลผลการเปลี่ยนเสียงของข้อมูลเสียงเสียงมนุษย์ PCM หลังจากดิ้นรนเป็นเวลาหนึ่งสัปดาห์ในที่สุดฉันก็พบกรอบสำหรับการใช้งาน Java บริสุทธิ์ - Tarsosdsp ทรงพลังมาก! การประมวลผลเสียงแบบเรียลไทม์! แน่นอนฉันใช้การประมวลผลไฟล์เท่านั้น ในความเป็นจริงตรรกะเหมือนกัน
ที่อยู่ GitHub ของ Tarsosdsp: https://github.com/jorensix/tarsosdsp รวมเข้ากับโครงการโครงการของตัวเอง
รหัสคลาส Java Tool เฉพาะ:
/*** การเปลี่ยนเสียง* @param rawpcminputstream ข้อมูลอินพุตข้อมูล PCM ดิบ* @param @param อัตราการแปรผันของตัวเร่งความเร็ว (0,2) มากกว่า 1 กำลังเร่งความเร็วในการพูดน้อยกว่า 1 คือการชะลอความเร็วในการพูด Public Static InputStream SpeechPitchShift (ขั้นสุดท้าย InputStream RAWPCMINPUTSTREAM, Double SpeedFactor, Double Ratefactor) {รูปแบบ tarsosdspaudioformat = ใหม่ tarsosdspaudioformat (16000,16,1, จริง, เท็จ); AudioInputStream InputStream = ใหม่ AudioInputStream (RAWPCMInputStream, JVMAUDIOINPUTSTREAM.TOAUDIOFORMAT (รูปแบบ), AudiOSYSTEM.NOT_SPECIFIED); jvmaudioInputStream stream = ใหม่ jvmaudioInputStream (inputStream); WaveformsimilarityBasedOverlapadd W = ใหม่ WaveformsimilarityBasedOverlapadd (WaveformsimilarityBasedOverlapadd.parameters.SpeechDefaults (SpeedFactor, 16000)); int inputBuffersize = w.getInputBuffersize (); int ทับซ้อน = w.getoverlap (); Audiodispatcher dispatcher = ใหม่ Audiodispatcher (สตรีม, อินพุต Buffersize, ซ้อนทับ); W.SetDispatcher (dispatcher); AudioOutputTobyTearray out = ใหม่ AudioOutputTobyTeArray (); dispatcher.addaudioprocessor (W); dispatcher.addaudioprocessor (Ratetransposer ใหม่ (Ratefactor)); dispatcher.addaudioprocessor (ออก); dispatcher.run (); ส่งคืน ByteArrayInputStream ใหม่ (out.getData ()); -รหัสการถอดเสียงข้อมูล (AudioOutputTobyTearray) มีดังนี้:
คลาสสาธารณะ AudioOutputTobyTearray ใช้ Audioprocessor {บูลีนส่วนตัว iSdone = FALSE; ไบต์ส่วนตัว [] out = null; Private ByteArrayOutputStream BOS; Public AudioOutputToByTeArray () {BOS = ใหม่ byteArrayOutputStream (); } ไบต์สาธารณะ [] getData () {ในขณะที่ (! isdone && out == null) {ลอง {thread.sleep (10); } catch (interruptedException ถูกละเว้น) {}} ส่งคืน; } @Override กระบวนการบูลีนสาธารณะ (AudioEvent AudioEvent) {bos.write (AudioEvent.getByTebuffer (), 0, AudioEvent.getByTebuffer (). ความยาว); กลับมาจริง; } @Override โมฆะสาธารณะการประมวลผล finished () {out = bos.tobytearray (). clone (); bos = null; isdone = true; -คุณสามารถเล่นเสียงผ่านเครื่องมือนี้:
/** * เล่น PCM * * อย่าโทรในสภาพแวดล้อมที่ไม่ใช่ Desktop - - คุณรู้ว่าจะเกิดอะไรขึ้น* @param rawpcminputstream ข้อมูลอินพุตข้อมูล PCM ดิบ* @throws lineUnavailableexception*/ การเล่นแบบสแตติกสาธารณะสาธารณะ AudioInputStream InputStream = ใหม่ AudioInputStream (RAWPCMInputStream, JVMAUDIOINPUTSTREAM.TOAUDIOFORMAT (รูปแบบ), AudiOSYSTEM.NOT_SPECIFIED); jvmaudioInputStream stream = ใหม่ jvmaudioInputStream (inputStream); Audiodispatcher dispatcher = ใหม่ Audiodispatcher (สตรีม, 1024, 0); dispatcher.addaudioprocessor (เครื่องเสียงใหม่ (รูปแบบ, 1024)); dispatcher.run (); -