(Python wave 模块) 不能在不影响播放速度的情况下改变音频采样率
(Python wave module) Can't change audio sampling rate without affecting playback speed
我目前正在进行一个项目,其中包括使用 pygame 在按下按钮时播放声音。由于我没有找到从应用程序录制声音的好方法(我反复尝试使用 PyAudio 和 Portaudio,但无法正常工作)我被迫使用外部程序来录制音频。
我在 pyaudio 混音器中导入的声音的采样率为 44.1 kHz,而程序录制的声音为 48 kHz。
问题来了:
当我录制音频时一切正常,但如果我想导入录制的文件以供进一步使用,播放速度会比平时慢。
我发现这是因为采样率,因为我只能使用 pyaudio 混音器设置一个采样率,我决定尝试使用以下代码将新文件的采样率修改回 44.1 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,但播放速度保持不变?
我在这里找到了答案:Python - downsampling wav audio file
它需要一些调整才能让它工作,因为方法不接受元组,所以在编写框架时只需使用 converted[0] 而不是 converted。
您可以使用 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')
我目前正在进行一个项目,其中包括使用 pygame 在按下按钮时播放声音。由于我没有找到从应用程序录制声音的好方法(我反复尝试使用 PyAudio 和 Portaudio,但无法正常工作)我被迫使用外部程序来录制音频。
我在 pyaudio 混音器中导入的声音的采样率为 44.1 kHz,而程序录制的声音为 48 kHz。
问题来了: 当我录制音频时一切正常,但如果我想导入录制的文件以供进一步使用,播放速度会比平时慢。
我发现这是因为采样率,因为我只能使用 pyaudio 混音器设置一个采样率,我决定尝试使用以下代码将新文件的采样率修改回 44.1 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,但播放速度保持不变?
我在这里找到了答案:Python - downsampling wav audio file
它需要一些调整才能让它工作,因为方法不接受元组,所以在编写框架时只需使用 converted[0] 而不是 converted。
您可以使用 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')