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

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

具体Java工具类代码:

    /*** 变声* @param rawPcmInputStream 原始PCM数据输入流* @param speedFactor 变速率 (0,2) 大于1为加快语速,小于1为放慢语速* @param rateFactor 音调变化率 (0,2) 大于1为降低音调(深沉),小于1为提升音调(尖锐)* @return 变声后的PCM数据输入流*/public static InputStream speechPitchShift(final InputStream rawPcmInputStream,double speedFactor,double rateFactor) {// 这里根据自己PCM格式修改对应参数。我们项目里音频格式是固定的,所以写死TarsosDSPAudioFormat format = new TarsosDSPAudioFormat(16000,16,1,true,false);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 overlap = w.getOverlap();AudioDispatcher dispatcher = new AudioDispatcher(stream, inputBufferSize ,overlap);w.setDispatcher(dispatcher);AudioOutputToByteArray out = new AudioOutputToByteArray();dispatcher.addAudioProcessor(w);dispatcher.addAudioProcessor(new RateTransposer(rateFactor));dispatcher.addAudioProcessor(out);dispatcher.run();return new ByteArrayInputStream(out.getData());}

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

public class AudioOutputToByteArray implements AudioProcessor {private boolean isDone = false;private byte[] out = null;private ByteArrayOutputStream bos;public AudioOutputToByteArray() {bos = new ByteArrayOutputStream();}public byte[] getData() {while (!isDone && out == null) {try {Thread.sleep(10);} catch (InterruptedException ignored) {}}return out;}@Overridepublic boolean process(AudioEvent audioEvent) {bos.write(audioEvent.getByteBuffer(),0,audioEvent.getByteBuffer().length);return true;}@Overridepublic void processingFinished() {out = bos.toByteArray().clone();bos = null;isDone = true;}
}

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

    /*** 播放PCM** 不要在非桌面环境调用。。。鬼知道会发生什么* @param rawPcmInputStream 原始PCM数据输入流* @throws LineUnavailableException*/public static void play(final InputStream rawPcmInputStream) throws LineUnavailableException {// 这里根据自己PCM格式修改对应参数。我们项目里音频格式是固定的,所以写死TarsosDSPAudioFormat format = new TarsosDSPAudioFormat(16000,16,1,true,false);AudioInputStream inputStream = new AudioInputStream(rawPcmInputStream, JVMAudioInputStream.toAudioFormat(format),AudioSystem.NOT_SPECIFIED);JVMAudioInputStream stream = new JVMAudioInputStream(inputStream);AudioDispatcher dispatcher = new AudioDispatcher(stream, 1024 ,0);dispatcher.addAudioProcessor(new AudioPlayer(format,1024));dispatcher.run();}

Java PCM音频变声相关推荐

  1. 怎样将音频变声?1分钟教你音频变声怎么弄!

    大家平常爱不爱刷短视频呢?不知道你们看短视频的时候有没有注意到,一些视频的配音很是搞怪,常常让人捧腹大笑!那么这些声音是怎么制作出来的呢?其实大部分的搞怪配音,都是借助软件对音频进行变音来实现的~今天 ...

  2. 如何将音频变声?试试这几个方法吧

    昨天,我在构思视频素材的时候想到可以在其中添加一个鬼畜片段,以此来提升视频的丰富度和乐趣.那么如果要添加鬼畜片段的话,首先就需要我们将音频进行变声操作,不过由于不知道怎么进行音频变声,于是我就上网搜索 ...

  3. 这三个音频变声编辑软件教你怎么给音频变声

    现如今随着我们生活的节奏越来越快,大家都爱上了短视频,每天也都有大量的短视频被创作出来.在这样的背景下,不知道有没有小伙伴也充满创意的想去尝试,但是却因为不知道怎么调整音频变声而阻挡了创作的步伐呢?其 ...

  4. 如何在3分钟内实现音频变声和趣味音效?

    在泛娱乐社交和互动游戏场景中,用户已不再满足于高清的音质体验和实时的互动效果,他们还想要增加趣味性和沉浸感,让声音变得好玩有趣.拍乐云Pano上线了音频变声接口,开发者可以通过 Pano SDK 设置 ...

  5. 怎样将音频变声?三分钟教会你

    音频变声是一种常见的音频处理方式,可以对人声或音乐进行特殊处理,使其声音产生不同的效果.它的应用广泛,像是音乐制作人可能需要使用音频变声来改变歌手的声音,使其更加独特或与歌曲的风格相匹配.例如,将男歌 ...

  6. 音频变声的软件叫什么?这些软件值得收藏

    在今天这个数字时代,随着人们对于娱乐消费需求的不断增长,很多人开始涉足各种新领域,比如语音包.游戏配音.BGM制作等等.这些领域的共同点是需要一定的音频素材,同时也需要创意性地处理这些素材.这时,音频 ...

  7. FFmpeg进阶: 音频变声滤镜

    声音最重要的两个元素就是语速和语调,改变声音的辨识度主要也是从这两方面入手.我们可以通过对音频数据进行插值或者抽值修改,以达到降低语速和增加语速的目的.同时我们也可以通过对数据进行线性拉伸来调节音调. ...

  8. ffmpeg 音频 变声

    记录一次ffmpeg编码变声的根本原因: 音频源采样率和ffmpeg编码时的采样率不同,音频源在采集是采样率为48000,而编码时用44100,所以播放出来的声音显得宽厚.是真.

  9. 使用 fmod windows 下实现音频变声 -- 萝莉 大叔 等 特效

    将文件拖到窗口内,  点击播放可以看到变声效果. 也可以 点击输出将文件变声输出到文件. 可以在路径  https://download.csdn.net/download/w839687571/16 ...

  10. 音频算法之小黄人变声 附完整C代码

    前面提及到<大话音频变声原理 附简单示例代码>与<声音变调算法PitchShift(模拟汤姆猫) 附完整C++算法实现代码> 都稍微讲过变声的原理和具体实现. 大家都知道,算法 ...

最新文章

  1. 解密脑机接口:专访CMU生物医学工程系主任贺斌
  2. 云栖大会变迁史(2009-2017)
  3. 开源WebGIS实施方案(一):开篇 [转]
  4. Android studio 查看sha1
  5. 慢 SQL 诊断优化套路包,套路用的对,速度升百倍
  6. 微程序控制的计算机涉及的两个层次,1.2 考试知识点分析
  7. LeetCode 221. 最大正方形(DP)
  8. javacript 多文件程序
  9. 欺诈与反欺诈的旷世攻防之战
  10. 腾讯IDG投资的明星无人车公司Zoox,拿下硅谷第一张载客许可
  11. Android之SwipeRefreshLayout下拉刷新组件
  12. Pr 入门教程,如何创建序列?
  13. mysql now()相减_MySQL 时间函数加减计算
  14. 导入(excel)+导出(excel)+国际化(i18n)+
  15. DMP文件的导入,导出
  16. PowerVR Series5 Architecture Guide for Developers
  17. 前后端分离,SpringBoot如何实现验证码操作
  18. 新款宝马MINI钥匙增加!轻松搞定,这MINI看着还可以噢
  19. win7java浏览器崩溃_浏览器崩溃怎么办,教你win7系统浏览器崩溃的应对办法
  20. 偏微分方程的特征线法

热门文章

  1. 浅析嵌入式系统之bootloader
  2. uni-app uni-fab修改图标 浮窗位置 是否展开
  3. 享受蓝牙(一): 开始享受
  4. 【U盘检测】为了转移压箱底的资料,买了个2T U盘检测仅仅只有47G~
  5. 什么是pisa测试_PISA测试是什么?
  6. Dell R640服务器centos系统增加万兆网卡设置
  7. 2019-06-12-pintos 实验1
  8. web前端一张页面多少钱?
  9. Ubuntu18.04 域名解析失败
  10. PHP实现货币换算的方法