(Python波形模块)在不影响播放速度的情况下无法改变音频采样率

时间:2017-03-15 12:27:11

标签: windows python-2.7 audio pygame wave

我目前正在开展一个项目,其中包括使用pygame在按钮上播放声音。由于我没有找到一种从应用程序录制声音的好方法(我反复尝试使用Portaudio的PyAudio,但无法使其工作)我被迫使用外部程序来录制音频。

我在pyaudio混音器中导入的声音的采样率为44,1 kHz,而节目录制的声音为48 kHz。

问题出现了: 当我录制音频时,一切都很好,但是如果我想导入录制的文件以供进一步使用,它的播放速度通常比较慢。

我发现这是因为采样率,因为我只能用pyaudio混频器设置一个采样率,所以我决定尝试用这段代码将新文件的采样率修改回448 kHz:

import wave
spf = wave.open('C:\Users\mavri\Desktop\My Recordings\zvuk.wav', 'rb')                  
CHANNELS = spf.getnchannels()
swidth = spf.getsampwidth()
RATE=spf.getframerate()
signal = spf.readframes(-1)
spf.close()
wf = wave.open('C:\Users\mavri\Desktop\My Recordings\zvuk.wav', 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(swidth)
wf.setframerate(44100)
wf.writeframes(signal)
wf.close()

现在问题是一样的,但这次它会影响音频文件,而不是pygame。音频文件比平时慢。 我尝试使用样本宽度,将其乘以新的采样率并除以44100,但我得到的只是大量的嘶嘶声提醒声音,但远不及它。

我的问题是:如何修改提供的代码,以便创建的新文件的采样率为44,1 kHz,但播放速度保持不变?

2 个答案:

答案 0 :(得分:0)

我在这里找到了aswer:Python - downsampling wav audio file

需要稍微调整才能使其工作,只需在编写帧时使用convert [0]而不是转换,因为方法不接受元组。

答案 1 :(得分:0)

您可以使用 librosa 更改采样率 但是,librosa 在安装时通常会遇到问题

安装

使用 conda 环境

python --> 3.6.8
conda install ffmpeg=4.3.1
conda install numba=0.48
pip install librosa==0.6.0

代码

import librosa

audio_file = "Original.wav" #48KHz

#SAME PLAYBACK SPEED
x, sr = librosa.load(audio_file, sr=44100)
librosa.output.write_wav("Test1.wav", x, sr=22050, norm=False)

#SAME PLAYBACK SPEED
x, sr = librosa.load(audio_file, sr=48000)
y = librosa.resample(x, 48000, 44100)
librosa.output.write_wav("Test3.wav", y, sr=44100, norm=False)

#SLOW PLAYBACK SPEED
x, sr = librosa.load(audio_file, sr=48000)
librosa.output.write_wav("Test2.wav", x, sr=44100, norm=False)

更新

libroa 保存输出时默认将数据类型更改为 32 位浮点数。 因此,要保存数组,请在保存音频时使用 soundwrite 并指定数据类型

import soundfile as sf
data, samplerate = soundfile.read('old.wav')
sf.write("Test4.wav", x, 22050, subtype='PCM_16')