最近做語音合成的項目,需要把PCM格式的音頻文件轉換成MP3或WAV,記錄一下。
Java實現的PCM格式音頻文件轉換MP3格式
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* PCM 轉 MP3
*
* @author QC班長
* @since 2020-02-02
*/
public class PcmToMp3 {
public static void main(String[] agrs) throws Exception {
//convertAudioFiles("resource/茯茶素是什麼,有什麼效果,生產工藝有哪些?.pcm", "resource/茯茶素是什麼,有什麼效果,生產工藝有哪些?.mp3");
convertAudioFiles("tnafcs.pcm", "tnafcs.mp3");
}
/**
* @param src 待轉換文件路徑
* @param target 目標文件路徑
* @throws IOException 拋出異常
*/
public static String convertAudioFiles(String src, String target) throws IOException {
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(target);
//計算長度
byte[] buf = new byte[1024 * 4];
int size = fis.read(buf);
int PCMSize = 0;
while (size != -1) {
PCMSize += size;
size = fis.read(buf);
}
fis.close();
//填入參數,比特率等等。這裏用的是16位單聲道 8000 hz
WaveHeader header = new WaveHeader();
//長度字段 = 內容的大小(PCMSize) + 頭部字段的大小(不包括前面4字節的標識符RIFF以及fileLength本身的4字節)
header.fileLength = PCMSize + (44 - 8);
header.FmtHdrLeth = 16;
header.BitsPerSample = 16;
header.Channels = 1;
header.FormatTag = 0x0001;
header.SamplesPerSec = 16000;
header.BlockAlign = (short) (header.Channels * header.BitsPerSample / 8);
header.AvgBytesPerSec = header.BlockAlign * header.SamplesPerSec;
header.DataHdrLeth = PCMSize;
byte[] h = header.getHeader();
assert h.length == 44; //WAV標準,頭部應該是44字節
//write header
fos.write(h, 0, h.length);
//write data stream
fis = new FileInputStream(src);
size = fis.read(buf);
while (size != -1) {
fos.write(buf, 0, size);
size = fis.read(buf);
}
fis.close();
fos.close();
System.out.println("PCM Convert to MP3 OK!");
return "ok";
}
}
Java實現的PCM格式音頻文件轉換WAV格式
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* PCM 轉 WAV
*
* @author QC班長
* @since 2020-02-02
*/
public class PcmToWav {
public static void main(String[] agrs) throws Exception {
//convertAudioFiles("resource/茯茶素是什麼,有什麼效果,生產工藝有哪些?.pcm", "resource/茯茶素是什麼,有什麼效果,生產工藝有哪些?.mp3");
convertAudioFiles("tnafcs.pcm", "tnafcs.mp3");
}
/**
* @param src 待轉換文件路徑
* @param target 目標文件路徑
* @throws IOException 拋出異常
*/
public static void convertAudioFiles(String src, String target) throws IOException {
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(target);
//計算長度
byte[] buf = new byte[1024 * 4];
int size = fis.read(buf);
int PCMSize = 0;
while (size != -1) {
PCMSize += size;
size = fis.read(buf);
}
fis.close();
//填入參數,比特率等等。這裏用的是16位單聲道 8000 hz
WaveHeader header = new WaveHeader();
//長度字段 = 內容的大小(PCMSize) + 頭部字段的大小(不包括前面4字節的標識符RIFF以及fileLength本身的4字節)
header.fileLength = PCMSize + (44 - 8);
header.FmtHdrLeth = 16;
header.BitsPerSample = 16;
header.Channels = 2;
header.FormatTag = 0x0001;
header.SamplesPerSec = 8000;
header.BlockAlign = (short) (header.Channels * header.BitsPerSample / 8);
header.AvgBytesPerSec = header.BlockAlign * header.SamplesPerSec;
header.DataHdrLeth = PCMSize;
byte[] h = header.getHeader();
assert h.length == 44; //WAV標準,頭部應該是44字節
// write header
fos.write(h, 0, h.length);
// write data stream
fis = new FileInputStream(src);
size = fis.read(buf);
while (size != -1) {
fos.write(buf, 0, size);
size = fis.read(buf);
}
fis.close();
fos.close();
System.out.println("Convert OK!");
}
}