WAV格式音频截取

【功能】
通常我们会拿到例如某个歌手的演唱会完整版的WAV格式的争端音频,而我们想对该音频进行分割或其中某些部分才是我们实际真正想要的音频段落,为此我们需要设计一个可以按照指定时分秒进行截取的程序。
要求实现的功能如下:
1.根据指定的起止时分秒的设置,截取出对应起止时段的WAV音频;
2.为每段截取出来的音频设置音频名称、专辑名称、歌手名称等信息
3.可以在某个参数表中进行批量设置

【需要的安装包/依赖】
1.WAV
2.pandas
3.sox:安装的位置需要与代码中设置的位置保持一致,本例中将sox.exe放置于sox_path=“D:\sox\sox-14-4-2\sox.exe”

【文件夹】
将不同文件放置不同文件夹中以进行区分
1.f_0=‘./原始音频/’
2.f_k=‘./截取参数/’
3.f_s=‘./运行结果/’
4.f_p=‘./音频缓存/’

【完整代码】

import wave
import os
import time
import pandas as pd

f_0='./原始音频/'   #原始音频存放文件夹
f_p='./音频缓存/'    #转化音频存放文件夹
f_k='./截取参数/'
f_s='./运行结果/'    #截断音频存放文件夹
sox_path="D:\sox\sox-14-4-2\sox.exe"
abs_path=os.path.dirname(os.path.abspath(__file__))
cmd='cd /d {}{} && for %i in (*.wav) do {} %i -b 16 -e signed-integer {}{}%i'.format(abs_path,f_0.replace('.',''),sox_path,abs_path,f_p.replace('.',''))  #shell脚本,解决wave初始非pcm格式问题
os.system(cmd)
t_0=time.time()
x_0=os.listdir(f_0)   #获取音频文件名称列表,已含后缀
t_p=[f_p+i for i in x_0]  #生成转化音频文件夹内文件的完整路径列表
df=pd.read_excel(f_k+os.listdir(f_k)[0],sheet_name='参数表',header=0,keep_default_na=False)
name_list=[list(df['Music_Name'])[i] +'-'+list(df['Artist'])[i]+'_'+list(df['Album'])[i] for i in range(len(df))]

#转化读取到的时分秒数据
def get_s_time(h,m,s):
    s_time=h*3600+m*60+s
    return s_time

#主函数
def cut_voice(stream,name,t_begin,t_end):
    wf = wave.open(stream, 'rb')
    nchannels, sampwidth, framerate, nframes = wf.getparams()[:4]
    strData = wf.readframes(nframes)  # 读取音频,字符串格式
    t_s = nframes / framerate
    cut_data = strData[int(t_begin * len(strData)/t_s):int(t_end * len(strData)/t_s)]
    wf.close()

    outfile = f_s + name+'.wav'  # 定义存储路径以及文件名
    outwave = wave.open(outfile, 'wb')
    comptype = "NONE"
    compname = "not compressed"
    outwave.setparams((nchannels, sampwidth, framerate, nframes==int(len(cut_data)),comptype, compname))
    outwave.writeframes(cut_data)
    outwave.close()

if __name__ == '__main__':
    for i in range(len(df)):
        t_begin=get_s_time(list(df['h_begin'])[i],list(df['m_begin'])[i],list(df['s_begin'])[i])
        t_end = get_s_time(list(df['h_end'])[i], list(df['m_end'])[i], list(df['s_end'])[i])
        cut_voice(t_p[0],name_list[i],t_begin,t_end)
    t_1 = time.time()
    print('\n全程耗时:%.2fs' % (t_1 - t_0))

【参数表说明】
参数配置表
h/m/s表示时分秒,只需要输入每个音频对应的起止时分秒(拆分输入),即可输出对应的音频片段

【注意事项】
1.sox.exe的安装位置必须与代码中sox-path相同,且为绝对路径;sox_path=“D:\sox\sox-14-4-2\sox.exe”
2.截取参数表设置完成后请保存关闭.
3.对应的文件夹需要事先建立
文件夹名称

猜你喜欢

转载自blog.csdn.net/Apollo_Guang/article/details/127728689