概要
电话录音文件,采样率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
有些文件是不能进行重写的,如下问题不能转化:
- 音频编码格式不一样不能转写成功;
- 采样率从低到高不能转化成功
报错内容如下:
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();
}
}
}
经过多次尝试,只修改这两个值是可以保证转成功的:
- 只修改采样方式8bit–>16bit
- 编码格式修改为PCM_SIGNED
总结
多尝试几遍,只修改起一个值,直到可以正常转换。