python - 如何使用 Python 从 fft-spectrum 创建声音文件?

标签 python audio signal-processing

假设我有一个 1 秒长的声音文件 (file1.wav)。
我可以通过阅读它

from scipy.io import wavfile
samplerate, data = wavfile.read("file1.wav")
然后我可以通过以下方式对其进行傅里叶变换:
from scipy.fft import fft
yf=fft(data)
现在假设我有另一个文件 2,它也包含一个声音,它的持续时间与文件 1 不同(它也可能有另一个采样率)。
现在我想从频谱 yf 创建一个声音,它与 file2 一样长,并添加两者。
如何使用 file2 的采样率和持续时间计算来自 file1 的声音,以便能够同时添加两者?

最佳答案

听起来这里的基本问题是“我如何将音频拉伸(stretch)/压缩到另一个持续时间”。这是一项不平凡的任务,没有一种 Elixir 的方法可以在所有情况下都有效。见 Audio time stretching and pitch scaling在维基百科上。您操作的是哪种音频很重要:语音、音乐还是其他。
一个不错的起点是基于波形相似性的同步重叠相加或 WSOLA 算法。执行 WSOLA 的一种方法是使用免费的 SoX command line utility使用它的“节奏”效果:

Change the audio playback speed but not its pitch. This effect uses the WSOLA algorithm. The audio is chopped up into segments which are then shifted in the time domain and overlapped (cross-faded) at points where their waveforms are most similar as determined by measurement of ‘least squares’.


示例使用:
sox infile.wav outfile.wav tempo -s 1.1
1.1表示“加速 10%”和 -s配置语音(其他选项是 -m 用于音乐或 -l 用于通用“线性”处理)。除此之外还有其他选项,check out the documentation了解更多详情。
(旁注:一个相关的问题是在不改变持续时间的情况下改变音频的音高。SoX 也可以做到这一点;请参阅“音高”和“弯曲”效果。)
如果你想在 Python 中执行时间拉伸(stretch),有一个 pysox包装 SoX 的库。 Python 中的另一种可能性是 audiotsm ,它实现了 WSOLA 和其他几个时间拉伸(stretch)方法。

关于python - 如何使用 Python 从 fft-spectrum 创建声音文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64138077/

相关文章:

python - 存储和调用数据的最有效方法是什么?

audio - 如何将声音输入与预先确定的声音进行比较?

c++ - 使用 TI-MSP430 的 DSP 的 C/C++ 库或示例代码

java - Matlab filtfilt()函数在Java中的实现

java - 直接从生成的声音阵列在 Kotlin/Java 中播放声音

python - DatabaseError no such table with a ManyToManyField

Python:将包含非 ASCII 字符的列表写入文本文件

python - Numpy 中的向量化字符串操作 : why are they rather slow?

android - 这是什么 android_clip.h 和 hello_clip.h 文件格式,我该如何制作?

java - 如何停止已经播放的声音并立即开始另一个