Skip to main content

基于 STFT 的音高和音色转换

项目描述

stftPitchShift

语 语 执照 构建cpp 构建python 标签 皮皮

这是 Stephan M. Bernsee smbPitchShift.cpp的重新实现,这是一种使用短时傅里叶变换 ( STFT ) 的音高变换算法,尤其适用于人声音频信号。

该存储库具有两个类比算法实现,C++Python。两者都包含多个同名的功能块(当然,文件扩展名不同)。

除了基本算法实现之外,它还具有频谱多音高移位和倒谱共振峰保存扩展。

这两个源都包含一个现成的命令行工具以及一个用于自定义需求的库。在构建部分中查看更多详细信息。

也可以随意查看一些演示

模块

StftPitchShift

StftPitchShift模块提供一个全功能的音频处理链来执行单个音轨的音高转换,基于内置的STFT实现。

仅在 C++ 环境中,额外的StftPitchShiftCore模块可用于将这种音高转换实现嵌入到现有的实时STFT管道中。

声码器

Vocoder模块根据原始算法对 DFT 频谱数据进行变换,实际上是瞬时频率估计技术。另请参阅进一步阅读以获取更多详细信息。

特定encode函数用magnitude + j * frequency复数替换输入 DFT 值,表示虚部中基于相位误差的频率估计。

decode函数通过用重建的相位值替换最终修改的频率值,将逆变换回原始 DFT 复数。

投手

Pitcher模块根据指定的分数因子对编码的 DFT 帧执行单音或多音移位。

重采样器

Resampler模块提供linear插值例程,以基于声码器 DFT 变换实际执行音高移位

塞普斯特

Cepster模块估计 DFT 幅度矢量的频谱包,表示声道共振。该计算通过应用低通滤波器在倒谱域中进行。低通滤波器或升降器截止值是以秒或毫秒为单位指定的频率值。

归一化器

Normalizer模块可以选择在相对于原始信号的音高偏移之后立即执行RMS 归一化,以获得大致相同的响度级别。这种校正分别在每个 DFT 帧的频域中进行。

STFT

正如该模块的名称已经暗示的那样,它执行全面的STFT分析和合成步骤。

变调

单节距

由于Vocoder模块将原始 DFT 复数值real + j * imag转换为magnitude + j * frequency表示形式,因此单音高移位是一项相对容易的任务。magnitude和向量都frequency将根据所需的音高偏移因子重新采样:

  • 该因素1意味着没有变化。
  • 该因子<1意味着下采样。
  • 该因子>1意味着上采样。

任何分数重采样因子,例如0.5需要插值。在最简单的情况下,线性插值就足够了。否则,双线性插值也可以应用于两个连续 STFT 跳之间的平滑值。

由于频率矢量改变,重采样频率值也需要乘以重采样因子。

多间距

在多音高移位方面,多个不同的重采样magnitudefrequency向量将被组合在一起。例如,幅度矢量可以很容易地被平均。但是频率向量呢?

这种算法扩展的基本概念是只保留最强幅度值的频率值。所以最强的震级会掩盖最弱的震级。因此,所有剩余的掩蔽分量都变得听不见

这样,可以在同一个DFT帧中同时进行多音高移位。无需为不同的音高变化构建单独的 STFT 流水线以在时域中叠加合成信号。

共振峰保存

音高变化也会导致原始人声共振峰的失真,如果按比例放大会导致所谓的米老鼠效应。减少这种伪影的一种可能性是从音高移动过程中排除共振峰特征。

人声共振峰由频谱包络表示,由平滑的 DFT 幅度向量给出。在这个实现中,DFT 幅度向量的平滑通过低通提升在倒谱域中进行。然后从原始 DFT 幅度中去除提取的包络。剩余的残差激励信号通过音调移位算法。之后,将先前提取的包络与处理后的残差组合。

建造

C++

使用CMake手动构建 C++ 库、主程序和示例程序,如下所示:

cmake -S . -B build
cmake --build build

或者只是从以下位置获取打包的库:

要在您的 C++ 音频项目中包含此库,请研究示例文件夹中的最小 C++ 示例:

#include <StftPitchShift/StftPitchShift.h>

using namespace stftpitchshift;

StftPitchShift pitchshifter(1024, 256, 44100);

std::vector<float> x(44100);
std::vector<float> y(x.size());

pitchshifter.shiftpitch(x, y, 1);

(可选)为自定义构建指定以下 CMake 选项:

  • -DBUILD_SHARED_LIBS=ON启用共享库构建,
  • -DVCPKG=ON启用vcpkg兼容库仅在没有可执行文件的情况下构建,
  • -DDEB=ON为库和主可执行文件启用deb包构建。

Python

Python 程序stftpitchshift可以通过pip install stftpitchshift.

也可以随意探索StftPitchShift您个人音频项目中的 Python 类:

from stftpitchshift import StftPitchShift

pitchshifter = StftPitchShift(1024, 256, 44100)

x = [0] * 44100
y = pitchshifter.shiftpitch(x, 1)

用法

C++ 和 Python 程序都提供了一组类似的命令行选项:

-h  --help       print this help
    --version    print version number

-i  --input      input .wav file name
-o  --output     output .wav file name

-p  --pitch      fractional pitch shifting factors separated by comma
                 (default 1.0)

-q  --quefrency  optional formant lifter quefrency in milliseconds
                 (default 0.0)

-t  --timbre     fractional timbre shifting factor related to -q
                 (default 1.0)

-r  --rms        enable spectral rms normalization

-w  --window     stft window size
                 (default 1024)

-v  --overlap    stft window overlap
                 (default 32)

-c  --chrono     enable runtime measurements
                 (only available in the C++ version)

-d  --debug      plot spectrograms before and after processing
                 (only available in the Python version)

目前仅.wav支持文件。请使用例如AudacitySoX来准备您的音频文件以进行音高转换。

要一次应用多个音高变换,请用逗号分隔每个因子,例如-p 0.5,1,2. 或者,将音高偏移因子指定为由 + 或 - 前缀表示的半音,例如-p -12,0,+12。对于精确的音高校正,在半音之后附加音分数,例如-p -11-100,0,+11+100

要启用共振峰保留功能,请以毫秒为单位指定合适的频率值。根据源信号,从一个小的值开始,例如-q 1。通常,频率值必须小于源信号的基波周期,即基波频率的倒数。

目前,共振峰保留似乎与多音高移位和较小的音高移位因子一起工作得不好。因此需要进一步调查...

进一步阅读

瞬时频率估计

倒谱分析和共振峰变化

学分

执照

stftPitchShift根据 MIT 许可条款获得许可。有关详细信息,请参阅与stftPitchShift 一起分发的随附LICENSE文件。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

stftpitchshift-1.5.tar.gz (16.6 kB 查看哈希

已上传 source

内置分布

stftpitchshift-1.5-py3-none-any.whl (15.0 kB 查看哈希

已上传 py3