下面贴出一下我自己使用的基音周期的提取方法:

首先我们设置帧长pe、帧移step(这里我使用的采样率为16000),由于基音频率一般在80hz-500hz之间,所以一个周期的长度在2ms-12.5ms之间, 而我们计算基因周期至少需要两个周期, 这里我就选择了25ms的帧长,10ms的帧移,也就是400采样点,160的重叠

然后我通过遍历的方式依次取到每一帧的采样点,得到data, 因为基音频率一般在80hz-500hz之间,所以周期在32-200个采样点之间,随后我对每个可能的周期取值进行遍历,并依次取相邻的两个周期片段,求pearsonr相关系数,然后将系数保存在一个列表中,随后我把得到的系数列表求平均,这样我就可以得到每个可能周期取值下的系数平均值,最后我取最大的那个对应周期,如果最大的那个值大于0.8  我就确定该帧的周期,否则我就给他一个常数值

函数传入的wave_data为pcm值

def calperiod(wave_data):per = []step = 160pe = 400diedai_num = ((len(wave_data)-pe)//step)+1if diedai_num*step + pe - len(wave_data) < 160:diedai_num += 1for i in range(diedai_num):data = wave_data[i*step:i*step + pe]time = {}# plt.plot(data)# plt.show()# 假定周期介于32:200之间,取两个周期判断相似度for w in range(32, 200):kl = []# for i in range(0, 2):if int(len(data) / w) - 1 == 0:continuefor i in range(0, int(len(data) / w) - 1):# print(i * w)# print("============================")# print(len(data[(i+1) * w:(i+2) * w]))si = stats.pearsonr(data[i * w:(i + 1) * w], data[(i + 1) * w:(i + 2) * w])kl.append(si[0])print(111)print(kl)time[w] = sum(kl) / len(kl)#     t = 0#     for j in range(w, pe):#         t += data[j] * data[j-w]#     time[w] = t/(pe - w)da = sorted(time.items(), key=lambda x: x[1], reverse=True)print(da)if da[0][1] < 0.8:ma = 500elif np.isnan(da[0][1]):ma = 500else:ma = da[0][0]pe_li = []for key in time.keys():if time[key] == ma:pe_li.append(key)if len(pe_li) != 0:period = min(pe_li)else:period = maper.append(period)return per

下面为获取基因片段(该代码没有 对最后得到的结果进行处理,应该继续对距离过近的点进行删除)

def jiyin_mask(f, T_li, wave_data):"""acquire fundmental_sound_T:param f: gap:param T_li: period_li:param wave_data: each_slice:return:"""jiyin_point = []wave_data_li = list(wave_data)for i in range(len(wave_data_li)):zhouqi_point = []zhouqi = T_li[i]if zhouqi == 500:continuewa = list(wave_data_li[i])max_point = wa.index(max(wa))zhouqi_point.append(max_point)# 得到该帧所有基因周期点for j in range(10):if int(max_point+f*zhouqi) >= len(wa):breaknext_area = wa[int(max_point+f*zhouqi):int(max_point+(2-f)*zhouqi)]next_point = next_area.index(max(next_area))max_point = max_point+f*zhouqi + next_pointzhouqi_point.append(max_point)if max_point+(2-f)*zhouqi > 400:breakfor j in range(10):if max_point-(2-f)*zhouqi < 0:if int(max_point - f * zhouqi) <= 0:breaknext_area = wa[0: int(max_point-f*zhouqi)]next_point = next_area.index(max(next_area))zhouqi_point.append(next_point)breakelse:next_area = wa[int(max_point-(2-f)*zhouqi): int(max_point - f * zhouqi)]next_point = next_area.index(max(next_area))max_point = next_point + max_point-(2-f)*zhouqizhouqi_point.append(max_point)final_point = [jiyin_point.append(int(i*160+a)) for a in zhouqi_point]return sorted(jiyin_point)

下面是对基因周期点进行处理 即距离近的点删除、距离太远的为清音,取某一个确定数值插入作为周期

def period_process(point, T):new_li = [0]qingyin_add = []for i in range(len(point)):if point[i] - new_li[-1] < min(T):continueelse:new_li.append(point[i])for j in range(1, len(new_li)-1):if new_li[j+1] - new_li[j] > 200:num = (new_li[j+1] - new_li[j])//(new_li[j] - new_li[j-1])for x in range(num-1):qingyin_add.append(new_li[j]+(x+1)*(new_li[j] - new_li[j-1]))else:qingyin_add.append(new_li[j])qingyin_add.insert(0,qingyin_add[0])if qingyin_add[1] > 200:n = qingyin_add[1]//(qingyin_add[2] - qingyin_add[1])for g in range(n - 1):qingyin_add.insert(1, qingyin_add[0] - (g+1)*(qingyin_add[2] - qingyin_add[1]))qingyin_add.pop(0)return qingyin_add

获取了基因周期段 我们就可以进行修改频率 或者修改时长

使用python进行基音周期的计算相关推荐

  1. python 进程生命周期_计算客户生命周期价值的python解决方案

    python 进程生命周期 By Lisa Cohen, Zhining Deng, Shijing Fang, and Ron Sielinski 由丽莎·科恩,志宁邓,石井方和罗恩Sielinsk ...

  2. python自相关函数提取基音周期_Python语音基础操作--4.2基音周期检测

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  3. python自相关函数提取基音周期_自相关函数法基音周期提取(matlab版)

    1.引言 人在发浊音时,气流通过声门使声带产生张弛振荡式振动,产生一股准周期脉冲气流,这一气流激励声道就产生浊音,又称有声语音,它携带着语音中的大部分能量.这种声带振动的频率称为基频,相应的周期就称为 ...

  4. 【语音分析】短时自相关基音周期检测+LPC预测增益计算【含Matlab源码 1517期】

    ⛄一.案例简介 1 实验要求 1.录一段声音,内容为"间隔读出数字0-4",转为单声道.8khz.wav格式: 2.每帧帧长20ms160个样点,使用汉明窗hamming加窗: 3 ...

  5. python自相关函数提取基音周期_基音周期的提取

    基音周期的提取 陈晓磊 (苏州工业职业技术学院,江苏 苏州 215104 ) 摘要 自相关基音检测算法是语音信号处理的关键技术, 算法的效率直接影响了语 音信号的实时处理的质量.目前有许多较好的算法提 ...

  6. 音频信号处理——基音周期

    音频信号处理--基音周期 标签(空格分隔): 音频处理 一.简介 1.1 什么是基音?什么是基音周期 基音顾名思义就是声音的基础.这里我们主要讨论人的发声,根据声带震动的方式的不同,将声音信号分为清音 ...

  7. 语音信号处理之(二)基音周期估计(Pitch Detection)

    语音信号处理之(二)基音周期估计(Pitch Detection) zouxy09@qq.com http://blog.csdn.net/zouxy09 这学期有<语音信号处理>这门课, ...

  8. matlab倒谱法基音周期,语音学习笔记1------matlab实现自相关函数法基音周期提取...

    人在发浊音时,气流通过声门使声带产生张弛振荡式振动,产生一股准周期脉冲气流,这一气流激励声道就产生浊音,又称有声语音,它携带着语音中的大部分能量.这种声带振动的频率称为基频,相应的周期就称为基音周期( ...

  9. 倒谱法的基因周期检测matlab,两种基音周期检测方法

    很好很强大@! 基音周期中两种算法 常用的基音周期检测方法-自相关函数法.倒谱法.平均幅度差函数法都属于非基于事件基音检测方法,都先将语音信号分为长度一定的语音帧,然后对每一帧语音求平均基音周期,它们 ...

最新文章

  1. 小程序 a标签_微信内循环生态:朋友圈标签引流视频号、小程序、搜一搜
  2. 如何让Unity支持中文
  3. 编译原理词/语法分析
  4. ORACLE表空间管理维护
  5. Android ImageView图片显示点击背景切换
  6. C/C++ 动态存储分配 malloc calloc realloc函数的用法与区别
  7. [Flags]标识的Enum不能使用Html.GetEnumSelectList方法
  8. 信号与系统sa函数求积分_瞎扯数学分析微积分(1~4)
  9. python+selenium之自动生成excle,保存到指定的目录下
  10. 转:VCSA 6.7 升级到VCSA7.0
  11. 电脑常用音频剪辑软件_常用的音频编辑软件
  12. [DNS]ACL、also-notify、视图服务器及安全设置
  13. 顶点计划 顾家与工作问题讨论
  14. 离散数学第六版第er章偶数题答案_离散数学 第2章习题答案
  15. Android 发短信功能实现
  16. 快捷键Ctrl+s快速保存,屏蔽保存网页到本地
  17. Premiere Pro CC 2018 经典教程
  18. 转载 骏马金龙第9章 Linux进程和信号超详细分析
  19. vue3 setup语法糖下父组件调用子组件的方法
  20. 打开计算机无法最小化,软件一打开就最小化到任务栏怎么办_电脑打开程序它就最小化的解决方法...

热门文章

  1. Mac下制作Linux Centos7启动盘
  2. OJ 1202 镂空三角形
  3. 电音(2)8-bit
  4. 干货 | 超全整理|Python 操作 Excel 库 xlwings 常用操作详解!
  5. 关于SPEEX和语音的研究(转载的基础上加原创)
  6. word中mathtype公式编辑
  7. 教你如何制作浪漫的3D相册表白网站 HTML+CSS+JavaScript
  8. Mac系统中移动硬盘热拔(强制退出)后,在插上不显示移动硬盘的问题和解决办法
  9. 编写sdk提供给第三方使用(比如接口请求类)
  10. because it violates the following Content Security Policy directive: “default-src ‘none‘“