音频处理之语音加速播放

在做语音类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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 音频加速是指改变音频文件的播放速度,但不改变原声的特征和音调。在Matlab中,通过使用合适的算法和技术,可以实现音频加速而不改变原声。 一种常用的方法是使用插值算法,比如线性插值或者样条插值。这些插值算法可以将原始音频信号的采样点进行插值,从而改变音频播放速度。通过增加或减少采样点的数量,可以实现加速或减速音频的效果。 另一种方法是使用改进的重采样算法,如有理分数重采样算法。这种算法可以根据需要的速率变化,在不改变原声质量的情况下修改音频播放速度。该算法根据原来的采样信号生成一个新的序列,并且使新序列的采样频率发生适当的变化,从而实现音频加速。 在使用这些算法加速音频时,我们需要注意保持音频的原声特征和音调。这可以通过在加速过程中调整插值算法的参数和采样点的数量来实现。此外,还可以在执行加速操作之前,对音频信号进行预处理,如滤波、降噪等,以确保音频的质量不受影响。 总之,通过合适的算法和技术,我们可以在Matlab中实现音频加速操作,而不改变原声的特征和音调。这对于音频处理和编辑任务非常有用,如音频剪辑、语音识别等。 ### 回答2: 音频加速是一种处理技术,可以通过增加音频信号的播放速度,来使音频以更快的速度播放。然而,在Matlab中进行音频加速处理时,并不会改变原声音频。 在Matlab中,可以使用音频处理工具箱中的函数来实现音频加速功能。例如,可以使用`audioread`函数读取原始音频文件,将音频数据存储为一个矩阵。然后,可以使用`sound`函数在原声音频的基础上进行音频加速处理。`sound`函数的第一个参数是音频数据的矩阵,第二个参数是音频的采样率。通过调整第二个参数来改变音频播放速度以实现加速效果。但是,无论如何调整第二个参数,都不会对原声音频的数据做出任何修改。而是根据指定的播放速度,生成一个新的音频流进行播放。 因此,音频加速的过程只会影响音频播放的速度,而不会改变原声音频的内容。这意味着,经过音频加速处理后的音频文件,仍然会保留原始音频的音调、节奏和特征。所以,在Matlab中进行音频加速处理,不会对原声音频的数据进行修改。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值