Android中实现多段wav音频文件拼接

WAV为微软公司开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持。
由于项目中需要接入讯飞的语音听写进行快速录入,并且同时保存语音文件。讯飞语音听写的SDK只支持保存语音文件为pcm或者wav这两种格式。讯飞的语音听写服务有很多限制,比如前后端点允许静音最长10秒、一次听写连续不能超过60秒。项目中需要支持长时间不间断语音听写,和产品怼了很久,经过不懈的抗争,最后还是我妥协了。讯飞语音听写的SDK提供了一些回调,在超时中断时,会回调onEndOfSpeech方法,这样我们就可以在这里马上重新开始启动听写。但是这会引起另一个问题,录制的音频文件最后是一段一段的,最后还得把他们进行拼接。第一次使用讯飞的语音听写SDK,不是很熟,不知道有没有哪位大神有更好的解决办法,求赐教啊啊啊啊。。。
寻找了很久,在Android的API中没找到可以实现wav拼接的方法,只能自己去实现了。万幸的是wav格式的结构还比较简单。

WAV文件格式

WAV文件格式

(本来是使用table编辑的表格,简书上竟然不支持,没办法只能截了个图放上来了)
可以看出,WAV文件主要是以四种chunk组成,这里我们分别称呼为riff chunk、fmt chunk、fact chunk和data chunk,其中fact chunk不是必须的,大部分时候的没有。所以我在查阅资料的额时候,发现很多解析WAV文件的代码都直接认为其只有固定的44字节的头部。
此格式来源于百度百科,奇怪的是维基百科中也认为WAV具有一个44字节的固定头部,如果哪位大神知道的,可以告诉我一下。

WAV拼接实现方法

由于这里采集的音频相关参数一致,做我们去其中一段的头部作为拼接后的音频的头部。但是也不是这样就可以了。从上面WAV的格式中可以看出,头部中两个位置的数据需要修改。1、riff chunk中的size值;2、data chunk的size值。因此可以先将其他数据的data chunk部分的数据追加到结果文件中,最后写入这两个地方的值。
好了,是时候上代码了。。。

实现代码

public class WavMergeUtil {
   

  public static void mergeWav(List<File> inputs, File output) throws IOException {
    if (inputs.size() < 1) {
      return;
    }
    FileInputStream fis = new FileInputStream(inputs.get(0));
    FileOutputStream fos = new FileOutputStream(output);
    byte[] buffer = new byte[
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值