Le projet nécessite l'utilisation du traitement changeant vocal des données audio vocales humaines PCM . Après avoir lutté pendant une semaine, j'ai finalement trouvé un cadre pour la mise en œuvre de Java pure - TarsosDSP. Très puissant! Traitement audio en temps réel! Bien sûr, je n'ai utilisé que le traitement de fichiers. En fait, la logique est la même
Adresse GitHub de TarsosDSP: https://github.com/jorensix/tarsosdsp l'intégre dans ses propres projets de projet.
Code de classe d'outils Java spécifique:
/ ** * Changement vocal * @param RawPcMinputStream Raw PCM Data Entry Stream * @Param SpeedFactor Variation Rate (0,2) supérieur à 1 accélère la vitesse de la parole, moins de 1 est un ralentissement de la vitesse de la parole * @param ratefactor taux de changement STATIQUE INPUTSTREAM SpeechPitchshift (Final InputStream RawPcMinputStream, double speedfactor, double ratefactor) {TarsosdspaudioOrt Format = new TarsosdspaudioOrt (16000,16,1, true, false); AudioInputStream inputStream = new AudioInputStream (RawPcMinputStream, JvMaudiOInputStream.toaudioOrt (format), Audiosystem.not_specified); JVMAMADIOInputStream Stream = new JVMaudiOInputStream (InputStream); WAVEFORMILITÉS-BASIEDOVERLAPADD W = NOUVEAU FORME D'AVETSIMILITÉSIDEVELAPADD (WAVEFIMILITALITYBASTIONDELAPADDD.PARAMETERS.SPEECHDEFAULTS (SpeedFactor, 16000)); int inputBuffeSize = w.getInputBuffeSize (); int chevauchement = w.getOverlap (); AuDiDispatcher Dispatcher = new AUDIDispatcher (Stream, InputBuffeSize, chevauche); w.setdispatcher (répartiteur); AudioOutputToByTeArray out = new AudioOutputToByTearray (); Dispatcher.AdDaudioprocesseur (W); Dispatcher.AdDaudioprocesseur (nouveau RateTransPoser (RateFactor)); Dispatcher.AdDaudioprocesseur (Out); Dispatcher.run (); Renvoie un nouveau byteArrayInputStream (out.getData ()); }Le code de transcription des données (AudioOutputToByteArray) est le suivant:
classe publique AudioOutputToByTearray implémente AudioProcesseur {private boolean isdone = false; octet privé [] out = null; BOS BYTEARAYOutSTURSTREAM privé; public audioOutputToByTearray () {bos = new bytearrayoutputStream (); } byte public [] getData () {while (! Isdone && out == null) {try {thread.sleep (10); } catch (InterruptedException ignoré) {}} return out; } @Override public Boolean Process (AudioEvent AudioEvent) {bos.write (AudioEvent.getByteBuffer (), 0, AudioEvent.getByTeBuffer (). Length); Retour Vrai; } @Override public void ProcessingFinished () {out = bos.toByTearray (). Clone (); bos = null; isDone = true; }}Vous pouvez lire de l'audio via cet outil:
/ ** * Play PCM * * N'appelez pas dans des environnements non-desktop. . . Que savez-vous ce qui va se passer * @param rawpcMinputStream brut pcm Data Input Stream * @throws lineUnavailableException * / public static void play (final inputStream RawPcMinputStream) lève LineUnavailException {TARSOSDSPAMADOROOFORMAT FORMAT = new TarsosdspAudioFormat (16000,16 ,1, true, false); AudioInputStream inputStream = new AudioInputStream (RawPcMinputStream, JvMaudiOInputStream.toaudioOrt (format), Audiosystem.not_specified); JVMAMADIOInputStream Stream = new JVMaudiOInputStream (InputStream); AuDiDispatcher Dispatcher = new AUDIDispatcher (Stream, 1024, 0); Dispatcher.AdDaudioprocesseur (nouveau AudioPlayer (format, 1024)); Dispatcher.run (); }