首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python更改wav文件的音高

Python更改wav文件的音高
EN

Stack Overflow用户
提问于 2017-05-14 20:38:05
回答 3查看 26.7K关注 0票数 17

我需要任何python库来改变我的wav文件的音高,而不需要任何原始音频数据处理。我花了几个小时才找到它,但只找到了一些奇怪的原始数据处理代码片段和视频,这些代码显示了实时的音调变化,但没有源代码。

EN

回答 3

Stack Overflow用户

发布于 2017-05-14 20:52:43

由于wav文件基本上是原始音频数据,如果没有“原始音频处理”,您将无法更改音调。

这是你可以做的。您将需要wave (标准库)和numpy模块。

代码语言:javascript
运行
复制
import wave
import numpy as np

打开文件。

代码语言:javascript
运行
复制
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;您将听到恼人的回声。

代码语言:javascript
运行
复制
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文件)。

代码语言:javascript
运行
复制
    da = np.fromstring(wr.readframes(sz), dtype=np.int16)
    left, right = da[0::2], da[1::2]  # left and right channel

使用numpy中内置的快速傅立叶变换提取频率。

代码语言:javascript
运行
复制
    lf, rf = np.fft.rfft(left), np.fft.rfft(right)

滚动阵列以增加间距。

代码语言:javascript
运行
复制
    lf, rf = np.roll(lf, shift), np.roll(rf, shift)

最高的频率会滚动到最低的频率。这不是我们想要的,所以把它们清零。

代码语言:javascript
运行
复制
    lf[0:shift], rf[0:shift] = 0, 0

现在使用反傅立叶变换将信号转换回振幅。

代码语言:javascript
运行
复制
    nl, nr = np.fft.irfft(lf), np.fft.irfft(rf)

合并这两个通道。

代码语言:javascript
运行
复制
    ns = np.column_stack((nl, nr)).ravel().astype(np.int16)

写入输出数据。

代码语言:javascript
运行
复制
    ww.writeframes(ns.tostring())

处理完所有帧后,关闭文件。

代码语言:javascript
运行
复制
wr.close()
ww.close()
票数 22
EN

Stack Overflow用户

发布于 2018-01-01 22:23:27

我推荐你试试Librosa的音调变换功能:https://librosa.github.io/librosa/generated/librosa.effects.pitch_shift.html

代码语言:javascript
运行
复制
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
票数 11
EN

Stack Overflow用户

发布于 2017-05-17 04:50:36

您可以尝试在整个音频文件和不同格式(wav,mp3等)的快速和轻松的音调改变pydub

这是一个有效的代码。从here获得灵感,并参考here了解更多有关音高改变的细节。

代码语言:javascript
运行
复制
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")
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43963982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档