关于Android中将PCM转AMR的问题探讨

AMR 编码 PCM & WAV (opencore-amr-0.1.5) AMR编码基于第三方opencore-amr-0.1.5库 支持PCM2AMR,WAV2AMR test目录下:pcm2amr.c pcm2amr.c,linux环境下 调试通过,准备移植到安卓手机 资源下载链接:http://download.csdn.net/detail/yuanchunsi/9917689 阅读详情

因为项目中用到了阿里的语音识别技术,但是返回的是PCM原始数据,这里就需要将PCM转为AMR的音频格式,这里将其中遇到的问题记录下来,有需要的小伙伴们可以参考一下。

这里的实现思路先大致说一下,将PCM先转为WAV,然后再由WAV转为AMR。

话不多说,直接上代码。

我们先PCM转为WAV,要注意的是16k的PCM一定要对采样率进行向下采样成8kPCM之后,再将PCM进行转换成WAV,否则后面转出来的8k的AMR就一塌糊涂了!!!重新采样用的是三方库JSSRC,我这里是对JSSRCResampler进行了一些调整,直接将源码改成了16k转8k的。

public void pcmToWav(String inFilename, String outFilename, PcmToWavTransformListener listener) {
        FileOutputStream out;
        long totalAudioLen;//总录音长度
        long totalDataLen;//总数据长度
        long longSampleRate = 8000;
        int channels = 1;
        long byteRate = 8 * longSampleRate * channels / 8;
        byte[] data = new byte[mBufferSize];
        try {
            FileInputStream inputStream = new FileInputStream(inFilename);
            totalAudioLen = inputStream.getChannel().size();
            //将16k的PCM进行重新的8k采样
            JSSRCResampler in = new JSSRCResampler(inputStream);
            //8k的PCM转为8k的WAV
            out = new FileOutputStream(outFilename);
            totalDataLen = totalAudioLen + 36;

            writeWaveFileHeader(out, totalAudioLen, totalDataLen,
                    longSampleRate, channels, byteRate);
            while (in.read(data) != -1) {
                out.write(data);
                out.flush();

            }
            Log.e(TAG, "pcmToWav: 停止处理");
            in.close();
            out.close();

            if (listener != null) {
                listener.transformFinish(outFilename);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

同采样率的8kWAV出来之后,下面就好办了,接下来我们用opencore-amr将WAV直接转换成需要的AMR,代码如下

 public void wav2Amr(String inFilename, String outFilename, TransformListener listener) {
        try {
            FileInputStream inputStream = new FileInputStream(inFilename);
            FileOutputStream outStream = new FileOutputStream(outFilename);
            AmrEncoder.init(0);
            List<short[]> armsList = new ArrayList<short[]>();
            //写入Amr头文件
            outStream.write(header);

            int byteSize = 320;
            byte[] buff = new byte[byteSize];
            int rc = 0;
            while ((rc = inputStream.read(buff, 0, byteSize)) > 0) {
                short[] shortTemp = new short[160];
                //将byte[]转换成short[]
                ByteBuffer.wrap(buff).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shortTemp);
            }

            for (int i = 0; i < armsList.size(); i++) {
                int size = armsList.get(i).length;
                byte[] encodedData = new byte[size*2];
                int len = AmrEncoder.encode(AmrEncoder.Mode.MR515.ordinal(), armsList.get(i), encodedData);
                if (len>0) {
                    byte[] tempBuf = new byte[len];
                    System.arraycopy(encodedData, 0, tempBuf, 0, len);
                    outStream.write(tempBuf, 0, len);
                }
            }

            outStream.close();
            inputStream.close();

            Log.e(TAG, "pcmToWav: amr生成完毕");
            if (listener != null) {
                listener.transformFinish(outFilename);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

到这里就得到了我们想要的AMR文件了。

https://github.com/hutm/JSSRC

https://github.com/kevinho/opencore-amr-android

android录音将pcm转换为amr android项目中将pcm转换为amr格式。但是这个转换发现会变声。我的意见是转换为mp3格式。这个也会压缩。不会失真。可以有效的利用科大讯飞的解析音频功能其代码在我其他资源库中 立即下载

相关推荐

opencore-amr-android, android中的opencore amr编解码器.zip

opencore-amr-android, android中的opencore amr编解码器 opencore-amr-android一种带有解释功能的opencore amr编解码器及其封装amr音频文件的。中文文档请移步 README_CN QQ部落帮助: 453503476背景opencore 是android的

使用MediaCodec将PCM音频编码为AMR-WB格式

使用MediaCodec将PCM音频编码为AMR-WB格式

DengCaixiang2021的博客 1546

通俗地解释一下 EMD(经验模态分解,Empirical Mode Decomposition)

EMD 就像把一碗“混在一起的面条”分成不同粗细的面条,方便你逐层分析每种波动。

qlkaicx的博客 1249

android支持pcm格式转换,Android中Pcm文件转Amr文件

Android中Pcm文件转Amr文件Android最经在做一个聊天的模块,聊天的模块很简单:录音-上传-接收-播放录音录音部分可以采用MediaRecord和AudioRecord两个类进行录音.但是各有优缺点.MediaRecord已经封装了很多方法,方便使用.AudioRecord能获取录音的原生数据,以便对录音二次加工.在录音过程我采用的是AudioRecord.但是AudioRecord...

weixin_39832727的博客 1219

C#上位机与MES系统数据对接:从协议选型到安全传输的实战解析

本文详细解析了C#上位机与MES系统数据对接的全过程,从协议选型到安全传输的实战技巧。针对工业互联网场景下的数据对接挑战,提供了RESTful API、MQTT和OPC UA等协议的选型建议,并分享了健壮性设计、异常处理和安全传输的实用代码示例,帮助开发者高效实现数据上传与系统集成。

weixin_30566063的博客 105

从jieba分词到BERT-wwm——中文自然语言处理(NLP)基础分享系列(12)

今天是本系列的最后一期,完整代码呈现Huggingface transformers平台上微调BERT-wwm-ext的过程方法。

weixin_49518391的博客 3763

Android amr语音编解码解惑

关于android中的语音压缩编码,今天算是好好的研究了一下,有了小小的心得:首先关于采集到得声音源的格式是PCM-16bit的格式,什么是PCM格式,大家看下面的这篇文章:http://blog.csdn.net/tkboy/archive/2009/12/19/5038947.aspxPCM就是无压缩的声音源,PCM信号是由[1]、[0]等符号构成的数字信号,android设备采取的声音源也就...

jinvasshole 299

ubuntu20.04下dsp-slam的运行配置

DSP-SLAM:具有深度形状先验的面向对象的 SLAM

baidu_38431960的博客 3159

android pcm转amr格式

引言 项目中需要将科大讯飞生成的录音传递到服务器上,因为amr格式的文件大小最小,而讯飞生成的文件是pcm格式的,所以需要将pcm转换成amr格式。在网上找了半天资料,发现android系统的源码中包含有一个android.media.AmrInputStream类,其内部分装了将pcm转换为amr的方法。 用法 首先将AmrInputStream复制到工程下,注意包名也不要

hyb4600的专栏 7234

非标准包 game.rgss3a 的打开方法 | 2023 年实测

生活笔记

陌雨’的博客 1万+

AUTOSAR MCAL开发及EB Tresos工具使用总结

在基于AutoSar CP架构开发MCAL时,会使用到EB tresos工具。本文主要对MCAL开发及EB tresos工具使用进行总结,仅作为自学使用,以方便后续查漏补缺。

liuxu324的博客 2628

记录android自带的pcm转为amr

利用android自带的库进行操作 package android.media; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputSt...

qq_34435079的博客 1691

【超分辨率(Super-Resolution)】关于【超分辨率重建】专栏的相关说明,包含专栏简介、专栏亮点、适配人群、相关说明、阅读顺序、超分理解、实现流程、研究方向、论文代码数据集汇总等

本专栏研究领域为【超分辨率重建】,涵盖图像超分、视频超分,实时超分,4K修复等方面。主要内容包括主流算法模型的论文精读、论文复现、毕业设计、涨点手段、调参技巧、论文写作、应用落地等方面。算法模型从SRCNN开始更新至今,一般是一篇论文精读对应一篇论文复现。论文精读详解理论,归化繁为简,归纳核心,积累词句,培养阅读论文和论文写作能力。论文复现依托Pytorch代码,实现完整的模型训练流程,总结调参方法,记录碰到的bug,论文插图可视化,培养读写代码能力、做实验的能力、以及应用落地能力。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 3万+

Android音频处理实战:PCM转AMR编码的实现与性能优化

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94960223的博客 636

【AI理论学习】深入理解扩散模型:Diffusion Models(DDPM)(理论篇)

继OpenAI在2021提出的文本转图像模型之后,越来越多的大公司卷入这个方向,例如谷歌相继推出了和。一些主流的文本转图像模型,例如,和采用了扩散模型()作为图像生成模型,这也引发了对扩散模型的研究热潮。与GAN相比,扩散模型训练更稳定,而且能够生成更多样的样本,OpenAI的论文也证明了

小哲的博客 5213

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android AMR转PCM实战指南:从编解码原理到性能优化

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94960209的博客 600

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android PCM转AMR编码实战:AI辅助下的性能优化与避坑指南

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94960228的博客 687

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android音频编码实战:PCM转AMR的高效实现与避坑指南

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94959861的博客 619

Android音频处理实战:AMR转PCM的高效实现与性能优化

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94959973的博客 397

C语言PCM16K采样率转为8K,iOS 关于PCM2AMR的转换记录

项目中遇到一个问题,集成的语音识别模块,由于对采样率有要求,所以识别结束后保存的PCM音频文件是用的16K的采样率,而原先的项目中,包括安卓端的语音播报也都是使用8K的采样率,这样就出现个问题:是把16K的PCM转换成16K的AMR还8K的AMR?方案一:16K PCM 转换成 16K AMR由于对音频转换相关方面知识的欠缺,只好上谷歌、百度,也成功的找到一篇关于转换的文章:使用opencore_...

weixin_36167031的博客 1906

Android AMR转PCM实战:高效音频处理与避坑指南

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94960160的博客 526

Android PCM转AMR编码实战:提升音频处理效率的关键技术解析

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94959992的博客 453

Android音频处理实战:PCM转AMR编码的高效实现与性能优化

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94959876的博客 370

Android AMR转PCM实战:AI辅助下的音频编解码优化方案

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94960243的博客 306

android AMR-NB

常规MediaRecorder使用 1. http://blog.sina.com.cn/s/blog_51396f890102e0jg.html 2. http://www.cnblogs.com/skyseraph/archive/2012/03/31/2427593.html MediaRecorder相关 参考:【Android學習專題】多媒體篇:MediaRecoder

三少GG 4704

android wear录音,android 使用AudioRecord录音音频文件pcm 转amr

我是在做手表开发的时候接触到音频文件的转码问题,大家都知道在手机上使用录音功能可以直接使用MediaRecord这个类,可以直接将录制内容输出为amr格式,但是在手表端(android wear)是无法使用MediaRecord这个类的,那么要想完成手表端的录音功能就必须使用AudioRecord这个类,而AudioRecord录制输出为pcm流(原声音频流,无损,无压缩,音质好,但文件太大),如...

weixin_35278121的博客 604
lorenli
博客等级 码龄12年 1粉丝 1原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值