语音更改技术:变调与变速的原理及实现

一、核心概念区分

语音更改技术主要包括变调(Pitch Shifting)和变速(Time Stretching)两类,两者的核心差异在于:

  • 变调:改变语音的音高(如男声变女声、乐器调弦),但不改变语速和语义;
  • 变速:改变语音的语速(如快放、慢放),但不改变音高和语义。

二、变调技术(Pitch Shifting)

变调的本质是调整语音的基频(F0,即声带振动频率),同时保持共振峰(Formant,决定音色和语义的关键频率)不变。常见方法包括:

1. 重采样法(时域)
  • 原理:通过上采样(插入样本点)或下采样(抽取样本点)改变信号的采样率,从而调整基频。例如,将采样率提高2倍,基频也会提高2倍(音调变高),但语速会变快;需结合变速不变调处理(如timeshift)抵消语速变化。

  • 实现(MATLAB)

    [y, fs] = audioread('input.wav'); % 读取音频
    y_up = resample(y, 2, 1); % 上采样2倍(基频提高)
    y_up_slow = timeshift(y_up, 2); % 变速2倍(抵消语速变快)
    audiowrite('pitch_up.wav', y_up_slow, fs); % 保存结果
    
2. 短时傅里叶变换(STFT)法(频域)
  • 原理:将语音信号转换为时频谱(时间-频率-幅度),通过调整频率轴的缩放比例改变基频,同时保持时间轴不变。例如,将频率轴压缩1.5倍,基频提高1.5倍(音调变高),但语速不变。

  • 实现(MATLAB)

    [y, fs] = audioread('input.wav');
    spec = spectrogram(y, 1024, 512, 1024, fs); % 计算STFT
    spec_shifted = spec .* exp(1j*2*pi*0.5*spec); % 频率轴缩放(基频提高0.5倍)
    y_pitch = istft(spec_shifted, 1024, 512, 1024, fs); % 逆STFT
    audiowrite('pitch_shifted.wav', y_pitch, fs);
    
3. 线性预测编码(LPC)法(参量域)
  • 原理:通过线性预测模型提取语音的共振峰参数(决定音色)和基频参数(决定音调),调整基频参数后重新合成语音。例如,将基频参数乘以1.2,音调提高1.2倍,同时保持共振峰不变(音色不变)。

  • 实现(MATLAB)

    [y, fs] = audioread('input.wav');
    [a, g] = lpc(y, 10); % 提取LPC系数(共振峰)
    f0 = pitch(y, fs); % 提取基频
    f0_shifted = f0 * 1.2; % 基频提高1.2倍
    y_lpc = lpcsynthesis(a, g, f0_shifted, length(y)); % 重新合成语音
    audiowrite('lpc_pitch.wav', y_lpc, fs);
    

三、变速技术(Time Stretching)

变速的本质是调整语音的时间长度,同时保持基频共振峰不变。常见方法包括:

1. 同步波形叠加法(SOLA)
  • 原理:将语音信号分帧,通过重叠相加(Overlap-Add)调整帧移距离,从而改变语速。例如,将帧移从10ms增加到20ms,语速减慢1倍,但基频不变(音调不变)。

  • 实现(MATLAB,基于Voicebox工具箱)

    [y, fs] = audioread('input.wav');
    frames = enframe(y, 1024, 512); % 分帧(帧长1024,帧移512)
    frames_slow = sola(frames, 2); % SOLA变速2倍(语速减慢)
    y_slow = deframe(frames_slow, 1024, 512); % 合并帧
    audiowrite('time_slow.wav', y_slow, fs);
    
2. 相位声码器(Phase Vocoder)
  • 原理:通过短时傅里叶变换(STFT)提取语音的幅度谱相位谱,调整时间轴的缩放比例,然后通过逆STFT合成语音。例如,将时间轴压缩0.8倍,语速加快1.25倍,但基频不变(音调不变)。

  • 实现(MATLAB)

    [y, fs] = audioread('input.wav');
    [S, f, t] = spectrogram(y, 1024, 512, 1024, fs); % STFT
    S_stretched = phasevocoder(S, 0.8); % 时间轴压缩0.8倍(语速加快)
    y_fast = istft(S_stretched, 1024, 512, 1024, fs); % 逆STFT
    audiowrite('time_fast.wav', y_fast, fs);
    
3. 线性预测合成法(LPC)
  • 原理:通过线性预测模型提取语音的共振峰参数基频参数,调整激励信号的长度(如将10ms的激励信号延长到20ms),从而改变语速。例如,将激励信号长度加倍,语速减慢1倍,但基频不变(音调不变)。

  • 实现(MATLAB)

    [y, fs] = audioread('input.wav');
    [a, g] = lpc(y, 10); % 提取LPC系数
    f0 = pitch(y, fs); % 提取基频
    y_lpc_slow = lpcsynthesis(a, g, f0, length(y)*2); % 激励信号延长2倍(语速减慢)
    audiowrite('lpc_time_slow.wav', y_lpc_slow, fs);
    

参考代码 该程序主要涉及语音更改技术,语音的变调及变速 www.youwenfan.com/contentcnq/65816.html

四、工具与库推荐

  • MATLAB:内置audio Toolbox(含timeshiftpitchshift函数)、Voicebox(含enframesola函数);
  • Pythonlibrosa(音频处理库,含time_stretchpitch_shift函数)、pydub(简化音频操作);
  • 专业软件:Adobe Audition(图形化界面,支持变调/变速)、Audacity(开源音频编辑器,含Change PitchChange Speed插件)。

五、应用场景

  • 变调:语音合成(如TTS系统调整音色)、音乐制作(如调整乐器音调)、语音加密(如改变音调实现简单加密);
  • 变速:语音识别(如调整语速适应不同说话速度)、语言学习(如慢放语音帮助听力练习)、音频编辑(如快放/慢放视频配音)。

六、注意事项

  • 音质权衡:过度变调/变速可能导致语音失真(如基频调整过大导致音色变化),需合理选择参数(如变调范围±2半音,变速范围0.5-2倍);
  • 实时性:相位声码器和LPC法计算量较大,实时应用需优化算法(如使用GPU加速);
  • 多模态融合:结合噪声注入(如添加背景噪声)可提升模型的鲁棒性(如语音识别系统适应不同环境)。
posted @ 2026-01-26 16:35  徐中翼  阅读(13)  评论(0)    收藏  举报