我目前正在开展一个项目,其中包括使用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,但播放速度保持不变?
答案 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')