Das Projekt erfordert die Verwendung der Sprachveränderung von PCM-Audio-Daten für menschliche Sprache . Nachdem ich eine Woche lang gekämpft hatte, fand ich schließlich einen Rahmen für die reine Java -Implementierung - Tarsosdsp. Sehr mächtig! Echtzeit-Audioverarbeitung! Natürlich habe ich nur die Dateiverarbeitung verwendet. Tatsächlich ist die Logik die gleiche
Die Github -Adresse von Tarsosdsp: https://github.com/jorensix/tarsSdSP integriert sie in seine eigenen Projektprojekte.
Spezifischer Java Tool Class Code:
/*** Voice Change* @param rawpcMinputStream RAW PCM -Dateneingangsstream* @Param SpeedFactor Variationsrate (0,2) Mehr als 1 beschleunigt die Sprachgeschwindigkeit, weniger als 1 verlangsamt die Sprachgeschwindigkeit* @param -RateFactor -Änderungsrate (0,2). public static InputStream SprachpitchShift (endgültiger InputStream RAWPCMinputStream, Double SpeedFactor, Double RateFactor) {TarsosdSpaudioformat Format = neuer TarsosdsSpaudioformat (16000,16,1, wahr, Falsch); AudioInputStream InputStream = New AudioInputStream (RAWPCMinputStream, JVMADioInputStream.toaudioFormat (Format), Audiosystem.not_Specified); JVMAudioInputStream Stream = new JVMAudioInputStream (InputStream); WaveFormSIMilarity -basedOverlapadd w = new WaveFormsimility -basedoverlapadd (WaveFormSIMility -basedOverlapadd.Parameters.speechdefaults (SpeedFactor, 16000)); int InputBufferSize = w.getInputBufferSize (); int überlappung = w.getOverlap (); Audiodispatcher dispatcher = new audiodispatcher (stream, InputBufferSize, Überlappung); W.SetDispatcher (Dispatcher); AudiooutputToBytearray out = new audiooutputToBytearray (); Dispatcher.Addaudioprocessor (W); Dispatcher.Addaudioprocessor (neuer Ratetransposer (RateFactor)); Dispatcher.Addaudioprocessor (out); Dispatcher.run (); Neue BytearrayInputStream zurückgeben (out.getData ()); }Der Code von Data Transcript (AudioOutputToBytearray) lautet wie folgt:
public class audiooutputToBytearray implementiert Audioprocessor {private boolean isdone = false; privates Byte [] out = null; private BytearrayoutputStream Bos; public audiooutputToBytearray () {bos = new bytearrayoutputStream (); } public byte [] getData () {while (! isdone && out == null) {try {thread.sleep (10); } catch (InterruptedException ignoriert) {}} return out; } @Override public boolean prozess (audioEvent audioEvent) {bos.write (audioEvent.getBuffer (), 0, audioEvent.getByTebuffer (). Länge); zurückkehren; } @Override public void processingFinished () {out = bos.tobytearray (). Clone (); bos = null; isdone = true; }}Sie können Audio über dieses Tool abspielen:
/** * PCM * * Rufen Sie nicht in Nicht-Desktop-Umgebungen auf. . . Was wissen Sie, was passieren wird? AudioInputStream InputStream = New AudioInputStream (RAWPCMinputStream, JVMADioInputStream.toaudioFormat (Format), Audiosystem.not_Specified); JVMAudioInputStream Stream = new JVMAudioInputStream (InputStream); Audiodispatcher dispatcher = new audiodispatcher (stream, 1024, 0); Dispatcher.Addaudioprocessor (neuer Audioplayer (Format, 1024)); Dispatcher.run (); }