基于MATLAB的PSOLA算法语音合成与修改系统
项目介绍
本项目实现了一个基于基音同步叠加(PSOLA)算法的语音信号处理系统。PSOLA是一种经典的语音合成技术,其核心在于通过在时域对语音信号进行重叠和相加,实现在不破坏语音音质和共振峰结构的前提下,对语音的音高(Pitch)和时长(Duration)进行灵活调整。该系统不仅包含了核心的合成算法,还集成了从信号采样、预处理、基音检测到可视化分析的完整流程。
功能特性
- 自动化测试信号生成:内建合成语音生成功能,通过脉冲串激励和共振峰模拟滤波器产生可直接运行的测试音频。
- 高精度预处理:包含一阶高通滤波预加重处理,有效提升语音信号的高频分量,增强后续基音分析的可靠性。
- 基音参数提取:采用基于自相关函数(ACF)的时域提取方法,结合中值滤波技术,能够准确追踪语音的基音频率变化。
- 基音同步点定位:通过基音周期引导下的局部峰值搜索算法,精确标记语音的时域循环特征点。
- 变调不变速处理:通过改变合成标记点的间距,实现音高的升降调节。
- 变速不变调处理:通过调整合成后的时间轴比例,实现语速的快慢控制。
- 高质量语音重构:应用汉宁窗(Hanning Window)对信号段进行平滑,并利用重叠相加法(Overlap-and-Add)确保波形连接处的相位连续性。
- 多维度分析工具:提供原始与合成信号对比图、基音频率变化曲线以及语谱图,方便用户直观评估处理效果。
使用方法
- 启动程序:在MATLAB开发环境中直接运行主程序脚本。
- 设置参数:
* 通过修改变量 alpha 来调整音高(alpha > 1 为升高,alpha < 1 为降低)。
* 通过修改变量 beta 来调整语速(beta > 1 为减速/变长,beta < 1 为加速/变短)。
- 结果输出:程序运行后,会自动在当前目录下生成 input_test.wav(输入信号)和 output_modified.wav(处理后的信号)。
- 观察评估:MATLAB会自动弹出可视化窗口,展示处理前后的波形、频率轨迹和频谱分布。
系统要求
- 软件环境:MATLAB R2016b 或更高版本。
- 所需工具箱:Signal Processing Toolbox(信号处理工具箱)。
实现逻辑与细节分析
1. 信号预处理
系统首先执行预加重过程,其传递函数为 H(z) = 1 - 0.95z⁻¹。这一步骤的作用是补偿语音信号中高频成分的衰减,使得语音的每一个周期特征在时域波形中更加明显,利于基音同步点的准确捕捉。
2. 基音轨迹检测
- 分帧与加窗:将信号切分为30ms的帧,帧移为10ms,并对每帧施加汉宁窗。
- 相关性分析:利用自相关函数计算信号的周期性。通过在预设的基音区间(50Hz至500Hz对应的采样点范围)内寻找最大相关峰,确定该帧的基音周期。
- 语音判定:通过基音峰值与原点处能量的比值来区分清音(Unvoiced)和浊音(Voiced)。对于清音部分,将其基音周期设为0,并在后续合成中采用默认值处理。
- 轨迹平滑:应用5点中值滤波,消除由于环境噪声或分析误差产生的基音跳变点。
3. 基音同步点(Epochs)定位
系统在信号的时域波形中提取分析标记点。首先寻找起始峰值,随后根据当前帧所检测到的基音周期进行“跳跃”。在跳跃后的目标位置周边,算法会进行微调以锁定局部的最大值。这种自适应搜索机制确保了标记点始终位于波形的每一个周期起始处。
4. 基于PSOLA的重构逻辑
- 时间映射:根据时长缩放系数 beta 生成合成点的时间轴,并将每一个合成点映射回原始信号的分析标记点。
- 音高调整:计算合成标记点之间的距离时,引入音高系数 alpha。实际合成的每一个基音段通过 (原始周期 / alpha) 来确定新的叠加位置,从而实现频率的压缩或扩张。
- 片段提取与加窗:在每个标记点处提取长度为两个基音周期的信号块,并施加汉宁窗。双周期的提取保证了重叠相加时信号的能量平衡。
- 重叠相加(OLA):将处理后的加窗片段根据合成标记点序列进行叠加。利用窗函数的对称特性,使得两个相邻片段在重叠区实现平滑过渡,消除了可能出现的点击声或相位断裂。
5. 可视化分析
合成结束后,系统生成六组对比图表。重点展示了处理后的语音时长是否达到了 beta 倍,音高频率是否相应发生了 alpha 倍的偏移。语谱图尤其重要,它展示了共振峰位置在变调处理后是否得到了良好的保持,这是衡量合成算法质量的关键指标。