android视频录音转语音识别

2021-04-14  本文已影响0人  v587的毅哥

用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格式存储结构
上一篇下一篇

猜你喜欢

热点阅读