Why?
启英泰伦语音芯片 CI1303 播放外部音频 仅支持 16kHz 采集率, 单声道音频 通过此程序可将 TTS 服务生成的音频转换为可用音频
背景知识
比特率 (bitrate) = 采样率 (sample rate) × 采样大小 (sample size in bits) × 声道数 (number of channels)
引入依赖
<!-- Jave2 依赖 -->
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-all-deps</artifactId>
<version>3.5.0</version>
</dependency>
代码实现
package com.rymcu.util;
import org.springframework.core.io.ClassPathResource;
import ws.schild.jave.Encoder;
import ws.schild.jave.EncoderException;
import ws.schild.jave.MultimediaObject;
import ws.schild.jave.encode.AudioAttributes;
import ws.schild.jave.encode.EncodingAttributes;
import ws.schild.jave.info.MultimediaInfo;
import java.io.File;
/**
* Created on 2025/1/13 13:44.
*
* @author ronger
* @email ronger-x@outlook.com
* @desc : com.rymcu.util
*/
public class AudioConverter {
public static void main(String[] args) {
int targetSampleRate = 16000; // 目标采样率
int targetSampleSizeInBits = 1; // 采样位数
int targetChannels = 1; // 目标声道
try {
String testNum = "4";
String outName = "output_" + testNum + "_" + targetSampleRate + "_" + targetChannels;
ClassPathResource resource = new ClassPathResource("");
String resourcesPath = resource.getFile().getAbsolutePath() + "\\audio\\";
String outPath = System.getProperty("user.dir") + "\\audio\\";
System.out.println(outPath);
File inputMP3 = new File(resourcesPath + testNum + ".mp3"); // 输入文件
File outputMP3 = new File(outPath + outName + ".mp3");
changeSampleRateAndChannels(inputMP3, outputMP3, targetSampleRate, targetSampleSizeInBits, targetChannels);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void changeSampleRateAndChannels(File inputFile, File outputFile, int sampleRate, int sampleSize, int channels) throws EncoderException {
MultimediaObject srcMultiObj = new MultimediaObject(inputFile);
MultimediaInfo inputMediaInfo = srcMultiObj.getInfo();
System.out.println(inputMediaInfo);
//Audio Attributes
AudioAttributes audio = new AudioAttributes();
audio.setCodec("mp3");
audio.setBitRate(sampleRate * sampleSize * channels);
audio.setChannels(channels);
audio.setSamplingRate(sampleRate);
//Encoding attributes
EncodingAttributes attrs = new EncodingAttributes();
attrs.setInputFormat(inputMediaInfo.getFormat());
attrs.setOutputFormat("mp3");
attrs.setAudioAttributes(audio);
//Encode
Encoder encoder = new Encoder();
encoder.encode(new MultimediaObject(inputFile), outputFile, attrs);
//辅助输出,观察编码格式的变化
MultimediaObject srcObj = new MultimediaObject(inputFile);
MultimediaObject targetObj = new MultimediaObject(outputFile);
System.out.println(srcObj.getInfo());
System.out.println(targetObj.getInfo());
}
}
可以勞煩多寫一些編碼的解釋説明嗎?