用Android的Camera录制的视频里,声音是48kHz 16bit 双声道的(我这里是用CameraX录制的,手机是mi10 pro,其他手机或方法等兼容性没研究过),讯飞等实时识别要求的是16kHz 16bit 单声道的,所以有了如下转换方法。
直接上代码:
/**
* 48000hz 16bit stereo转16000hz 16bit mono
* @param srcAudioBytes 音源bytes
* @return 转换后的bytes
*/
public static byte[] recorder2recognizer(byte[] srcAudioBytes) {
if (srcAudioBytes.length % 4 != 0) {
throw new IllegalArgumentException("音源非16bit的立体声吧?");
}
int fromHZ = 48000;
int toHZ = 16000;
int ratio = fromHZ / toHZ;//ratio = 3
byte[] destAudioBytes = new byte[srcAudioBytes.length / ratio / 2];//2是指双声道
for (int i = 0; i < srcAudioBytes.length; i += 4 * ratio) {//4是16bit的双声道占4个字节
destAudioBytes[i / ratio / 2] = combine(srcAudioBytes[i], srcAudioBytes[i + 2]);
destAudioBytes[i / ratio / 2 + 1] = combine(srcAudioBytes[i + 1], srcAudioBytes[i + 3]);
}
return destAudioBytes;
}
/**
* 其实就一个求平均数而已
*/
private static byte combine(byte l, byte r) {
return (byte) ((l + r) >> 1);
}
原理很简单,贴个网上的图:
android中PCM格式存储结构
网友评论