python批量去掉语音中的静音段

其实去除语音中静音段,ffmpeglibrosa均有提供功能,但是其去除静音段有一定局限性,只能去掉文件两端的静音段,而对于文件中间存在的静音段则无法去除,在此基础上,我也是写了个可以去除语音文件中任意地方的静音段。

去除静音段流程

1.求取语音的mfcc参数,并选取其含有能量信息的mfcc0作为端点检测的输入特征
2.对mfcc0特征进行中值滤波,平滑mfcc0参数
3.确定静音帧阈值,即认为超过多少帧的间隔,我们认为是静音段
4.去除筛选出的静音段
5.在原文件中剔除静音段,得到端点检测后的语音序列

具体code

import librosa
import soundfile as sf
import numpy as np
from scipy.signal import medfilt#忽略警告
import warnings
warnings.filterwarnings('ignore')
'''
将帧转换为时间刻度
'''
def frame2Time(frameNum, framelen, inc, fs):frames = np.array(range(0, frameNum, 1))frames = frames * inc + framelen / 2frameTime = frames / fsreturn frameTime
'''
去除静音的函数
'''
def slience(filename):frame_threshold=10#该参数决定去掉连续多少帧的静音段,比如某段语音检测到有12帧的静音帧,则去掉这一段的语音,而如果检测到只有8帧,那么不操作# 求取MFCCs参数y, sr = librosa.load(filename, sr=16000)mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=24,win_length=1024,hop_length=512,n_fft=1024)# # 对mfcc进行中值滤波Mfcc1 = medfilt(mfccs[0, :], 9)pic = Mfcc1start = 0end = 0points = []min_data = min(pic) * 0.9for i in range((pic.shape[0])):if (pic[i] < min_data and start == 0):start = iif (pic[i] < min_data and start != 0):end = ielif (pic[i] > min_data and start != 0):hh = [start, end]points.append(hh)start = 0# 解决 文件的最后为静音if (pic[-1] < min_data and start != 0):hh = [start, end]points.append(hh)start = 0distances = []for i in range(len(points)):two_ends = points[i]distance = two_ends[1] - two_ends[0]if (distance > frame_threshold):distances.append(points[i])# 保存到本地文件夹name = filename.split('\\')[-1]# 取出来端点,按照端点,进行切割,分情况讨论:1.如果未检测到静音段 2.检测到静音段if (len(distances) == 0):# print('检测到的静音段的个数为: %s 未对文件进行处理:' % len(distances))return y# sf.write(slience_clean, clean_data, 16000)else:slience_data = []for i in range(len(distances)):if (i == 0):start, end = distances[i]# 将左右端点转换到 采样点if (start == 1):internal_clean = y[0:0]else:# 求取开始帧的开头start = (start - 1) * 512# 求取结束帧的结尾end = (end - 1) * 512 + 1024internal_clean = y[0:start - 1]else:_, end = distances[i - 1]start, _ = distances[i]start = (start - 1) * 512end = (end - 1) * 512 + 1024internal_clean = y[end + 1:start]hhh = np.array(internal_clean)# 开始拼接slience_data.extend(internal_clean)# 开始 添加 最后一部分,需要分情况讨论,1. 文件末尾本来就是静音的  2.文件末尾不是静音的ll = len(distances)_, end = distances[ll - 1]end = (end - 1) * 512 + 1024end_part_clean = y[end:len(y)]slience_data.extend(end_part_clean)# 写到本地# sf.write("./data/{}.wav".format(name), slience_data, 16000)return slience_data

注意:这里需要设置的有个灵活变量,就是在slience函数中设置的 frame_threshold 变量

如何调用slience函数批量对语音操作


'''
获取输入文件夹内的所有wav文件,并返回文件名全称列表
'''
def file_name(file_dir):L = []for root, dirs, files in os.walk(file_dir):for file in files:if os.path.splitext(file)[1] == '.wav':filename=os.path.join(root, file)# print(get_label(filename))L.append(filename)return Lif __name__ == '__main__':  wav_dir="./data"  #语音文件夹wav_files=file_name(wav_dir)#获取文件夹内的所有语音文件#对每一个文件进行操作for filename in wav_files:#去除静音段slience_data=slience(filename)...这里得到的就是去除静音后的数据,默认fs为16k,大家可以在此基础上继续进行开发

python 批量去掉语音中的静音段相关推荐

  1. 使用python中pydub批量去除mp3中的静音段

    给儿子听的英文音频中有大量的静音段,效率很低.刚开始找个剪辑软件goldwave一个一个剪,后来发现太费劲,就想用程序实现.python的优势是有大量的开源库可用,于是用了两三天时间,了解了一下音频处 ...

  2. python 批量切割语音

    python批量切割语音文件(可以灵活控制切割长度) 话不多少,直接上代码: def file_name(file_dir):'''输入文件夹名称,并返回该文件夹下所有语音文件的完整路径(list类型 ...

  3. 用python批量获取cad中线段点组成的凸包 + 面积

    用python批量获取cad中线段点组成的凸包 + 面积 效率实在太低,还是用c# 吧 import win32com.client import pythoncom import tubao imp ...

  4. 使用Python实现从CAD中选择多段线并提取坐标

    使用Python实现从CAD中选择多段线并提取坐标 直接上代码案例 import pythoncom import win32com.clientdef vtpnt(x, y, z=0):return ...

  5. python批量将CAD中的每个图分别转化为对应的PDF(cad转pdf)

    python批量将CAD中的每个图分别转化为对应的PDF(cad转pdf) 需要在cad上选择左下角和右小角的坐标,会有提示,注意看即可 通过交互方式将一个CAD中的每个图纸分别转为一个pdf,简单易 ...

  6. Praat脚本-036 | Praat脚本批量为音频添加首尾静音段

    有一个小的应用是有一批音频信号,想批量的通过脚本为这些音频信号在首.尾都增加一小段静音段.这里就通过Praat生成一小段静音段的音频信号,再分别拼接到原来音频信号的首.尾,从而保存为新的音频信号. 首 ...

  7. python 批量增加文件前缀_用python批量提取视频中的音频文件

    安装MoviePy pip3 install MoviePy 安装成功后需要打开MoviePy所在的文件夹 C:PythonLibsite-packagesmoviepy 打开config_defau ...

  8. python给视频添加声音_用python批量提取视频中的音频文件

    安装MoviePypip3 install MoviePy 安装成功后需要打开MoviePy所在的文件夹C:\Python\Lib\site-packages\moviepy 打开config_def ...

  9. python批量识别图中文字自动命名_python实现批量命名照片

    python批量命名照片的具体代码,供大家参考,具体内容如下 废话不多说,上效果图 全部代码 from tkinter import * import os #添加文件夹路径 def rename() ...

  10. Python 批量提取Excel中的图片,图片文件名按指定列存储

    openpyxl 以及 openpyxl_image_loader,conda或者pip无法安装的话,官网下载whl,然后pip安装本地包 [注意]:图片必须在单元格内,不能压过单元格边界 from ...

最新文章

  1. c语言启动程序句柄无效,电脑中玩英雄联盟提示“句柄无效”是怎么回事
  2. Colaboratory下载Kaggle数据
  3. reactjs antd(ant-design)安装、基本使用及css样式的按需引入
  4. 创建javascript对象的几种方式
  5. MySQL高级 - 常用工具 - mysqlimport与source
  6. spring mvc拦截器HandlerInterceptor
  7. SQL-10 获取所有非manager的员工emp_no
  8. drools 7.11 复杂事件处理详解
  9. C语言如何控制控制台窗口大小
  10. php mysql 输出csv_php使用指定编码导出mysql数据到csv文件的方法
  11. jsp九大内置对象简述
  12. 自制力才是你努力的第一步
  13. F检验(ANOVA)
  14. JS 模拟手机页面文件的下拉刷新
  15. 戳这里,誉天胡老师教你如何备考 HCIE-Datacom!考试通关so easy!
  16. 2、Canal的deployer模块
  17. java中secretkey,java生成秘钥key,并保存秘钥到文件中
  18. 计算机网络自顶向下方法 第三章 作业习题答案
  19. mcnpf5输出结果_MCNP计数心得 -
  20. 秋枫学习笔记-原创文章整理

热门文章

  1. 最全的LBS手机定位技术说明
  2. 计算机登录界面没有用户显示不出来,win7让administrator账户不出现在登陆界面方法...
  3. 2018今日头条内推笔试1
  4. CGArt 2008 Issue
  5. 云中漫步-我这一辈子
  6. 独孤求败-小滴云架构大课十八式【xiaoecf】
  7. 关于Vmware中的Ubuntu不断弹窗Num Lock的问题
  8. 2020年(农历庚子鼠年)春联大全(收藏必备)
  9. python里的平方_python中平方和
  10. code405是什么意思_HTTP协议状态码详解(HTTP Status Code)