【视音频编程学习】开源音频加速方案Sonic、SoundTouch对比及实时处理音频的实验分析

本文深入分析了两种音频变速不变调的实现方案——sonic和SoundTouch。sonic虽然简单易用,但存在数据不一致和音质损失的问题,不适合实时处理。相比之下,SoundTouch音质优良,但处理存在间隔,需要通过调整参数来确保数据对应。文章讨论了如何解决缓冲和基音断裂问题,并提出了三种处理策略,强调了数据连续性的重要性。

语音变速不变调是指保持音调和语义保持不变,语速变快或变慢。该过程表现为语谱图在时间轴上如手风琴般压缩或者扩展。那也就是说,基频值几乎不变,对应于音调不变;整个时间过程被压缩或者扩展,声门周期的数目减小或者增加,即声道运动速率发生改变,语速也随之变化。

在初步调查后,有两种方案可以实现变速不变调的功能:sonic, sountTouch,两个方案都是用来处理pcm音频文件,支持wav格式,适用于解码后的pcm数据处理。

方案一:sonic

  1. 处理后文件大小跟倍速值成反比。
  2. sonic处理单位为帧,存在丢失部分数据的可能,推测是算法内部导致的。
  3. 引入比较简单,主要函数为c语言编写,只需要引入一个c文件和.h头文件就可以使用。
  4. 加速后的音质比soundTouch更差。

Sonic实时处理音频流

sonic定义了一个stream流,首先创建一个stream,输入采样率和声道数。然后设置流的相关参数(speed, pitch, rate)。如果要采用实时的方式来处理音频流,便使用sonicWriteToStream()sonicReadShortFromStream()两个函数来输入输出。

问题:
  1. 音质损耗问题,通过实验可以发现本来放入2048字节的数据,加速2倍后应该为1024字节的数据,但是实际取出可能为480,甚至1380,数据不均等。

refrence:

  1. sonic源码分析

方案二:SoundTouch

  1. 处理后的文件大小跟倍速值成反比。
  2. 可以处理实时的音频数据但是输入/输出延时约为100ms;
  3. 引入比sonic更加复杂,需要引入库进行使用。
  4. 加速后的音质基本没有损耗,从听感上也比sonic的效果更好一些。

SoundTouch实时处理音频流

ST对音频的处理是输入函数putSamples()与输出函数receiveSamples()。实时处理音频流的思路就是,循环读取音频数据段,放入ST进行输出,输出处理后的数据段用于播放。

放入soundTouch的缓冲的数据需要经过处理后才能取出来,对于不同的seque

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值