<p>由于<code>scipy.signal.resample</code>可以是<a href="https://stackoverflow.com/questions/52336754/both-fast-and-very-slow-scipy-signal-resample-with-the-same-input-size">very slow</a>,我搜索了其他适合音频的算法。</p>
<p>看起来,Erik de Castro Lopo的<a href="http://www.mega-nerd.com/SRC/download.html" rel="noreferrer">SRC</a>(又称秘密兔子代码,又称libsamplerate)是可用的最佳重采样算法之一。</p>
<ul>
<li><p>scikit的<code>scikit.samplerate</code>使用它,但是这个库的安装似乎很复杂(我在Windows上放弃了)。</p></li>
<li><p>幸运的是,有一个易于使用且易于安装的Python包装器,<code>libsamplerate</code>,由Tino Wagner:<a href="https://pypi.org/project/samplerate/" rel="noreferrer">https://pypi.org/project/samplerate/</a>制作。使用<code>pip install samplerate</code>安装。用法:</p>
<pre><code>import samplerate
from scipy.io import wavfile
sr, x = wavfile.read('input.wav') # 48 khz file
y = samplerate.resample(x, 44100 * 1.0 / 48000, 'sinc_best')
</code></pre></li>
</ul>
<p>许多重采样解决方案的有趣阅读/比较:
<a href="http://signalsprocessed.blogspot.com/2016/08/audio-resampling-in-python.html" rel="noreferrer">http://signalsprocessed.blogspot.com/2016/08/audio-resampling-in-python.html</a></p>
<hr/>
<p><strong>附录:</strong>重新采样扫频(20hz至20khz)的光谱图比较:</p>
<p>1)原件</p>
<p><img src="https://i.stack.imgur.com/RiOLd.jpg" width="250"/></p>
<p>2)使用libsamplerate/<code>samplerate</code>模块重新采样</p>
<p><img src="https://i.stack.imgur.com/rJj7H.jpg" width="250"/></p>
<p>3)使用<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.interp.html" rel="noreferrer">^{<cd6>}</a>(“一维线性插值”)重新采样:</p>
<p><img src="https://i.stack.imgur.com/WE1HG.jpg" width="250"/></p>