java实现 录音采样方式转换8bit-->16bit

概要

电话录音文件,采样率8K,采样位数8bit,需要将采样位数转为16bit,下面介绍转化的流程、问题及问题解决方案。

整体架构流程

语音、电话录音属性转换就是通过生成新的录音文件,重写属性。采用的AudioInputStream 是jdk自带的工具,不需要单独引依赖。

11:14:06.242 [main] INFO com.day.SoundUtils - 采样率:8000.0
11:14:06.249 [main] INFO com.day.SoundUtils - 编码格式:ALAW
11:14:06.250 [main] INFO com.day.SoundUtils - 采样样本大小:8
11:14:06.250 [main] INFO com.day.SoundUtils - 通道:1
Exception in thread "main" java.lang.IllegalArgumentException: Unsupported conversion: PCM_SIGNED 16000.0 Hz, 16 bit, stereo, 2 bytes/frame, 8000.0 frames/second, little-endian from ALAW 8000.0 Hz, 8 bit, mono, 1 bytes/frame, 
	at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:974)
	at com.day.SoundUtils.main(SoundUtils.java:42)

进程已结束,退出代码1
  • 经过程序代码可知,我这边的编码格式为 ALAW

有些文件是不能进行重写的,如下问题不能转化:

  1. 音频编码格式不一样不能转写成功;
  2. 采样率从低到高不能转化成功

报错内容如下:

Unsupported conversion: PCM_SIGNED 16000.0 Hz, 16 bit, stereo, 2 bytes/frame, 8000.0 frames/second, little-endian from ALAW 8000.0 Hz, 8 bit, mono, 1 bytes/frame, 
public class SoundUtils {

    private static final Logger logger = LoggerFactory.getLogger(SoundUtils.class);
    public static void main(String[] args) {
        try {
            // 加载音频文件
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("C:\\Users\\86188\\Music\\callread\\录音2.wav"));
//            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("E:\\下载\\asr_example.wav"));

            // 获取音频参数
            AudioFormat audioFormat = audioInputStream.getFormat();
            float sampleRate = audioFormat.getSampleRate();
            int sampleSizeInBits = audioFormat.getSampleSizeInBits();
            int channels = audioFormat.getChannels();

            logger.info("采样率:{}",sampleRate );
            logger.info("采样样本大小:{}",sampleSizeInBits );
            logger.info("通道:{}",channels );

            // 创建目标音频参数
            AudioFormat targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, sampleRate, 16, 2, 2, sampleRate, false);

            // 创建音频转换器
            AudioInputStream convertedInputStream = AudioSystem.getAudioInputStream(targetFormat, audioInputStream);

            // 保存转换后的音频
            AudioSystem.write(convertedInputStream, AudioFileFormat.Type.WAVE, new File("C:\\Users\\86188\\Music\\callread\\录音2_16_alaw.wav"));

            System.out.println("音频采样转换完成!");
        } catch (UnsupportedAudioFileException | IOException e) {
            e.printStackTrace();
        }
    }
}

经过多次尝试,只修改这两个值是可以保证转成功的:

  1. 只修改采样方式8bit–>16bit
  2. 编码格式修改为PCM_SIGNED

总结

多尝试几遍,只修改起一个值,直到可以正常转换。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值