这里我写了一下语音变速不变调的代码
首先说一下这个原理,如果我们直接通过在两个点中间添加点或减少点的,这样虽然语速是变化了,但同时语调也发生了变化,所以我们需要通过插入或删除基音周期片段的方式来改变语速,首先我们需要获取每一帧的基音周期,随后我们做基音周期的标记,这些在我之前的文章里面有相应的方法和代码,当我们获取到基音周期的标记点,我们就可以周期性的添加波形或删减波形,下面贴出一下我的代码
def speed_adjust(cor, wave_data, point):
“”“cor:调节系数
wave_data:pcm数据
point:基音周期的点
”“”
wave_data = list(wave_data)
wa = []
if cor < 1:
add_num = len(point)*(1-cor)
every = int(len(point)//add_num)
for i in range(len(point)-1):
start = point[i]
end = point[i + 1]
if i % every == 0:
wa.extend(wave_data[start:end])
wa.extend(wave_data[start:end])
else:
wa.extend(wave_data[start:end])
elif cor > 1:
decrease_num = len(point) - (len(point) // cor)
every = int(len(point) // decrease_num)
for i in range(len(point) - 1):
start = point[i]
end = point[i + 1]
if i % every == 0:
continue
else:
wa.extend(wave_data[start:end])
speed_data = np.array(wa, dtype="int16")
return speed_data