python实现语音添加空白时间
python的强大之处在于它有数不尽的第三方类库,今天在这里我完成的是对语音添加空白时间(对单声道处理)。
使用到contextlib,struct,wave,os这些类库我就不在多说了,如果想要知道详细用法,还请您去官网查看!
上代码吧
- 需要解释一下,我使用的语音都为5秒一下的语音,添加时间,使语音总长度为5秒。
1.先获取wav结尾文件,通过长度判断当前语音的长度。
import contextlib
import os
import struct
import wave
import numpy as np
# files 文件路径
# time 为语音总长度
def red_time(files, times):
for path, dir_name, file_xm in os.walk(files):
for name in file_xm:
if name.endswith('wav'):
path_wav = os.path.join(path, name)
with contextlib.closing(wave.open(path_wav, 'rb')) as f:
frames = f.getnframes()
rate = f.getframerate()
duration = frames / float(rate)
# 判断当时语音长度
if times > round(duration, 1):
durations = round(times - round(duration, 1), 1)
print(durations)
# 调用添加空白语音
creata_wav(durations, path_wav, name)
2.自己创建一个添加空白语音的函数。
def creata_wav(durations=None, path_wav=None, name=None):
framerate = 44100
sample_width = 2
duration = durations
frequency = 2000
volume = 1000
x = np.linspace(0, duration, num=duration * framerate)
y = np.sin(0 * np.pi * frequency * x) * volume
sine_wave = y
sine = name.split('.')[0] + '空白.wav'
with wave.open(sine, 'wb') as wf:
wf.setnchannels(1)
wf.setframerate(framerate)
wf.setsampwidth(sample_width)
for i in sine_wave:
data = struct.pack('<h', int(i))
wf.writeframesraw(data)
wf.close()
# 调用写功能
red_wav(path_wav, sine)
3.剩下的属于文件的读写了,读wav文件,将空白写进去即可。
def red_wav(path_wav, sine):
with open(sine, 'rb') as file:
data1 = file.read()
with open(path_wav, 'rb') as file:
data2 = file.read()
data_info = data1[:44] # 复制帧头参考
data_out = data1[44:] + data2[44:] # 将两个音频的数据帧合并(都是相同格式)
data_info = data_info[:4] + struct.pack('<L', len(data_out) + 44) + data_info[8:] # 更新WAV文件的总byte数(两个文件数据帧和+44)
data_info = data_info[:40] + struct.pack('<L', len(data_out)) + data_info[44:] # 更新WAV文件的数据byte数(两个文件数据帧和)
# *** 生成合并后的WAV文件 *** #
with open(path_wav, 'wb') as f:
f.write(data_info + data_out)
print('完成:', path_wav)
4.测试调用
if __name__ == "__main__":
file_path = r'' # 语音路径
file_time = 5 # 添加时间
red_time(file_path, file_time)
print('完成')
这样就可以完成一个语音添加空白时间的功能了。如有什么问题,还请大佬们留言告诉我。