我需要任何Python库来改变我的WAV文件的音调,而无需任何原始音频数据处理。我花了几个小时找到它,但只发现了一些奇怪的原始数据处理代码片段和视频,它显示了实时音高转换,但没有源代码。Python的变化音调的WAV文件
回答
由于wav
文件基本上是原始音频数据,您将无法改变音高没有“原始音频处理”。
这是你可以做的。 您将需要wave
(标准库)和numpy
模块。
import wave
import numpy as np
打开文件。
wr = wave.open('input.wav', 'r')
# Set the parameters for the output file.
par = list(wr.getparams())
par[3] = 0 # The number of samples will be set by writeframes.
par = tuple(par)
ww = wave.open('pitch1.wav', 'w')
ww.setparams(par)
声音应该在小部分时间内处理。这减少了混响。尝试将fr
设置为1;你会听到恼人的回声。
fr = 20
sz = wr.getframerate()//fr # Read and process 1/fr second at a time.
# A larger number for fr means less reverb.
c = int(wr.getnframes()/sz) # count of the whole file
shift = 100//fr # shifting 100 Hz
for num in range(c):
读取数据,将其分成左右声道(假设是立体声WAV文件)。
da = np.fromstring(wr.readframes(sz), dtype=np.int16)
left, right = da[0::2], da[1::2] # left and right channel
使用内置于numpy中的快速傅立叶变换来提取频率。
lf, rf = np.fft.rfft(left), np.fft.rfft(right)
滚动数组以增加音调。
lf, rf = np.roll(lf, shift), np.roll(rf, shift)
最高频率翻到最低频率。这不是我们想要的,所以将它们归零。
lf[0:shift], rf[0:shift] = 0, 0
现在使用傅立叶逆变换的信号转换回幅度。
nl, nr = np.fft.irfft(lf), np.fft.irfft(rf)
组合这两个通道。
ns = np.column_stack((nl, nr)).ravel().astype(np.int16)
写出输出数据。
ww.writeframes(ns.tostring())
处理所有帧时关闭文件。
wr.close()
ww.close()
好的。我可以读第一秒,并将音高改变500(什么?),我想要例如改变音高1个半音。我如何读取整个文件并为whle文件改变一次音高。我不相信只有改变每秒的音调才有可能。当我尝试'readframes(wr.getnframes())'和'np.roll(lf,500)'音调不变,我需要使用另一个更大的值而不是500. –
@DanielReshetnikov我已经重写我的答案。事实证明,您需要一次处理几分之一的时间以防止令人讨厌的回响。 –
现在我可以转置整个文件。这有点好一点。现在我可以改变hertzes的音调,但不幸的是,不可能将hertzes转换为半音(我的错 - 我没有在这个问题中概述它)。 –
您可以尝试pydub跨越整个音频文件快速和容易的音调变化和不同的格式(WAV,MP3等)。
这里是一个工作代码。来自here的灵感,并参考here了解更多音高变化细节。
from pydub import AudioSegment
from pydub.playback import play
sound = AudioSegment.from_file('in.wav', format="wav")
# shift the pitch up by half an octave (speed will increase proportionally)
octaves = 0.5
new_sample_rate = int(sound.frame_rate * (2.0 ** octaves))
# keep the same samples but tell the computer they ought to be played at the
# new, higher sample rate. This file sounds like a chipmunk but has a weird sample rate.
hipitch_sound = sound._spawn(sound.raw_data, overrides={'frame_rate': new_sample_rate})
# now we just convert it to a common sample rate (44.1k - standard audio CD) to
# make sure it works in regular audio players. Other than potentially losing audio quality (if
# you set it too low - 44.1k is plenty) this should now noticeable change how the audio sounds.
hipitch_sound = hipitch_sound.set_frame_rate(44100)
#Play pitch changed sound
play(hipitch_sound)
#export/save pitch changed sound
hipitch_sound.export("out.wav", format="wav")
我试过你的代码。音调变化不错,但播放速度也在变化。我只需要改变音调。 –
我建议尝试Librosa的音高移功能: https://librosa.github.io/librosa/generated/librosa.effects.pitch_shift.html
import librosa
y, sr = librosa.load('your_file.wav', sr=16000) # y is a numpy array of the wav file, sr = sample rate
y_shifted = librosa.effects.pitch_shift(y, sr, n_steps=4) # shifted by 4 half steps
- 1. Python播放mp3/wav文件音频(Pygame调音台)
- 2. Python算法去噪音wav文件
- 3. 语音音调的变化
- 4. WAV文件缺少音频和录音
- 5. 抑制wav文件中的噪音
- 6. 在wav文件中的声音/沉默
- 7. C++ - 正常化wav文件的音量级别
- 8. 使用python在音频文件中的某个点插入WAV
- 9. 我想通过语音调制解调器播放Wav文件
- 10. 转换音乐wav文件的文本,我想给一个音频wav文件的符号
- 11. Python上的麦克风的Wav文件
- 12. 将FLAC音频文件隐藏到wav音频文件在android
- 13. 如何更改节点中音频WAV文件的音高?
- 14. 记录音频文件为MP3或WAV
- 15. Java - 下采样wav音频文件
- 16. 播放WAV文件时单击声音
- 17. 用数字表示音频.wav文件
- 18. 记录语音转换成.wav文件
- 19. PJSUA2 - 将音频录制为wav文件
- 20. 处理音频wav文件与C
- 21. 将声音导出为WAV文件
- 22. 如何将声音(WAV)写入文件
- 23. 拆分python中的wav文件
- 24. 从wav文件c到文本的语音#
- 25. 减慢音频文件的播放而不改变其音调?
- 26. Python wav如何获取音量?
- 27. 将wav文件转换为wav文件
- 28. 如何从python中的.wav音频文件中删除/减少噪声
- 29. 如何将音频文件(wav格式)拼接成python中的1秒拼接?
- 30. 如何触发在Mac上播放WAV或MP3音频文件的Python?
网站规则的状态,我们不是在这里找到一个库,你可以创建一个对这一问题。如果你已经搜索并找不到一个 - 赔率是没有的,你必须自己写。至少这是常态,如果你没有得到任何答案或者你的问题被关闭,我只是通知你这件事。 – Torxed
在您的搜索引擎中输入'ffmpeg python',然后从中取出。 – boardrider