资讯专栏INFORMATION COLUMN

Java PCM音频变声

linkFly / 3082人阅读

摘要:项目中需要用到对人声音频数据进行变声处理。具体工具类代码变声原始数据输入流变速率大于为加快语速,小于为放慢语速音调变化率大于为降低音调深沉,小于为提升音调尖锐变声后的数据输入流这里根据自己格式修改对应参数。

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

    @Override
    public boolean process(AudioEvent audioEvent) {
        bos.write(audioEvent.getByteBuffer(),0,audioEvent.getByteBuffer().length);
        return true;
    }

    @Override
    public 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();
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68217.html

相关文章

  • 努力翻译一篇中文最友好的,Web Audio API的使用相关的文章

    摘要:前言本文翻译自上的利用,这是中的的一个入门教程。原文是英文,但有日本同志翻译的日文版。这是为了提供一个基本的低音増幅效果在这个例子中可以设定过滤器的种类,周波数,甚至的值。如果是过滤器的话,可以提供一个比指定周波数低的低音増幅。 前言 本文翻译自MDN上的《Web Audio APIの利用》,这是HTML5中的Web Audio API的一个入门教程。原文是英文,但有日本同志翻译的日文...

    caikeal 评论0 收藏0
  • 如何在浏览器中播放pcm音频

    摘要:格式文件中不包含头部信息,播放器无法知道采样率,声道数,采样位数,音频数据大小等信息,导致无法播放。 本文记录一点工作经历,探讨音频文件的格式更多访问我的博客 前言 最近在整理音视频编程的知识,回忆起半年多,有一次需求是在后台播放某来源的 pcm 文件,当时处理方法用了点技巧,记录下来 背景:业务需求,在web后台里播放 pcm 文件,文件不大(约300KB,已知 pcm 的参数采样...

    zxhaaa 评论0 收藏0
  • javaMP3转pcm 百度语音识别

    摘要:不多说直接贴代码获取文件的音频流,的格式将音频转化为的格式保存下来代码忘记借鉴了哪位大神的不好意思好像是综合了部分代码下面的是依赖小程序录音格式上传服务器转化为格式后通过百度语音识别结果 不多说直接贴代码 import com.baidu.aip.speech.AipSpeech; import javazoom.spi.mpeg.sampled.file.MpegAudioFileR...

    afishhhhh 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<