代码分析JAVA中PCM人声音频变声处理

  

项目中需要用到对<强> PCM人声音频数据进行变声处理强。苦苦挣扎了一周终于找到了纯Java实现的一套框架——TarsosDSP。功能非常强大!可以实时音频处理!当然我只用到了对文件处理。实际上逻辑是一样的

  

TarsosDSP的GitHub地址:https://github.com/JorenSix/TarsosDSP 将它整合至自己的项目工程。

  

具体Java工具类代码:

     /* *   *变声   * @param rawPcmInputStream原始PCM数据输入流   * @param speedFactor变速率(0,2)大于1为加快语速、小于1为放慢语速   * @param rateFactor音调变化率(0,2)大于1为降低音调(深沉),小于1为提升音调(尖锐)   * @return变声后的PCM数据输入流   */公共静态InputStream speechPitchShift(最终InputStream rawPcmInputStream双speedFactor,双rateFactor) {   TarsosDSPAudioFormat格式=new TarsosDSPAudioFormat(1 16000人,16日,真、假);   AudioInputStream inputStream=new AudioInputStream (rawPcmInputStream JVMAudioInputStream.toAudioFormat(格式),AudioSystem.NOT_SPECIFIED);   JVMAudioInputStream流=new JVMAudioInputStream (inputStream);   WaveformSimilarityBasedOverlapAdd w=new WaveformSimilarityBasedOverlapAdd (WaveformSimilarityBasedOverlapAdd.Parameters。speechDefaults (speedFactor, 16000));   int inputBufferSize=w.getInputBufferSize ();   int重叠=w.getOverlap ();   AudioDispatcher调度员=new AudioDispatcher(流,inputBufferSize,重叠);   w.setDispatcher(调度);   AudioOutputToByteArray=新AudioOutputToByteArray ();   dispatcher.addAudioProcessor (w);   调度员。addAudioProcessor(新RateTransposer (rateFactor));   dispatcher.addAudioProcessor(出);   dispatcher.run ();   返回新ByteArrayInputStream (out.getData ());   }      

其中数据转录器(AudioOutputToByteArray)代码如下:

        公共类AudioOutputToByteArray实现AudioProcessor {   私人布尔结束=false;   私人byte[]=零;   私人ByteArrayOutputStream bos;   公共AudioOutputToByteArray () {   bos=new ByteArrayOutputStream ();   }   公共byte [] getData () {   而(!结束,,==null) {   尝试{   thread . sleep (10);   }捕捉(InterruptedException忽略){}   }   返回;   }   @Override   公共逻辑过程(AudioEvent AudioEvent) {   bos.write (audioEvent.getByteBuffer () 0 audioEvent.getByteBuffer () . length);   返回true;   }   @Override   公共空间processingFinished () {   .clone=bos.toByteArray () ();   bos=零;   结束=true;   }   }      

可以通过这个工具方法播放音频:

     /* *   *播放PCM   *   *不要在非桌面环境调用……鬼知道会发生什么   * @param rawPcmInputStream原始PCM数据输入流   * @throws LineUnavailableException   */公共静态空玩(最终InputStream rawPcmInputStream)抛出LineUnavailableException {   TarsosDSPAudioFormat格式=new TarsosDSPAudioFormat(1 16000人,16日,真、假);   AudioInputStream inputStream=new AudioInputStream (rawPcmInputStream JVMAudioInputStream.toAudioFormat(格式),AudioSystem.NOT_SPECIFIED);   JVMAudioInputStream流=new JVMAudioInputStream (inputStream);   AudioDispatcher调度员=new AudioDispatcher(流,1024,0);   调度员。addAudioProcessor(新AudioPlayer(格式,1024));   dispatcher.run ();   }      

代码分析JAVA中PCM人声音频变声处理