在做语音类APP时,语音留言(以码流形式)会被保存下来。当听时想快点听完,于是就有了语音加速播放功能。同时还有个需求,能实时切换播放速率,即当1.5倍速播放时切两倍速,就要立刻两倍速播放。

首先做了一番调研,看几倍速后就基本上听不清说什么了。找来了一款能在PC上运行的有加速播放功能的软件,试验下来两倍速以上就基本上听不清说什么了。于是除了正常速率外,只有两个速率可调:1.5倍速和两倍速。同时搜了一下变速相关的开源算法(算法原理请看其他相关文章),发现主打变声功能的sound touch使用率较高。它可以改变音调(pitch)和语速(rate)等,好多软件拿它做一些趣味音频。基于sound touch做了一个应用程序看加速效果,同时要兼顾男声和女声。试验下来发现语速加快了后音调就变了,也就是还要同时调音调。改了音调做了一番调试后只能接近原声,能兼顾男女声。再试试在PC上运行的软件,加速后也是只能接近原声。做了这些后就决定用sound touch来做了,在不同的速率下音调(pitch)和语速(rate)参数值也确定了下来(男女声在一个速率下用一组参数值)。

再看我们的相关代码,系统支持ILBC和OPUS两种codec,ILBC每帧30ms, OPUS每帧20ms, 播放线程每20ms运行一次,即每次取20ms PCM数据播放。要想播放语音留言,首先要解码码流成PCM 数据放在buffer1中,再看是否要加速播放,要加速的话就把buffer1中的语音数据调加速函数处理后放在buffer2中,不加速就把buffer1中的语音数据直接拷进buffer2中,等待buffer2中的数据被取走播放。根据这些经过一番尝试后用了分段循环处理的实现方法。一个循环内取固定时间长度的原始音频帧,取出的这段音频帧不管是否加速在这个循环内都要正好播放完,同时兼顾ILBC和OPUS两种不同的帧长和1.5倍速两倍速两种不同的速率。ILBC时,每帧30ms,每次取20ms播放,有1.5倍速两倍速两种速率,最小的原始PCM数据长度(即最小固定长度)是120ms(原始ILBC帧数是4帧,1.5倍速后是80ms,4次可取完播放,2倍速后是60ms,3次可取完播放)。OPUS时,每帧20ms,每次取20ms播放,有1.5倍速两倍速两种速率,最小的原始PCM数据长度也是120ms(原始OPUS帧数是6帧,1.5倍速后是80ms,4次可取完播放,2倍速后是60ms,3次可取完播放)。所以一个循环内取的最小原始音频的固定长度是120ms. 一个循环结束后正好播放完,清空buffer2,然后取下一段原始音频帧解码加速后播放。为了在循环内播放时声音不断断续续,buffer2里要有足够的数据供取走播放。这样在每个循环刚开始的时候,要尽可能多的解码帧数加速后放在buffer2中等取走播放。至于几次解码完所需的码流帧数,这要根据cpu来定。一般一个循环的前一两次就把码流解码加速做完了,后面的次数里只需要从加速后的buffer2里取数据播放就可以了。这样循环内每次播放线程运行时都能取到数据播放,下一循环开始时也能取到数据播放,不存在断断续续的情况。

当要求实时切换语速时,要把这120ms原始语音数据播放完在下一个循环里才能改变语速。由于120ms很短,用户基本无感知,可以认为是实时的,不影响用户体验。当到语音结尾时,有多少帧就解码加速多少帧供播放,当从加速后的buffer里不能取到20ms数据就可认为播放结束了。这时用零补足20ms数据,把这些数据播放出去,从而结束播放。

跟上层的UI联调后效果不错。这样APP内的语音加速方案就搞定了。

音频处理之语音加速播放相关推荐

  1. Node + 讯飞语音 定时播放天气预报音频

    前言 最近看了几篇文章,总觉得自己没发挥树莓派的作用,于是就琢磨着,哎,灵光一闪,整一个早晨叫醒服务,于是便有了本篇水文. 功能 每天早上八点钟,定时播放音频(音频内容为当天天气预报和空气质量),播放 ...

  2. java 音频倍速播放_如何让视频加速播放

    当下的视频工作者越来越多,很多人在闲暇时间也会制作一些好玩有趣的短视频上传一些社交媒体.下面分享一个让视频加速播放的软件以及制作方法,学会这个方法后,可以制作一些有趣的加速视频啦!一起来看看吧. 具体 ...

  3. STM32MP157-Linux音频应用编程-语音转文字项目

    文章目录 前言 STM32MP157语音识别 alsa-lib简介: 移植alsa-lib库: libcurl库简介: 安装CURL 移植CURL API调用 录音 文件IO 打开音频文件 打开缓冲文 ...

  4. 微信小程序web-view使用audio标签播放音频文件时无法自动播放的问题

    重点: 这个解决方法仍然最少还是需要点击一次才可以, 完全不点击就自动播放的方法暂时还是没有找到 1. 背景 我要实现的功能是语音导航, 需要将导航的信息通过文字转换成语音, 然后播放出来. 现在就差 ...

  5. Edusoho网校对接阿里云视频vod实现CDN云视频加速播放OSS

    操作系统: Linux 推荐使用Ubuntu,CentOS Web服务器: 推荐Nginx或Apache2 MYSQL数据库: 推荐5.5及以上版本 主要文件目录结构说明 目录 说明 App 应用程序 ...

  6. AudioPlayer.js实现限制仅播放一条语音、多条语音顺序播放、自动播放(有限制)、调整语音条长度

    AudioPlayer.js实现限制仅播放一条语音.多条语音顺序播放.自动播放(有限制).调整语音条长度 使用场景:语音直播,实现点击播放某一条语音,暂停其他播放中的语音.播完一条语音,自动播放下一条 ...

  7. 树莓派全语音控制媒体播放器(Fully Speech-Controlled Media Player)

    树莓派全语音控制媒体播放器(Fully Speech-Controlled Media Player) 主要特点: *全程无外设操作,可以在无鼠标键盘显示器等外设的情况下(Headless),完全通过 ...

  8. HTML中简单的声音语音MP3播放代码

    HTML中简单的声音语音MP3播放代码 在网页中播放MP3 语音播放代码 各浏览器默认支持的音频格式 在网页中播放MP3 我们有时候需要在网页里播放一段提示声音,如何通过几行代码就能实现在网页中播放各 ...

  9. Flutter简单聊天界面布局及语音录制播放

    目录 前言: 注意事项: 用到的部分组件依赖及版本: 遇到的坑 遇到的坑1: 遇到的坑2: 遇到的坑3: 遇到的坑4: Fluuter语音录制及播放组件生命周期 Flutter录音组件生命周期图: F ...

  10. php倒放,神奇创意怎么让视频倒着播放 还有减速或加速播放

    不知道大家有没有试过把一个视频倒着播放,就是把开始和结束的时间对调,如果你没试过,那么你肯定体会不到其中的乐趣,即使是一个很普通的视频,倒着播放之后也会有你意想不到的效果哦,不信你就跟小编一起见证这奇 ...

最新文章

  1. restful可以转发么_DRF使用超链接API实现真正RESTful
  2. 阿里达摩院2020趋势第一弹:感知智能的“天花板”和认知智能的“野望”(附链接)...
  3. C语言过河问题主函数,c,c++_C语言踩石头过河问题,用DFS搜索递归了17万次但是没报错,请问是什么原因?,c,c++,算法 - phpStudy...
  4. 服务器怎么虚拟化内存,服务器虚拟化内存大小
  5. 宁波深化智慧城市建设开启智能交通新模式
  6. sqli-labs less11 POST注入-字符型
  7. Java EE CDI依赖注入(@Inject)教程
  8. 设计灵感|教会你海报设计套路
  9. vnpy学习_02各文件功能梳理
  10. html blob处理图片,将Blob图像预览为HTML5
  11. 硬盘播放器和pc计算机,电脑可不可以用来当电影播放器用
  12. 纯swift开发,弹幕,演唱会广告牌
  13. 任务栏优化工具TrueLaunchBar
  14. 【MYSQL】【基础知识】【MySQL的基本使用】
  15. ROS Noetic KDL与TracIk安装
  16. Linux故障——开机显示!!!failed to loadSELinux policy,freezing...
  17. 20万赚200万,48岁创业者是这样吊打小鲜肉的!
  18. Ubuntu安装apex教程
  19. odoo学习必看-提问的智慧《How To Ask Questions The Smart Way》
  20. ARM GIC(三) gicv2架构

热门文章

  1. mongodb默认的用户名密码_Linux如何安装、运行MongoDB教程
  2. C++变量初始化问题
  3. 学生管理系统java源代码_java学生管理系统源代码
  4. 冰点文库下载器2021新版 v3.2.16
  5. SAP GUI 安全性 下载文件
  6. 微信小程序项目源代码SSM考勤签到管理系统
  7. Linux中的jobs、fg与bg命令
  8. 【组合数学】递推方程 ( 有重根下递推方程通解结构 | 线性无关解 | 有重根下的通解 | 有重根下的递推方程求解示例 | 递推方程公式解法总结 ) ★
  9. 线切割计算机传输出错,为什么线切割单板机总传不了或出错?解开传送数据之迷...
  10. 诺基亚5800软件测试初学者,诺基亚5800刷机【教程详解】