O projeto requer o uso do processamento de mudança de voz dos dados de áudio de voz humana do PCM . Depois de lutar por uma semana, finalmente encontrei uma estrutura para a implementação pura de Java - Tarsosdsp. Muito poderoso! Processamento de áudio em tempo real! Claro que eu só usei o processamento de arquivos. De fato, a lógica é a mesma
Endereço do Github do Tarsosdsp: https://github.com/jorensix/tarsoSDSP o integra em seus próprios projetos de projeto.
Código específico da classe da ferramenta java:
/*** Mudança de voz* @param RawpcMinputStream PCM Raw Data de entrada de dados Fluxo de variação de velocidade de velocidade @Param (0,2) Maior que 1 está acelerando a velocidade de fala, menor que 1 é uma desaceleração da velocidade* @Param Taxa de taxa de alteração de valor (0,2) Maior que 1 é um abaixamento () @Param Taxa de taxa de fator é uma taxa de alteração de fábrica (0,2) maior que 1 é uma abordagem () @Param 1 é 1 é uma taxa de alteração de TakeM, é uma queda de tonalidade de fixo (0,2. Public estático inputStream SpeechPitchShift (Final InputStream RawPcMinputStream, Factor Speed Double, Factor de Taxa Double) {TarsosdsPaudioFormat Format = New TarsoSDSPaudioformat (16000,16,1, verdadeiro, false); AudioInputStream inputStream = new AudioInputStream (RawpcMinputStream, jvmaudioInputStream.toaudioFormat (formato), Audiosystem.Not_Specified); JvmaudioInputStream Stream = new JvmaudioInputStream (inputStream); WaveFormSimilarityBandedOverlapadd W = New WaveFormSimilarityBandedOverlapadd (WaveFormSimilarityBastoverlapadd.parameters.SpeechDefaults (SpeedFactor, 16000)); int inputBuffersize = w.getInputBuffersize (); int sobreposição = w.getOverlap (); Dispatcher Audiodispatcher = new Audiodispatcher (Stream, InputBuffersize, Sobreposição); W.SetDispatcher (Dispatcher); AudioOutputTobyTearray Out = new AudioOutputTobyTearray (); Dispatcher.addaudioprocessor (W); Dispatcher.Addaudioprocessor (novo RateTransposer (TakeFactor)); Dispatcher.addaudioprocessor (Out); Dispatcher.run (); retornar novo bytearrayInputStream (out.getData ()); }O código de transcrição de dados (AudioOutputTobyTearAray) é o seguinte:
classe pública AudioOutputTobyTearray implementa o audioprocessador {private boolean isDone = false; byte privado [] out = null; BytearrayOuttStream Bos privado; public AudioOutputToByTearray () {bos = new ByteArrayOutputStream (); } public byte [] getData () {while (! isdone && out == null) {try {thread.sleep (10); } catch (interruptedException ignorado) {}} retornar; } @Override Public Boolean Process (AudioEvent AudioEvent) {Bos.Write (AudioEvent.getByteBuffer (), 0, AudioEvent.getByteBuffer (). Length); retornar true; } @Override public void ProcessingFinished () {out = bos.tobytearray (). Clone (); bos = nulo; isdone = true; }}Você pode reproduzir áudio através desta ferramenta:
/** * Reproduza PCM * * Não ligue para ambientes não-DESKTOP. . . O que você sabe o que acontecerá* @Param RawpcMinputStream PCM Raw Data de entrada Stream* @Throws LineUNAVALABLEEXCECTIMENTO*/ public Static Void Play (InputStream final RawPcMinputStream) lança lineUnAVALABLEEXCECTION (TarsoSDSPAUDIOFORMATATATATEM1, TarSOSDSPAUDIOMOMMATAUMATOMATATAT (16) AudioInputStream inputStream = new AudioInputStream (RawpcMinputStream, jvmaudioInputStream.toaudioFormat (formato), Audiosystem.Not_Specified); JvmaudioInputStream Stream = new JvmaudioInputStream (inputStream); Dispatcher Audiodispatcher = novo Audiodispatcher (Stream, 1024, 0); Dispatcher.addaudioprocessor (novo AudioPlayer (formato, 1024)); Dispatcher.run (); }