在Java中将音频从44.1kHz降采样到16kHz

5

我有一个应用程序,可以从用户的麦克风录制语音样本并将其上传到服务器上,然后服务器会对其进行一些处理。为了避免IllegalArgumentException异常,似乎我必须使用以下参数进行录制:

Encoding encoding = AudioFormat.Encoding.PCM_SIGNED;
float sampleRate = 44100.0F;
int sampleSizeInBits = 16;
int channels = 2;
int frameSize = 4;
float frameRate = 44100.0F;
boolean bigEndian = false;

但是我需要以16khz的采样率进行录制,而不是44.1khz(我想应该是sampleRate和framerate都要改吧),并且必须是单声道(1个通道)。PCM签名也是必需的,所以很好。 (服务器非常挑剔,我无法对其进行任何更改。)我该如何使用Java进行转换?

我正在通过HttpClient将音频文件作为Filebody提交到servlet,将其保存在服务器上,然后进行处理。


1
我认为你的采样率应该是44,100Hz,而不是41,000Hz,因为这将是一个非常奇怪的采样率。 - Brad
是的,那就是我想表达的意思,抱歉。 - Woobie
1
@DavidKroukamp 抱歉,我离开了我的桌子。 - Woobie
1个回答

3

我使用了SampleRateConverter.java,它允许我转换为16khz,但是当我尝试从立体声转换为单声道时仍然会抛出异常。我正在查看Tritonus库,但我不确定该怎么做。虽然看起来可能需要这样做两次转换,但我宁愿不这样做。 - Woobie
一旦你的音频文件达到16kHz立体声,你可以将两个轨道相加并除以二。这只需要通过迭代音频文件,将LittleEndian或BigEndian转换为整数,进行平均数学计算,并在新文件中将其转换回字节格式即可完成。 - Phil Freihofner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接