语音批量添加空白时间

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(', 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(', len(data_out) + 44) + data_info[8:]  # 更新WAV文件的总byte数(两个文件数据帧和+44)
    data_info = data_info[:40] + struct.pack(', 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('完成')

这样就可以完成一个语音添加空白时间的功能了。如有什么问题,还请大佬们留言告诉我。

你可能感兴趣的:(语音批量添加空白时间)