Proyek ini membutuhkan penggunaan pemrosesan data audio suara manusia PCM yang mengubah suara . Setelah berjuang selama seminggu, saya akhirnya menemukan kerangka kerja untuk implementasi Java murni - Tarsosdsp. Sangat kuat! Pemrosesan audio real-time! Tentu saja saya hanya menggunakan pemrosesan file. Faktanya, logikanya sama
Alamat GitHub Tarsosdsp: https://github.com/jorensix/tarsosdsp mengintegrasikannya ke dalam proyek proyeknya sendiri.
Kode kelas alat Java spesifik:
/*** Perubahan suara* @param rawpcminputStream aliran input data pcm mentah stream* @param speedfactor rate (0,2) Lebih besar dari 1 mempercepat kecepatan bicara, kurang dari 1 adalah memperlambat kecepatan ucapan* @param laju nada nada (0,2) lebih besar dari 1 pitch yang lebih rendah (lebih rendah), lebih rendah dari 1 pitch (0,2) pitch (0,2) lebih rendah dari pitch (0,2) pitch (0,2) lebih rendah dari pitch (0,2) lebih rendah dari pitch (0,2) lebih rendah dari pitch (0,2) lebih rendah dari pitch (0,2) lebih rendah dari pitch (0,2. Ubah*/ Public InputStream SpeechPitchShift (InputStream Final RawPcminputStream, Double SpeedFactor, Double RateFactor) {tarsosdspaudioformat format = Tarsosdspaudioformat baru (16000,16,1, benar, palsu); AudioInputStream inputStream = AudioInputStream baru (RAWPCMInputStream, jvmaudioInputStream.toAudioformat (format), audiosystem.not_specified); JVMAudiOInputStream stream = JVMAudiOInputStream baru (InputStream); WaveFormSimilarityBasedOverlapadd w = New WaveFormSimilarityBasedOverlapAdd (WaveFormSimilarityBasedOverlapadd.parameters.speechDefaults (SpeedFactor, 16000)); int inputBufferSize = w.getInputBufferSize (); int overlap = w.getOverlap (); AudioDispatcher Dispatcher = AudioDispatcher baru (Stream, InputBufferSize, Overlap); W.SetDispatcher (Dispatcher); AudioOutputToByTeArray out = AudioOutputToByRay baru baru; dispatcher.addaudioprocessor (W); dispatcher.addaudioprocessor (ratetransposer baru (rateFactor)); dispatcher.addaudioprocessor (out); dispatcher.run (); kembalikan bytearrayInputStream baru (out.getData ()); }Kode transkrip data (audiooutputToByTeArray) adalah sebagai berikut:
kelas publik audiooutputToByTeArray mengimplementasikan audioprocessor {private boolean isDone = false; byte pribadi [] out = null; Private ByteArrayOutputStream BOS; AudioOutputToByTeArray publik () {bos = new ByteArrayOutputStream (); } byte publik [] getData () {while (! isDone && out == null) {coba {thread.sleep (10); } catch (InterruptedException diabaikan) {}} kembali; } @Override Public Boolean Process (AudioEvent AudioEvent) {bos.write (audioevent.getByTeBuffer (), 0, AudioEvent.getByTeBuffer (). Panjang); Kembali Benar; } @Override public void processingFinished () {out = bos.tobyteArray (). Clone (); bos = null; isDone = true; }}Anda dapat memainkan audio melalui alat ini:
/** * Mainkan PCM * * Jangan menelepon di lingkungan non-desktop. . . What do you know what will happen* @param rawPcmInputStream Raw PCM data input stream* @throws LineUnavailableException */ public static void play(final InputStream rawPcmInputStream) throws LineUnavailableException { TarsosDSPAudioFormat format = new TarsosDSPAudioFormat(16000,16,1,true,false); AudioInputStream inputStream = AudioInputStream baru (RAWPCMInputStream, jvmaudioInputStream.toAudioformat (format), audiosystem.not_specified); JVMAudiOInputStream stream = JVMAudiOInputStream baru (InputStream); AudioDispatcher Dispatcher = AudioDispatcher baru (Stream, 1024, 0); dispatcher.addaudioprocessor (audioplayer baru (format, 1024)); dispatcher.run (); }