El proyecto requiere el uso del procesamiento de cambio de voz de datos de audio de voz humana PCM . Después de luchar durante una semana, finalmente encontré un marco para la implementación pura de Java: TarsossDSP. ¡Muy poderoso! Procesamiento de audio en tiempo real! Por supuesto, solo usé el procesamiento de archivos. De hecho, la lógica es la misma
Dirección de GitHub de Tarsosdsp: https://github.com/jorensix/tarsosdsp lo integra en sus propios proyectos de proyectos.
Código de clase de herramienta de Java específica:
/ *** Cambio de voz* @param rawpcminputstream stream de entrada de datos de PCM sin procesar* @param velocidad de variación de factor de velocidad (0,2) mayor que 1 acelera la velocidad del habla, menos de 1 es una velocidad de velocidad de la velocidad del habla* @param tasa de tasa tasa de cambio de tono (0,2) mayor que 1 es un toque que disminuye (profundo), menos de 1 es un boating el lanzamiento (sharp)* sharp). InputStream staticStream SpeacePitchShift (Final InputStream RawPCMinputStream, Double SpeedFactor, Double Tarifactor) {TarsosdsPaudioFormat Format = new TarSosdspaudioFormat (16000,16,1, verdadero, falso); AudioInputStream inputStream = new AudioInputStream (RAWPCMInputStream, JVMaudioInputStream.ToaudioFormat (Format), Audiosystem.Not_Specified); JVMaudioInputStream Stream = new JVMaudioInputStream (InputStream); WaveFormsimilarityBasedOverLapAdd W = New WaveFormsimilarityBasedOverLapAdd (WaveFormSimilarityBaseDoverLapadd.Parameters.speechDefaults (SpeedFactor, 16000)); int inputBufferSize = w.getInputBufferSize (); int superlap = w.getOverlap (); Audiodispatcher despachador = nuevo audiodispatcher (stream, inputBufferSize, superposición); W.SetDispatcher (despachador); AudioutputToByTearray out = new AudioOutputToByTearray (); despachador.addaudioprocesador (w); despachadores despachador.addaudioprocessor (fuera); despachador.run (); devolver nuevo bytearrayInputStream (out.getData ()); }El código de transcripción de datos (audioOutputToByTearray) es el siguiente:
clase pública audioOutputToByTearray implementa audioprocesador {private boolean isDone = false; byte privado [] out = null; privado bytearrayoutputstream bos; public audioOutputToByTearray () {bos = new ByteArRayOutputStream (); } public byte [] getData () {while (! isDone && out == null) {try {horth.sleep (10); } capt (interruptedException ignorado) {}} return out; } @Override Public Boolean Process (audioEvent AudioEvent) {bos.write (audioEvent.getByteBuffer (), 0, audioEvent.getByteBuffer (). Longitud); devolver verdadero; } @Override public void processFinished () {out = bos.tobytearray (). Clone (); bos = nulo; isDone = verdadero; }}Puedes reproducir audio a través de esta herramienta:
/** * Play PCM * * No llame en entornos que no sean de Desktop. . . ¿Qué sabe qué sucederá* @param RawPCMinputStream Raw PCM Data Input Stream* @throws lineUnVailableException*/ Public static void Play (Final InputStream RAWPCMInputStream) lanza LineUnaveAilableException {TarsSSPaudioFormat Format = New TarSosSDIOFormat (16000,16,1, verdadero, falso); AudioInputStream inputStream = new AudioInputStream (RAWPCMInputStream, JVMaudioInputStream.ToaudioFormat (Format), Audiosystem.Not_Specified); JVMaudioInputStream Stream = new JVMaudioInputStream (InputStream); Audiodispatcher despachador = nuevo audiodispatcher (transmisión, 1024, 0); despachador.addaudioprocessor (nuevo AudioPlayer (formato, 1024)); despachador.run (); }