java-ffmpeg-音频转换
- 需求描述
- 功能流程
- 所需条件
- 步骤
- 步骤1
- 步骤2
- 步骤3
- 一些我使用中遇到的异常
需求描述
项目中的语音唤醒后的语音识别人声检测一直是一个很令我头痛的问题,之前因为对各种类型的工具包使用不熟练,以及时间问题,一直没有根治这个人声检测体验不好的问题,之前的解决方案是从帖子上别的大佬那里扒下来的有关vad的代码,拿来用的,其中有两个问题,一个就是人声检测十分敏感,基本有点杂音,背景音都会认为是人声;第二就是关于在什么时候进行音频录制的停止的问题,这个问题我是通过添加一个计时器,超过多少秒vad一直没有检测到声音之后就默认用户是停止接话的状态.因为是自己写的,时间也是凭感觉设置的,使用起来一直处于鸡肋的状态,再加上vad识别的不精准,第二个问题就很容易放大,导致体验变得更差
最近一直在研究某产品关于语音识别技术的文档和代码,发现他们的人声检测以及停止录制的功能十分成熟,于是我决定使用他们的sdk,跳过收费(只要不填写key那些就行),因为如果写上产品的真名,他们后面可能就会限制这个功能,所以这里就不说了
以上,我的解决思路是使用产品已经成熟的语音识别里的vad组件,帮我完成人声检测的功能,然后我根据人声检测之后保存的音频进行处理,即可获取我需要的指定音频格式了
功能流程
语音唤醒–>唤醒成功–>语音识别–>语音识别自动结束–>音频转换–>获取音频路径–>供其他方法调用
所需条件
- 某产品的语音识别 AndroidSDK(需要魔改)
- 安卓版的ffmpeg(根据需求查看是否有你需要的编码器)
- 可能是非必要条件-不同安卓版本之间有关读写内存的权限问题
步骤
步骤1
新建androidstudio项目,把语音识别的AndroidSDK移植到新建的项目中,通过demo或自己在app中创建测试单元,检查语音唤醒以及语音识别是否能够正常使用
语音唤醒功能需要确保创建应用的时候的包名和你新建的项目的包名一致(老生常谈的问题了…)
语音识别新用户会有一定额度的免费调用次数,老用户的话也没事,只要测几次就行了,因为我们需要的是sdk中附带的vad人声检测功能
步骤2
在sdk中有关语音识别的部分中开启vad检测,赶时间可以直接问对应产品的客服或者查看文档
你需要知道
- vad检测打开和关闭的地方
- 语音识别回调的地方
一般vad人声检测结束后会走语音识别结果的回调方法
我的音频转换的功能就是在回调中执行的
步骤3
测试功能没有问题之后需要在项目中引入安卓版的ffmpeg
这里我因为需要使用mp3转amr的功能,而有的ffmpeg没有自带有关amr的编码器,需要自己手动添加安装,时间和技术关系我用了下面的这个ffmpeg,亲测是可用的
https://github.com/tanersener/mobile-ffmpeg
文档里有说明如何引入
关于引入安卓版的ffmpeg后如何测试的问题,可以在网上查找关于ffmpeg指令的教程
tips: 如果你复制的指令执行后报错,可以试试调换里面参数的位置 比如-i后面尽量跟着原文件路径 转换后的新文件路径
一些我使用中遇到的异常
Option sample_rate not found
这个异常主要就是参数设置的问题,建议多找一些ffmpeg指令多试几次
amr_nb not found
这个就是你当前使用的ffmpeg它不支持amr格式的转换
Output file #0 does not contain any stream
这个异常也遇到过,但是忘了怎么解决的,这个遇到的不太多
我使用的指令有两个
一个是pcm转MP3
-y -f s16be -ac 1 -ar 16.0k -acodec pcm_s16le -i 原文件路径.pcm 新文件路径.mp3
需要注意: 开头不能有空格;每个参数之间尽量保证只有一个空格;-ar后面跟着的参数不能乱填,采样率是有标准和要求的,自己写会报错
一个是MP3转amr
-i 原文件路径.mp3 -ar 8000 -ac 1 新文件路径.amr
基本就是这几步了
因为我的项目运行到真机上怎么都打印不出日志,所以遇到的一些问题都只能是一知半解的解决的
需要注意一下,有关文件写入和读取的问题
安卓不同版本直接对文件读写权限是不一样的, 越高版本限制的越严格,基本都只能在android/data/自己的包名下进行文件读写
剩下的内容就是把这个功能作为一个aar进行打包给其他的地方进行调用了
基本上已经完成了功能…
感谢以下帖子
https://blog.csdn.net/bang152101/article/details/106147264/
https://github.com/dadiyang/jave/issues/24
https://blog.csdn.net/shulianghan/article/details/121268792
https://coding.imooc.com/learn/questiondetail/246831.html
https://blog.csdn.net/xiaokangss/article/details/125539755