语音变速不变调是指保持音调和语义保持不变,语速变快或变慢。该过程表现为语谱图在时间轴上如手风琴般压缩或者扩展。那也就是说,基频值几乎不变,对应于音调不变;整个时间过程被压缩或者扩展,声门周期的数目减小或者增加,即声道运动速率发生改变,语速也随之变化。
在初步调查后,有两种方案可以实现变速不变调的功能:sonic, sountTouch,两个方案都是用来处理pcm音频文件,支持wav格式,适用于解码后的pcm数据处理。
方案一:sonic
- 处理后文件大小跟倍速值成反比。
- sonic处理单位为帧,存在丢失部分数据的可能,推测是算法内部导致的。
- 引入比较简单,主要函数为c语言编写,只需要引入一个c文件和.h头文件就可以使用。
- 加速后的音质比soundTouch更差。
Sonic实时处理音频流
sonic定义了一个stream流,首先创建一个stream,输入采样率和声道数。然后设置流的相关参数(speed, pitch, rate)。如果要采用实时的方式来处理音频流,便使用sonicWriteToStream()及sonicReadShortFromStream()两个函数来输入输出。
问题:
- 音质损耗问题,通过实验可以发现本来放入2048字节的数据,加速2倍后应该为1024字节的数据,但是实际取出可能为480,甚至1380,数据不均等。
refrence:
方案二:SoundTouch
- 处理后的文件大小跟倍速值成反比。
- 可以处理实时的音频数据但是输入/输出延时约为100ms;
- 引入比sonic更加复杂,需要引入库进行使用。
- 加速后的音质基本没有损耗,从听感上也比sonic的效果更好一些。
SoundTouch实时处理音频流
ST对音频的处理是输入函数putSamples()与输出函数receiveSamples()。实时处理音频流的思路就是,循环读取音频数据段,放入ST进行输出,输出处理后的数据段用于播放。
放入soundTouch的缓冲的数据需要经过处理后才能取出来,对于不同的seque

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





