如何在Android上对PCM音频文件进行降采样

时间:2019-08-08 13:43:12

标签: android sample mediacodec rate

我想从Android文本到语音生成8kHz 16位PCM。

Android的TTS synthesizeToFile生成具有24kHz或22.05kHz采样的单声道16位PCM文件。我想将它们转换为8kHz PCM文件,以输入到自定义声码器。可以使用Android的MediaCodec进行这种下采样吗?如果是这样,怎么办?以下是用于创建音频文件的代码。使用UtteranceProgressListener查找TTS的完成时间(因为Utterance ID可以很好地传递临时文件名)

        File outputDir = mContext.getCacheDir(); // context being the Activity pointer
        File tf = File.createTempFile("sabre", "wav", outputDir);
        HashMap<String,String> params = new HashMap<>();
        mUtteranceId = tf.getPath();
        params.put(KEY_PARAM_UTTERANCE_ID, mUtteranceId);
        mTts.synthesizeToFile(text, params, mUtteranceId);

1 个答案:

答案 0 :(得分:0)

如果您有24kHz文件,则需要将低通滤波器降低到4kHz,然后每隔3个采样进行一次采样即可获得8kHz数据。 FIR滤波器就足够了。 http://t-filter.engineerjs.com/将帮助您开始为合适的FIR滤波器生成系数,并提供一些简单的c ++代码。您可以使用Java短裤作为示例,将其累积为java int。

要读取wav文件样本,请使用Android MediaExtractor或在http://www.labbookpages.co.uk/audio/javaWavFiles.html处使用java wav文件类。您可以使用它来写出重新采样的wav文件。

如果您的转换比较困难,例如从22.05kHz开始,然后在https://github.com/hutm/JSSRC处尝试Java SSRC(尽管即使在“快速”模式下也相当慢)。