安卓音频二

整理下安卓音频相关资料小白问题中,提出了一些问题

现在写出答案,记录一下,正在使用这一块的同学,可以一起学习下

第一:首先你要知道,安卓启动麦克风有耗时动作,这个再google官网有资料说明,常规是60ms~150ms之间,公司设备配置较低,耗时再110ms,为什么要知道这个,因为为后面做拾音准备,因为它的工作延迟,会让你第一个音,不准,或者丢掉?

答:此问题有2个解决方法,第一,在APP层,丛UI效果延迟,麦克风先启动,UI效果在200毫秒后弹出,用户可控制在麦克风完全启动后,得到第一个字,第二个解决方法就是使用OpenSL ES 这个库了,这个库目前我使用21.XX后,是可以使用的,可以解决这个问题

#include <SLES/OpenSLES.h>
#include <SLES/OpenSLES_Android.h>



target_link_libraries( # Specifies the target library.
      

        OpenSLES

        ${log-lib}
)

第二:知道这个后,你就想一个问题了,麦克风拿到数据data数据,按音频格式是pcm,这个数据是无损,从http或者ws中,这个越小体积数据传输,会越快,成功率会提高,所以你需要接触到压缩,压缩的方法千千万万主流 speex,opus,我也不介绍了,随便推荐一个opus:https://github.com/martoreto/opuscodec?

答:这个基本无问题,唯一需要处理的 问题就是后台对opus的解码PCM,这一块需要C++工程师调试并发问题

这里插一句解压对服务器性能会有影响,CPU,内存等,所以其实不推荐直接使用OPUS,

如果是做三方音频对接,不要对音频做处理,只会增加服务器性能问题,而且音频也要考虑丢包问题,还有高并发时,代码层对音频重组问题

 

第四:比如ogg格式,这种通用标准,为了让你的音频更多三方可用,你还得接入了。所以有两个东西speex_ogg,opus_ogg。其中呢,opus_ogg 对google,跟微软,speex呢,像腾信,科大,国内很多也在用,所以你得研究用哪种了,所以呢你又要开始去找一些库了,没有C功底,你很难把ogg跟你前面的opus合并再一起,因为这个就是纯C之间调用,通过jni触发回调了?

答:最好的做法,就是三方需要什么库,前端去接入,这里能避开服务器去做编码就避开,因为服务器资源,遇到的问题会比单台设备更难解决,目前市面上Ogg Opus,对于google是可以识别的,Speex Ogg 对于科大讯飞会支持好一些,直接使用就可以

Ogg Opus  这个东西网上确实没什么资料,我也不知道为什么大家都没公开,

其实这一块,c++工程师来说,很简单,因为就是内部两个工具类相互调用,需要读懂OGG 的标准,

这一块的标准其实也没有多难,但是安卓工程师入手真的很难。我大概讲一下,OGG,有第一页头,里面有东西,必须封装对,否则就是有问题的。

1.必须有一个19个长度的字节,OpusHead,这个里面通道 版本等信息,具体可以看

2.有一个OpusTags, 这个每一页都有

3.就是你编码后的opus音频了,中间音频都是一个 header 加一个 body

具体可以参考下面

 Opus从入门到精通(五)OggOpus封装器全解析

 

第五:你要研究音频了,你有没有想过,识别率为什么底,相信你也查过资料,什么3A处理,什么原音加强,降噪,等等东西,一看,又是C相关,打住吧,看了看不懂,?

答:这里其实也不用太担心,耐心先看下cmake编译文件,然后了解下 WebRtc 这个东西,因为3A它有的,这个库有google提供技术支持的,放心用过。

3A =  AGC +AEMC +NS+ AEC 就是这些东西, 

把他们串起来就可以了,


第六:好玩的东西来了,你会遇到一个场景,我按下说话,20秒,其实我就说了2句话,就两个5秒。其中没有声音的10秒,你是不是送到服务了啊,这段是不是可以优化下,去看看vad吧,也就是语音端点检测,资料给你 

Webrtc Vad

答:这一块,目前其实想想也是可以玩的,接入后,你会发现VAD是根据高斯算法做的,这里面自动做好了一些算法,会根据你音频返回0跟1,初步简单处理,就是收集到多少个0,才孙静音了,问题就解决啦 ,这只是一种简单的方式,更为高级的,应该是类似于科大的VAD,是有模型训练的,这一块 还未接入使用

 

 

今天记录一些好玩的东西,

目前C层做了音频,C层做了压缩音频,做了音频3A处理,并做了语音端点检测,其实这里同步字幕已经完成了。

不过现在目前音频还是回到了JAVA层,目前我们长连接WebSocket,其实用RTMP也可以用C层来做的

是不是差一点完成纯C,拾音整套SDK了。

接下来推荐个C库,WebSocketpp 这个库,非常不好编,哎,叹一口气先

这个库你要先编译好一个boots,目前好想都在使用1.75.2这个版本。

然后你还要编一个Openssl这个库,然后你才能引用成功WebSocketpp

然后你以前的库,是C++14编的,现在这个库需要C++11 

然后你就得这样

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -DWEBRTC_POSIX -D_GLIBCXX_USE_CXX11_ABI=0 -std=gnu++0x -pthread")

整了3-5天,也算是编好了,

这样,SDK 纯C版本就是全部打通了,

为什么用C来些这一块,因为可以跨平台,还是可以研究研究的,

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值