项目中需要用到对<强> 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 (); }