一种基于相似度检测的音频自动剪错方法

专利2023-07-09  119



1.本发明涉及音频端点检测,音频相似度检测领域,具体而言,是采用短时能量与过零率进行音频端点检测,再在频域上使用快速傅里叶变换和时域上采用梅尔频率倒谱系数进行综合的音频相似度分析,确定所有错误音频段的方法。


背景技术:

2.随着新媒体行业的崛起,越来越多的人成为音视频博主,在录制音频或录制视频时经常有读错的现象,通常在读错后的做法是重新读读错的地方。但在录制时常常无法及时标记出错的地方,结束录制后需要花费大量时间进行错误的剪辑。而目前市面上对于音频的处理多集中在语音转文字技术,没有针对音频错误进行剪错的框架技术。通过开发音频自动剪错的方法,可以节约新媒体工作者的时间成本,同时核心的音频相似度算法将有更广泛的应用场景。
3.目前已有的语音相似度判断技术大部分都为适配语音转文字任务而设计的,其中有mfcc梅尔频率倒谱系数、dtw动态时间规整,而此类语音相似度判断技术的前置技术还需要vad语音激活检测技术,具体算法步骤如下:
4.1.1.vad语音激活检测技术
5.vad语音激活检测技术是一种通过特定的判决准则判断语音中出现的停顿和静默间隔,检测出有效语音部分的技术。实现方式有多种,这里介绍张羊等人提出通过双门限算法实现语音端点检测,具体方案如下:
6.(1)为短时幅度设置两类门限,每类各两个门限
7.短时能量门限
[0008]-高能量门限itu
[0009]-低能量门限itl
[0010]
过零率门限
[0011]-高过零率门限zcru
[0012]-低过零率门限zcrl
[0013]
(2)设置最大静音帧长maxsilence和最小语音帧长minlen
[0014]
(3)分帧
[0015]
(4)计算待测片段短时能量
[0016]
(5)计算待测片段过零率
[0017]
(6)调整两类门限的上下门限值
[0018]
(7)逐帧判断模式类型(静音态、过渡态、语音态、结束态)
[0019]
(8)用帧号乘帧长反解出语音开始时刻、结束时刻
[0020]
1.2.mfcc梅尔频率倒谱系数
[0021]
mfcc梅尔频率倒谱系数是基于人耳听觉特性提出来的,它与hz频率成非线性对应关系。主要用于语音数据特征提取和降低运算维度,具体计算步骤如下:
[0022]
(1)预加重
[0023]
将待计算信号加上高通滤波器
[0024]
(2)分帧
[0025]
(3)加窗
[0026]
分帧中添加窗函数,使窗体间过度平滑
[0027]
(4)快速傅里叶变换
[0028]
(5)梅尔滤波器组
[0029]
(6)离散余弦变换
[0030]
1.3.dtw动态时间规整
[0031]
由于不同人的语速不同,即使同一个人不同一时刻发同一个音,也不可能具有完全相同的时间长度,所以利用传统相似度计算方式无法很好的体现语音相似度。通过使用dtw动态时间规整算法,将语音

对齐

,达到可以在同一时间刻度上计算相似度的目的,具体计算步骤如下:
[0032]
(1)计算两语音段的距离矩阵
[0033]
(2)循环检测矩阵中最短距离
[0034]
(3)得到两语音段的规整路径和累加距离
[0035]
虽然已经有各类算法对音频进行相似度判断,但多是基于巨大的标准语音数据样本进行的有范围的相似度择优,这类方法仍存在以下问题:
[0036]
因为技术路线本身为了适配语音识别所以音频相似度检测依赖于已有语料库,但对音频检错这类任务不能很好的适配
[0037]

原因1:音频检错任务不需要知道语音的文字内容,知道文字内容也对检错准确率也没有促进作用
[0038]

原因2:使用基于累加距离的相似度检测需要有固定样本与之匹配,在无固定样本情况下,累加距离无法很好的表达两段语音的相似性
[0039]
基于已有语料库的相似度计算需要大量计算资源,技术成本高,技术普适性不强
[0040]

原因1:基于已有语料库的相似度计算是通过对待测语音段进行音素识别,再经过语言模型识别,得出最可能的语句,耗时与语料库大小成正比、与机器核心数量成反比


技术实现要素:

[0041]
本发明提供了一种基于相似度检测的音频自动剪错方法,其目的在于,基于上述所设计的语音相似度检测技术,并使用动态规划和哈希表思想设计了存储语音段起始终止位置的类结构以达到动态规划搜索的快速命中,同时系统设计中完全引入了多线程技术,实现了多核并行计算能力,计算效率显著提高、内存使用率显著下降。
[0042]
本发明通过以下技术方案实现的:
[0043]
一种基于相似度检测的音频自动剪错方法,包括如下步骤:
[0044]
s1完成前期基础工作;
[0045]
s11确定帧长:
[0046]
getframelength(signal,framelengthrate)

(framelength)
[0047]
输入待测语音信号signal,帧长占比framelengthrate,输出待测语音信号的分帧
长度framelength;
[0048]
s12语音分帧:
[0049]
ehframe(signal,framelength,frameinc,windowfun)

(frames)
[0050]
首先,通过计算帧长framelength的三分之二作为帧移frameinc,接着输入待测语音信号signal,帧长framelength,帧移frameinc,加窗函数windowfun,输出按帧长和帧移切割完成的形状为帧数
×
帧长的分帧矩阵frames
[0051]
s13获得滤波系数:
[0052]
getlfilter(samplerate)

(filtera,filterb)
[0053]
输入待测语音采样率samplerate,经过scipy工具箱中的signal.butter方法,设计带通滤波器,滤波取80hz到18000hz的人声特征频段,得到滤波分子系数向量filtera和分母系数向量filterb,并输出;
[0054]
s2语音激活检测;
[0055]
s21计算过零率:
[0056]
getzerocrossingrate(signal,sens)

(zcr,zcr1,zcr2,tmp1,tmp2,signs,diffs)
[0057]
输入待测语音信号signal,灵敏度系数sens,首先分别计算signal在[0,end-1]的分帧tmp1与在[1,end]的分帧tmp2,接着计算《tmp1,tmp2>得到结果取小于0的为1,其余为0,得出矩阵signs,即接着计算|tmp
1-tmp2|,结果大于0.2的为1,其余为0,得出矩阵diffs,即最后计算《signs,diffs》,按列求和,得到形状为帧数
×
1的过零率矩阵zcr,再计算zcr中最大值除以snes的值作为高过零率门限zcr1,计算zcr中最大值除以snes的1.5倍的值作为低过零率门限zcr2[0058]
s22计算短时能量:
[0059]
getshorttimeenergy(signal,sens)

(amp,amp1,amp2,signal
afterfilter
,frames)
[0060]
输入待测语音信号signal,灵敏度系数sens,首先通过计算获得滤波系数并通过scipy工具箱中的signal.lfilter方法进行signal的滤波,获得滤波后的语音信号signal
afterfilter
,再计算signal
afterfilter
的分帧ftames,取frames的绝对值并按列求和得到形状为帧数
×
1的短时能量矩阵amp,再计算amp中最大值除以sens的值作为高能量门限amp1,计算amp中最大值除以sens的1.5倍的值作为低能量门限amp2[0061]
s23计算语音端点:
[0062]
vad(amp,zcr,amp1,amp2,zcr1,zcr2,frameinc)

(startpoint,endpoint)
[0063]
输入待测语音的短时能量amp,过零率zcr,短时能量上下门限amp1和amp2,过零率上下门限zcr1和zcr2,以及帧移frameinc,对amp和zcr中每一点数值进行比较,数值大于各自设定的上门限amp1或zcr1则进入语音段记录开始值的下标为startpoint,如大于各自下门限但小于上门限则进入过渡态,如进入语音态后,数值小于各自下门限则进入结束态记录结束值的下标为endpoint,并将startpoint与endpoint乘以frameinc得到正确的语音起
点startpoint和语音终点endpoint;
[0064]
s3计算梅尔频率倒谱系数;
[0065]
mfcc(signal,samplerate)

(ccc,signal
afterfilter
,fralnes,filterbanks)
[0066]
入待测语音信号signal,待测语音信号采样率samplerate,首先计算获得滤波系数并通过scipy工具箱中的signal.lfilter方法进行signal的滤波,获得滤波后的语音信号signal
afterfilter
,再对signal
afterfilte
r分帧,此处帧长固定256,帧移80,窗函数选择汉明窗得到分帧矩阵frames,本发明选择将梅尔频率倒谱系数导出为12维,即设置梅尔频率倒谱系数矩阵ccc形状为frames列数
×
12的矩阵,接着计算每一帧系数,首先对当前帧进行快速傅里叶变换得到当前帧频域谱(数组),再对频域谱开平方,得到当前帧能量谱(数组),接着使用梅尔滤波器组(滤波器个数为24)进行滤波,再对滤波后矩阵取对数得到filterbanks特征,最后将filterbanks带入离散余弦变换函数计算并舍去计算结果第一列,得到第一帧的梅尔频率倒谱系数,记录至梅尔频率倒谱系数矩阵ccc对应列,重复以上步骤至所有帧计算完成,得到ccc;
[0067]
s4动态时间规整技术;
[0068]
计算两语音段的最佳路径:
[0069]
dtw(signala,signalb,penaltyc)

(signal
adtw
,signal
bdtw
,pcrate,d,w)
[0070]
输入待计算语音段singala和singalb,输入惩罚系数penaltyc,首先将singala和singalb标准化,再计算singala每一点到singalb的所有点的欧式距离,形成形状为singala长度
×
signalb长度的距离矩阵d,接着设置起点为矩阵右上角,开始选择最佳路径,选择项有三个,分别是矩阵中当前点的下方、左方和左下方,选取其中距离最短项,并将选择项记录到最佳路径w中。本发明在此算法中加入惩罚系数项(见图2),即当距离最短项为当前点下方或左方,对应方向的惩罚计数器加一,并在记录最佳路径前判断各方向惩罚计数器的计数,如果大于penaltyc则惩罚当前格最佳路径,其匹配的最佳路径位置被置-1,记录到w中。接着根据w中记录的最佳路径重新调整singala和singalb,对于被惩罚的路径则将对应值置为当前语音段的平均值(取平均值减去原最佳路径值减去平均值的值效果会更佳),最终输出经过最佳路径重新对齐后的语音段signal
adtw
和signal
bdtw
,同时计算检测中的总惩罚数除以总检测次数获得惩罚率pcrate。
[0071]
s5利用音频自动剪错系统实现多核并行的计算能力。
[0072]
作为优选实施例,所述步骤s5,包括如下步骤:
[0073]
s51类定义;
[0074]
s52预处理;
[0075]
s53语音段确定(标记确定);
[0076]
s54相似语音段判断;
[0077]
s55预剪错:
[0078]
如果getcutting方法返回的cuta和cutb非空,则将cuta和cutb封装成tag类的变量,加入tag链表,
[0079]
当所有标记检测完成后,对链表头加上补偿时间makeuptime,以将所有剪错时间统一到原始音频时间轴中,并返回tag链表头指针,
[0080]
等待所有线程结束,将所有tag链表头指针存入临时数组tagheadlist,
[0081]
首先,对tagheadlist进行排序,这里重写了排序方法,以tagheadlist中每一个头指针指向的下一个剪错标记的开始位置的值作为排序值,由小到大排序,接着循环读取tagheadlist中每个剪错标记头指针,尾插法插入新的标记头taghead,将tagheadlist组成为一条链表,链表头为taghead,
[0082]
将用户输入的原始标记点origintags(数组形式)进行排序,并从taghead遍历链表,将origintags中所有标记转换为tag类型变量(starttime与endtime同一时刻)插入链表,
[0083]
接着处理taghead,因插入了用户输入的原始标记点而可能导致的tag同起点或嵌套的问题。从taghead遍历链表,比较前一tag和后一tag在时间上是否有重叠部分,如有重叠部分则进行合并,
[0084]
接着生成适配原始音频的标记段,深拷贝一份taghead为头指针的链表taghead
copy
,同时将用户输入的原始音频标记段(数组形式)转换为tag链表形式,链表头为taghead
origin
,将taghead
origin
所有项插入taghead,由于taghead
origin
时间线和taghead的并不相同,所以需要将taghead
origin
中每一项依次插入taghead且在插入后将插入点之后的所有tag增加插入的tag的时长,本发明采用链表结构组织tag的优势也就体现出来,只需要对插入的tag的下一tag增加时长即可完成所有tag的时长增加,taghead
origin
中所有项插入完毕后,预剪错操作全部结束,获得taghead和taghead
copy

[0085]
s56剪错:
[0086]
依次读取taghead中剪错tag,将原音频依据tag中的starttime和endtime进行剪切,每剪切完一个tag,将当前位置tag的后一个tag减去当前剪切的长度。最终获得剪错完成的音频,接着将taghead和taghead
copy
转换为方便用户导入的数组结构,即完成了剪错操作,最终输出剪错完成的音频、剪错完成的音频的剪错标记点、原始音频的剪错标记段。
[0087]
作为优选实施例,步骤s51,包括如下步骤:
[0088]
s511剪错记录tag:用来记录剪错段落,
[0089]
成员变量为剪切起始点starttime,终止点endtime,下一个剪错记录tag的地址next;
[0090]
成员方法重写了加法与减法;
[0091]
加法:一个tag加上一个常数则对应剪切起始点、终止点加上该常数,同时调用next加上该常数;
[0092]
减法:一个tag减去一个常数则对应剪切起始点、终止点减去该常数,同时调用next减去该常数;
[0093]
s512端点记录单节点section:用来记录端点激活检测后的结果,
[0094]
成员变量为起始管辖点startinterval,终止管辖点endinterval,前一管辖域内起始端点位置beforepoint,前一管辖域内终止端点位置beforepointend,当前管辖域内起始端点位置afterpoint,当前管辖域内终止端点位置afterpointend;
[0095]
s513端点数组单节点sectionsarraypoint:用来协助哈希散列存储section的类预处理,
[0096]
成员变量为当前节点哈希号hashid,当前节点的所有section组成的数组sectionsarray;
[0097]
成员变量:
[0098]
判断是否存在相同section:isexistsection(section)

(ansindex),判断当前节点内的section的beforepoint或afterpoint是否相同,如相同则返回该section在sectionsarray中的下标,如没有相同则返回-1;
[0099]
寻找当前节点中与某一时刻最佳匹配的section:findsection(point)

(anssection),遍历sectionsarray判断该时刻point是否位于section的[startinterval,afterpoint]范围内,如位于则返回当前section,否则返回空。
[0100]
作为优选实施例,所述步骤s52,包括如下步骤:
[0101]
s521对用户输入的所有参数判断是否存在非法值,如存在非法值则将对应项置为默认值;
[0102]
s522读取要处理的音频,获取音频数组和采样率;
[0103]
s523如音频为多声道则保存一份原音频副本,并转化为单声道音频,为后续操作节约计算和内存资源;
[0104]
s524计算音频最大可拆分线程(进程)数,本发明限定每线程处理音频长度不超过2分钟;
[0105]
s525根据计算得出的最大可拆分线程数将音频平均分段,并创建线程池,将分完段的音频加入线程池。
[0106]
作为优选实施例,所述步骤s53,包括如下步骤:
[0107]
s531自动标记:
[0108]
autotags(signal,framelengthrate,sens,similartagsinterv(tags,sections)
[0109]
输入待测语音段signal,分帧率framelengthrate,端点检测灵敏度sens,断句最短时间similartagsinterval,采样率samplerate。首先创建记录标记点的数组tags,端点记录数组sections,接着调用语音激活检测函数计算第一处语音段的起始位置和结束位置,组成section类变量,并加入单端点数组sections中,同时记录该结束点位置,接着将音频的起始位置到检测的语音段结束位置,进行下一次语音激活检测,将前一次记录的结束点位置和这一次得到的起始点位置求中点,加入待处理标签数组tags,并同样组成section类变量并加入sections,循环操作,直到剩余音频段长度小于一固定值,退出循环。返回tags和sections。
[0110]
s532初始化端点记录数组:
[0111]
initsectionspointarray(audiolength,sections)

(sectionspointarray)
[0112]
输入待测语音段长度audiolength,单端点数组sections,接着根据audiolength和sections计算装填因子(见图5)并创建端点记录数组sectionspointarray,接着遍历sections中所有section,计算每个section中的startinterval到endinterval所跨域的哈希值,将该section的引用置入所有其包含的哈希块中,遍历装填完成后,返回初始化完成的sectionspointarray。
[0113]
作为优选实施例,所述步骤s54,包括如下步骤:
[0114]
逐个读取标签,获取剪辑的起点和终点:getcutting(sectionpointsarray,tag,signal,samplerate,sim(cuta,cutb)
[0115]
输入端点记录数组sectionpointsarray,当前标记点tag,待检测语音段signal,
采样率samplerate,快速傅里叶的相似度标准similaraudiosvalue
fft
,梅尔频率倒谱系数的相似度标准similaraudiosvalue
mfcc
,帧长占比framelengthrate,端点检测灵敏度sens,惩罚系数penaltyc
dtw
,补偿时间makeuptime,最大前向检测次数maxintervalnum,
[0116]
首先,沿tag处将signal分为前半部分音频beforewave和后半部分音频afterwave,接着寻找afterwave的语音起始点(动态规划思想),使用tag除以sectionpointsarray的装填因子,获得当前tag所在的sectionsarraypoint并调用成员方法findsection寻找tag具体所在的section记为aftersection,如未找到则进行语言激活检测,获得当前语音段的起始点终止点,如找到则直接获取语音段的起始点,接着获取beforewave的起始点和终止点,首先将beforewave倒置,接着检测aftersection是否为空,如为空则进行语言激活检测,获得当前语音段的起始点,终止点,并同afterwave的起始点终止点封装成section加入sectionpointsarray,如不为空则直接从aftersection获取起始点beforepoint终止点beforepointend。然后根据获得的起始点终止点截取前后两段语音,并统一到相同长度,即选取两段语音中长度较小段,将较长段截取成较小段,将两段语音记为afterpart、beforepart,
[0117]
s541计算快速傅里叶后的相似度:
[0118]
calculatesimilarffr(beforepart,afterpart,samplerate)

(similarfft)
[0119]
输入要检测的前后语音段beforepart、afterpart,采样率samplerate,接着计算每段音频的频谱插值,首先将音频进行带通滤波,随后快速傅里叶变换,接着在150hz到hz计算出均匀分布的100001个点进行三次方插值,插值确保了两段音频比较频率相似度时的点位相同,接着计算pearson相似度,获得similarfft;
[0120]
如计算得到的similarfft小于用户设置的similaraudiosvalue
fft
则跳过本次检测,获取在beforepart前一段的语音段进行检测。如得到的similarfft大于similaraudiosvalue
fft
则再计算两语音段的梅尔频率倒谱系数相似度;
[0121]
s542计算梅尔频率倒谱系数相似度:
[0122]
calculatesimilarmfcc(beforepart,afterpart,samplerate,fr(similarmfcc,pcrate
flag
)
[0123]
输入要检测的前后语音段beforepart、afterpart,采样率samplerate,帧长占比framelengthrate,惩罚系数penaltyc
dtw
。首先计算两段语音段的12阶梅尔倒谱系数,记为cccb、ccca,接着对两语音段每一阶梅尔倒谱系数进行动态时间规整,如动态时间规整的惩罚率大于50%则直接使similar
mfcc
=0,pcrate
flag
=false并返回,否则计算pearson相似度,将当前阶的mfcc相似度记入similarmfcc
row
,循环直到12阶梅尔倒谱系数相似度全部计算完成。接着对获得的similarmfcc
row
进行归一化倒谱提升,提升人声特征频段的相似度权重,并获得最终的梅尔倒谱系数相似度similarmfcc,
[0124]
如果获得的pcrate
flag
为否,或者similarmfcc值小于用户设置的similaraudiosvalue
mfcc
则跳过本次检测,向前移动beforepart的位置再检测,
[0125]
检测轮次取决于用户设定的最大前向检测次数maxintervalnum,
[0126]
如similarmfcc大于等于用户设置的similaraudiosvalue
mfcc
则将剪错起点cuta置为当前beforepart的起始点,剪错终点cutb置为afterpart的起始点,并返回。
[0127]
本发明的技术原理:
[0128]
针对音频自动剪错的需求,本发明将基于语音识别技术链中的语音激活检测、梅尔频率倒谱系数、动态时间规整技术,设计一种高效、轻量化的语音相似度检测技术,并基于此技术实现音频自动剪错功能。由于不使用已有语料库,于是传统动态时间规整技术的相似度标准:累加距离,不再具有绝对意义,且在相对意义下其不易被理解。因此,本发明根据动态时间规整获得的新的语音段进行pearson相似度计算使相似度规整到[0,1]区间以获得更好的理解性,同时使用pearson相似度计算相似度时将能够规避前后语音段音量大小不一致导致的相似度降低这一现象。并且,本发明将对动态时间规整算法进行改良,以适配无样本情况下的相似度判断,通过在算法中加入惩罚系数penaltyc,对动态时间规整算法在匹配两段语音时出现的过拟合现象进行修正。
[0129]
本发明在实现高效、轻量化的语音相似度检测技术的基础上,设计了一套高效、高准确度的音频自动剪错系统,能够对音频中出现的错读现象进行标明和剪切。音频自动剪错系统中为加快计算速度引入了动态规划思想和多线程技术,针对时序序列的时刻误差性设计了一种数据结构算法,使得时间序列下的动态规划搜索效率极大提高。同时由于系统设计中完全引入了多线程技术,计算效率极大提高、内存使用率显著降低。同时系统根据用户使用的反馈,增加了可以进行多次迭代检测和记录原音轨剪错标记的能力,通过对已有剪错标记点和时长的反算,能够得到所有剪错标记在原始音频的标记段,做到了无限次迭代不丢失最原始音频标记的能力,极大方便用户使用本发明。
[0130]
有益效果:
[0131]
(1)利用改进的动态时间规整技术提高了无语料库情况下的音频相似度检测准确度,与传统动态时间规整技术相比,减少了音频过拟合的现象。
[0132]
(2)使用pearson相似度代替传统动态时间规整得到的累加距离相似度,适配无语料库情况下的音频相似度检测,同时使用pearson相似度消除了因语音音量大小不同导致的相似度降低现象。
[0133]
(3)引入动态规划思想设计音频自动剪错系统,极大减少了语音激活检测的次数,使得计算效率极大提升。
[0134]
(4)设计了支持迭代的自动剪错方法,多次迭代自动剪错能获得较好的剪错效果同时所有剪错标记都能够得到保留,方便用户查看和修改。
附图说明
[0135]
图1为本发明帧长占比与分帧关系示意图。
[0136]
图2为本发明dtw算法与改进后的dtw算法。
[0137]
图3为本发明vad动态规划表示意图。
[0138]
图4为本发明预处理流程图。
[0139]
图5为本发明确定装填因子示意图。
[0140]
图6为本发明语音段确定(标记确定)流程图。
[0141]
图7为本发明相似语音段判断流程图。
[0142]
图8为本发明预剪错流程图。
[0143]
图9为本发明剪错流程图。
[0144]
图10为本发明单次的自动剪错任务流程。
[0145]
图11为本发明多次迭代的自动剪错任务流程。
具体实施方式
[0146]
下面结合附图对本发明的实施例作详细说明:本实施例在以本发明技术方案为前提下进行实施,给出了详细的实施方式和具体的操作过程,但本发明的保护范围不限于下述的实施例。
[0147]
实施例:
[0148]
1.4.实现步骤——语音相似度检测技术
[0149]
1.4.1.基础功能
[0150]
(1)确定帧长:
[0151]
getframelength(signal,framelengthrate)

(framelength)
[0152]
输入待测语音信号signal,帧长占比framelengthrate,输出待测语音信号的分帧长度framelength(见图1)
[0153]
(2)语音分帧:
[0154]
enframe(signal,framelength,frameinc,windowfun)

(frames)
[0155]
首先通过计算帧长framelength的三分之二作为帧移frameinc,接着输入待测语音信号signal,帧长framelength,帧移frameinc,加窗函数windowfun,输出按帧长和帧移切割完成的形状为帧数
×
帧长的分帧矩阵frames
[0156]
(3)获得滤波系数:
[0157]
getlfilter(samplerate)

(filtera,filterb)
[0158]
输入待测语音采样率samplerate,经过scipy工具箱中的signal.butter方法,设计带通滤波器,滤波取80hz到18000hz的人声特征频段,得到滤波分子系数向量filtera和分母系数向量filterb,并输出
[0159]
1.4.2.语音激活检测
[0160]
(1)计算过零率:
[0161]
getzerocrossingrate(signal,sens)

(zcr,zcr1,zcr2,tmp1,tmp2,signs,diffs)
[0162]
输入待测语音信号signal,灵敏度系数sens,首先分别计算signal在[0,end-1]的分帧tmp1与在[1,end]的分帧tmp2,接着计算《tmp1,tmp2》得到结果取小于0的为1,其余为0,得出矩阵signs,即接着计算|tmp
1-tmp2|,结果大于0.2的为1,其余为0,得出矩阵diffs,即最后计算《signs,diffs》,按列求和,得到形状为帧数
×
1的过零率矩阵zcr,再计算zcr中最大值除以snes的值作为高过零率门限zcr1,计算zcr中最大值除以snes的1.5倍的值作为低过零率门限zcr2[0163]
(2)计算短时能量:
[0164]
getshorttimeenergy(signal,sens)

(amp,amp1,amp2,signal
afterfilter
,frames)
[0165]
输入待测语音信号signal,灵敏度系数sens,首先通过计算获得滤波系数并通过scipy工具箱中的signal.lfilter方法进行signal的滤波,获得滤波后的语音信号signal
afterfilter
,再计算signal
afterfilter
的分帧frames,取frames的绝对值并按列求和得到形状为帧数
×
1的短时能量矩阵amp,再计算amp中最大值除以sens的值作为高能量门限amp1,计算amp中最大值除以sens的1.5倍的值作为低能量门限amp2[0166]
(3)计算语音端点:
[0167]
vad(amp,zcr,amp1,amp2,zcr1,zcr2,frameinc)

(startpoint,endpoint)
[0168]
输入待测语音的短时能量amp,过零率zcr,短时能量上下门限amp1和amp2,过零率上下门限zcr1和zcr2,以及帧移frameinc,对amp和zcr中每一点数值进行比较,数值大于各自设定的上门限amp1或zcr1则进入语音段记录开始值的下标为startpoint,如大于各自下门限但小于上门限则进入过渡态,如进入语音态后,数值小于各自下门限则进入结束态记录结束值的下标为endpoint,并将startpoint与endpoint乘以frameinc得到正确的语音起点startpoint和语音终点endpoint。
[0169]
1.4.3.梅尔频率倒谱系数
[0170]
(1)计算梅尔频率倒谱系数:
[0171]
mfcc(signal,samplerate)

(ccc,signal
afterfilter
,frames,filterbanks)
[0172]
输入待测语音信号signal,待测语音信号采样率samplerate,首先计算获得滤波系数并通过scipy工具箱中的signal.lfilter方法进行signal的滤波,获得滤波后的语音信号signal
afterfilter
,再对signal
afterfilter
分帧,此处帧长固定256,帧移80,窗函数选择汉明窗得到分帧矩阵frames,本发明选择将梅尔频率倒谱系数导出为12维,即设置梅尔频率倒谱系数矩阵ccc形状为frames列数
×
12的矩阵。接着计算每一帧系数,首先对当前帧进行快速傅里叶变换得到当前帧频域谱(数组),再对频域谱开平方,得到当前帧能量谱(数组),接着使用梅尔滤波器组(滤波器个数为24)进行滤波,再对滤波后矩阵取对数得到filterbanks特征,最后将filterbanks带入离散余弦变换函数计算并舍去计算结果第一列,得到第一帧的梅尔频率倒谱系数,记录至梅尔频率倒谱系数矩阵ccc对应列,重复以上步骤至所有帧计算完成,得到ccc。
[0173]
1.4.4.动态时间规整技术
[0174]
(1)计算两语音段的最佳路径:
[0175]
dtw(signala,signalb,penaltyc)

(signal
adtw
,signal
bdtw
,pcrate,d,w)
[0176]
输入待计算语音段singala和singalb,输入惩罚系数penaltyc,首先将singala和singalb标准化,再计算singala每一点到singalb的所有点的欧式距离,形成形状为singala长度
×
signalb长度的距离矩阵d,接着设置起点为矩阵右上角,开始选择最佳路径,选择项有三个,分别是矩阵中当前点的下方、左方和左下方,选取其中距离最短项,并将选择项记录到最佳路径w中。本发明在此算法中加入惩罚系数项(见图2),即当距离最短项为当前点下方或左方,对应方向的惩罚计数器加一,并在记录最佳路径前判断各方向惩罚计数器的计数,如果大于penaltyc则惩罚当前格最佳路径,其匹配的最佳路径位置被置-1,记录到w中。接着根据w中记录的最佳路径重新调整singala和singalb,对于被惩罚的路径则将对应值置为当前语音段的平均值(取平均值减去原最佳路径值减去平均值的值效果会更佳),最
终输出经过最佳路径重新对齐后的语音段signal
adtw
和signal
bdtw,
同时计算检测中的总惩罚数除以总检测次数获得惩罚率pcrate。
[0177]
1.5.实现步骤——音频自动剪错系统
[0178]
1.5.1.类定义
[0179]
(1)剪错记录tag:用来记录剪错段落
[0180]
·
成员变量为剪切起始点starttime,终止点endtime,下一个剪错记录tag的地址next
[0181]
·
成员方法重写了加法与减法
[0182]-加法:一个tag加上一个常数则对应剪切起始点、终止点加上该常数,同时调用next加上该常数
[0183]-减法:一个tag减去一个常数则对应剪切起始点、终止点减去该常数,同时调用next减去该常数
[0184]
(2)端点记录单节点section:用来记录端点激活检测后的结果
[0185]
·
成员变量为起始管辖点startinterval,终止管辖点endinterval,前一管辖域内起始端点位置beforepoint,前一管辖域内终止端点位置beforepointend,当前管辖域内起始端点位置afterpoint,当前管辖域内终止端点位置afterpointend
[0186]
(3)端点数组单节点sectionsarraypoint:用来协助哈希散列存储section的类预处理
[0187]
·
成员变量为当前节点哈希号hashid,当前节点的所有section组成的数组sectionsarray(见图3)
[0188]
·
成员变量
[0189]-判断是否存在相同section:
[0190]
isexistsection(section)

(ansindex),判断当前节点内的section的beforepoint或afterpoint是否相同,如相同则返回该section在sectionsarray中的下标,如没有相同则返回-1
[0191]-寻找当前节点中与某一时刻最佳匹配的section:findsection(point)

(anssection),遍历sectionsarray判断该时刻point是否位于section的[startinterval,afterpoint]范围内,如位于则返回当前section,否则返回空
[0192]
1.5.2.预处理
[0193]
(1)对用户输入的所有参数判断是否存在非法值,如存在非法值则将对应项置为默认值
[0194]
(2)读取要处理的音频,获取音频数组和采样率
[0195]
(3)如音频为多声道则保存一份原音频副本,并转化为单声道音频,为后续操作节约计算和内存资源
[0196]
(4)计算音频最大可拆分线程(进程)数,本发明限定每线程处理音频长度不超过2分钟
[0197]
(5)根据计算得出的最大可拆分线程数将音频平均分段,并创建线程池,将分完段的音频加入线程池。如图4所示。
[0198]
1.5.3.语音段确定(标记确定)
[0199]
(1)自动标记:
[0200]
autotags(signal,framelengthrate,sens,similartagsinterv(tags,sections)
[0201]
输入待测语音段signal,分帧率framelengthrate,端点检测灵敏度sens,断句最短时间similartagsinterval,采样率samplerate。首先创建记录标记点的数组tags,端点记录数组sections,接着调用语音激活检测函数计算第一处语音段的起始位置和结束位置,组成section类变量,并加入单端点数组sections中,同时记录该结束点位置,接着将音频的起始位置到检测的语音段结束位置,进行下一次语音激活检测,将前一次记录的结束点位置和这一次得到的起始点位置求中点,加入待处理标签数组tags,并同样组成section类变量并加入sections,循环操作,直到剩余音频段长度小于一固定值,退出循环。返回tags和sections。
[0202]
(2)初始化端点记录数组:
[0203]
initsectionspointarray(audiolength,sections)

(sectionspointarray)
[0204]
输入待测语音段长度audiolength,单端点数组sections,接着根据audiolength和sections计算装填因子(见图5)并创建端点记录数组sectionspointarray,接着遍历sections中所有section,计算每个section中的startinterval到endinterval所跨域的哈希值,将该section的引用置入所有其包含的哈希块中,遍历装填完成后,返回初始化完成的sectionspointarray。如图6所示。
[0205]
1.5.4.相似语音段判断
[0206]
逐个读取标签,获取剪辑的起点和终点:getcutting(sectionpointsarray,tag,signal,samplerate,sim(cuta,cutb)
[0207]
输入端点记录数组sectionpointsarray,当前标记点tag,待检测语音段signal,采样率samplerate,快速傅里叶的相似度标准similaraudiosvalue
fft
,梅尔频率倒谱系数的相似度标准similaraudiosvalue
mfcc
,帧长占比framelengthrate,端点检测灵敏度sens,惩罚系数penaltyc
dtw
,补偿时间makeuptime,最大前向检测次数maxintervalnum。
[0208]
首先沿tag处将signal分为前半部分音频beforewave和后半部分音频afterwave,接着寻找afterwave的语音起始点(动态规划思想),使用tag除以sectionpointsarray的装填因子,获得当前tag所在的sectionsarraypoint并调用成员方法findsection寻找tag具体所在的section记为aftersection,如未找到则进行语言激活检测,获得当前语音段的起始点终止点,如找到则直接获取语音段的起始点。接着获取beforewave的起始点和终止点,首先将beforewave倒置,接着检测aftersection是否为空,如为空则进行语言激活检测,获得当前语音段的起始点,终止点,并同afterwave的起始点终止点封装成section加入sectionpointsarray,如不为空则直接从aftersection获取起始点beforepoint终止点beforepointend。然后根据获得的起始点终止点截取前后两段语音,并统一到相同长度,即选取两段语音中长度较小段,将较长段截取成较小段,将两段语音记为afterpart、beforepart。
[0209]
(1)计算快速傅里叶后的相似度
[0210]
calculatesimilar
fft
(beforepart,afterpart,samplerate)

(similarfft)
[0211]
输入要检测的前后语音段beforepart、afterpart,采样率samplerate,接着计算每段音频的频谱插值,首先将音频进行带通滤波,随后快速傅里叶变换,接着在150hz到
hz计算出均匀分布的100001个点进行三次方插值,插值确保了两段音频比较频率相似度时的点位相同,接着计算pearson相似度,获得similarfft。
[0212]
如计算得到的similarfft小于用户设置的similaraudiosvalue
fft
则跳过本次检测,获取在beforepart前一段的语音段进行检测。如得到的similarfft大于similaraudiosvalue
fft
则再计算两语音段的梅尔频率倒谱系数相似度。
[0213]
(2)计算梅尔频率倒谱系数相似度:
[0214]
calculatesimilar
mfcc(
beforepart,afterpart,samplerate,fr(similarmfcc,pcrate
flag
)
[0215]
输入要检测的前后语音段beforepart、afterpart,采样率samplerate,帧长占比framelengthrate,惩罚系数penaltyc
dtw
。首先计算两段语音段的12阶梅尔倒谱系数,记为cccb、ccca,接着对两语音段每一阶梅尔倒谱系数进行动态时间规整,如动态时间规整的惩罚率大于50%则直接使similar
mfcc
=0,pcrate
flag
=false并返回,否则计算pearson相似度,将当前阶的mfcc相似度记入similarmfcc
row
,循环直到12阶梅尔倒谱系数相似度全部计算完成。接着对获得的similarmfcc
row
进行归一化倒谱提升,提升人声特征频段的相似度权重,并获得最终的梅尔倒谱系数相似度similarmfcc。
[0216]
如果获得的pcrate
flag
为否,或者similarmfcc值小于用户设置的similaraudiosvalue
mfcc
则跳过本次检测,向前移动beforepart的位置再检测。
[0217]
检测轮次取决于用户设定的最大前向检测次数maxintervalnum。
[0218]
如similarmfcc大于等于用户设置的similaraudiosvalue
mfcc
则将剪错起点cuta置为当前beforepart的起始点,剪错终点cutb置为afterpart的起始点,并返回。如图7所示。
[0219]
1.5.5.预剪错
[0220]
如果getcutting方法返回的cuta和cutb非空,则将cuta和cutb封装成tag类的变量,加入tag链表。
[0221]
当所有标记检测完成后,对链表头加上补偿时间makeuptime,以将所有剪错时间统一到原始音频时间轴中,并返回tag链表头指针。
[0222]
等待所有线程结束,将所有tag链表头指针存入临时数组tagheadlist。
[0223]
首先对tagheadlist进行排序,这里重写了排序方法,以tagheadlist中每一个头指针指向的下一个剪错标记的开始位置的值作为排序值,由小到大排序,接着循环读取tagheadlist中每个剪错标记头指针,尾插法插入新的标记头taghead,将tagheadlist组成为一条链表,链表头为taghead。
[0224]
将用户输入的原始标记点origintags(数组形式)进行排序,并从taghead遍历链表,将origintags中所有标记转换为tag类型变量(starttime与endtime同一时刻)插入链表。
[0225]
接着处理taghead,因插入了用户输入的原始标记点而可能导致的tag同起点或嵌套的问题。从taghead遍历链表,比较前一tag和后一tag在时间上是否有重叠部分,如有重叠部分则进行合并。
[0226]
接着生成适配原始音频的标记段,深拷贝一份taghead为头指针的链表taghead
copy
,同时将用户输入的原始音频标记段(数组形式)转换为tag链表形式,链表头为
taghead
origin
,将taghead
origin
所有项插入taghead,由于taghead
origin
时间线和taghead的并不相同,所以需要将taghead
origin
中每一项依次插入taghead且在插入后将插入点之后的所有tag增加插入的tag的时长,本发明采用链表结构组织tag的优势也就体现出来,只需要对插入的tag的下一tag增加时长即可完成所有tag的时长增加,taghead
origin
中所有项插入完毕后,预剪错操作全部结束,获得taghead和taghead
copy
。如图8所示。
[0227]
1.5.6.剪错
[0228]
依次读取taghead中剪错tag,将原音频依据tag中的starttime和endtime进行剪切,每剪切完一个tag,将当前位置tag的后一个tag减去当前剪切的长度。最终获得剪错完成的音频。
[0229]
接着将taghead和taghead
copy
转换为方便用户导入的数组结构,即完成了剪错操作,最终输出剪错完成的音频、剪错完成的音频的剪错标记点、原始音频的剪错标记段。如图9、10、11所示。
[0230]
针对音频自动剪错的需求,本发明将基于语音识别技术链中的语音激活检测、梅尔频率倒谱系数、动态时间规整技术,设计一种高效、轻量化的语音相似度检测技术,并基于此技术实现音频自动剪错功能。由于不使用已有语料库,于是传统动态时间规整技术的相似度标准:累加距离,不再具有绝对意义,且在相对意义下其不易被理解。因此,本发明根据动态时间规整获得的新的语音段进行pearson相似度计算使相似度规整到[0,1]区间以获得更好的理解性,同时使用pearson相似度计算相似度时将能够规避前后语音段音量大小不一致导致的相似度降低这一现象。并且,本发明将对动态时间规整算法进行改良,以适配无样本情况下的相似度判断,通过在算法中加入惩罚系数penaltyc,对动态时间规整算法在匹配两段语音时出现的过拟合现象进行修正。
[0231]
本发明在实现高效、轻量化的语音相似度检测技术的基础上,设计了一套高效、高准确度的音频自动剪错系统,能够对音频中出现的错读现象进行标明和剪切。音频自动剪错系统中为加快计算速度引入了动态规划思想和多线程技术,针对时序序列的时刻误差性设计了一种数据结构算法,使得时间序列下的动态规划搜索效率极大提高。同时由于系统设计中完全引入了多线程技术,计算效率极大提高、内存使用率显著降低。同时系统根据用户使用的反馈,增加了可以进行多次迭代检测和记录原音轨剪错标记的能力,通过对已有剪错标记点和时长的反算,能够得到所有剪错标记在原始音频的标记段,做到了无限次迭代不丢失最原始音频标记的能力,极大方便用户使用本发明。
[0232]
以上显示和描述了本发明的基本原理和主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护范围由所附的权利要求书及其等效物界定。

技术特征:
1.一种基于相似度检测的音频自动剪错方法,其特征在于,包括如下步骤:s1完成前期基础工作;s11确定帧长:getframelength(signal,framelengthrate)

(framelength)输入待测语音信号signal,帧长占比framelengthrate,输出待测语音信号的分帧长度framelength;s12语音分帧:enframe(signal,framelength,frameinc,windowfun)

(frames)首先,通过计算帧长framelength的三分之二作为帧移frameinc,接着输入待测语音信号signal,帧长framelength,帧移frameinc,加窗函数windowfun,输出按帧长和帧移切割完成的形状为帧数
×
帧长的分帧矩阵framess13获得滤波系数:getlfilter(samplerate)

(filter
a
,filter
b
)输入待测语音采样率samplerate,经过scipy工具箱中的signal.butter方法,设计带通滤波器,滤波取80hz到18000hz的人声特征频段,得到滤波分子系数向量filter
a
和分母系数向量filter
b
,并输出;s2语音激活检测;s21计算过零率:getzerocrossingrate(signal,sens)

(zcr,zcr1,zcr2,tmp1,tmp2,signs,diffs)输入待测语音信号signal,灵敏度系数sens,首先分别计算signal在[0,end-1]的分帧tmp1与在[1,end]的分帧tmp2,接着计算<tmp1,tmp2>得到结果取小于0的为1,其余为0,得出矩阵signs,即接着计算|tmp
1-tmp2|,结果大于0.2的为1,其余为0,得出矩阵diffs,即最后计算<signs,diffs>,按列求和,得到形状为帧数
×
1的过零率矩阵zcr,再计算zcr中最大值除以snes的值作为高过零率门限zcr
x
,计算zcr中最大值除以snes的1.5倍的值作为低过零率门限zcr2s22计算短时能量:getshorttimeenergy(signal,sens)

(amp,amp1,amp2,signal
afterfilter
,frames)输入待测语音信号signal,灵敏度系数sens,首先通过计算获得滤波系数并通过scipy工具箱中的signal.lfilter方法进行signal的滤波,获得滤波后的语音信号signal
afterfilter
,再计算signal
afterfilter
的分帧frames,取frames的绝对值并按列求和得到形状为帧数
×
1的短时能量矩阵amp,再计算amp中最大值除以sens的值作为高能量门限amp1,计算amp中最大值除以sens的1.5倍的值作为低能量门限amp2s23计算语音端点:vad(amp,zcr,amp1,amp2,zcr1,zcr2,frameinc)

(startpoint,endpoiht)
输入待测语音的短时能量amp,过零率zcr,短时能量上下门限amp1和amp2,过零率上下门限zcr1和zcr2,以及帧移frameinc,对amp和zcr中每一点数值进行比较,数值大于各自设定的上门限amp1或zcr1则进入语音段记录开始值的下标为startpoint,如大于各自下门限但小于上门限则进入过渡态,如进入语音态后,数值小于各自下门限则进入结束态记录结束值的下标为endpoint,并将startpoint与endpoint乘以frameinc得到正确的语音起点startpoint和语音终点endpoint;s3计算梅尔频率倒谱系数;mfcc(signal,samplerate)

(ccc,signal
afterfilter
,frames,filterbanks)入待测语音信号signal,待测语音信号采样率samplerate,首先计算获得滤波系数并通过scipy工具箱中的signal.lfilter方法进行signal的滤波,获得滤波后的语音信号signal
afterfilter
,再对signal
afterfilter
分帧,此处帧长固定256,帧移80,窗函数选择汉明窗得到分帧矩阵frames,本发明选择将梅尔频率倒谱系数导出为12维,即设置梅尔频率倒谱系数矩阵ccc形状为frames列数
×
12的矩阵,接着计算每一帧系数,首先对当前帧进行快速傅里叶变换得到当前帧频域谱,再对频域谱开平方,得到当前帧能量谱,接着使用梅尔滤波器组进行滤波,再对滤波后矩阵取对数得到filterbanks特征,最后将filterbanks带入离散余弦变换函数计算并舍去计算结果第一列,得到第一帧的梅尔频率倒谱系数,记录至梅尔频率倒谱系数矩阵ccc对应列,重复以上步骤至所有帧计算完成,得到ccc;s4动态时间规整技术;计算两语音段的最佳路径:dtw(signal
a
,signal
b
,penaltyc)

(signal
adtw
,signal
bdtw
,pcrate,d,w)输入待计算语音段singal
a
和singal
b
,输入惩罚系数penaltyc,首先将singal
a
和singal
b
标准化,再计算singal
a
每一点到singal
b
的所有点的欧式距离,形成形状为singala长度
×
signalb长度的距离矩阵d,接着设置起点为矩阵右上角,开始选择最佳路径,选择项有三个,分别是矩阵中当前点的下方、左方和左下方,选取其中距离最短项,并将选择项记录到最佳路径w中,本发明在此算法中加入惩罚系数项,即当距离最短项为当前点下方或左方,对应方向的惩罚计数器加一,并在记录最佳路径前判断各方向惩罚计数器的计数,如果大于penaltyc则惩罚当前格最佳路径,其匹配的最佳路径位置被置-1,记录到w中,接着根据w中记录的最佳路径重新调整singal
a
和singal
b
,对于被惩罚的路径则将对应值置为当前语音段的平均值,最终输出经过最佳路径重新对齐后的语音段signal
adtw
和signal
bdtw
,同时计算检测中的总惩罚数除以总检测次数获得惩罚率pcrate;s5利用音频自动剪错系统实现多核并行的计算能力。2.根据权利要求1所述的一种基于相似度检测的音频自动剪错方法,其特征在于,所述步骤s5,包括如下步骤:s51类定义;s52预处理;s53语音段确定;s54相似语音段判断;s55预剪错:如果getcutting方法返回的cut
a
和cut
b
非空,则将cut
a
和cut
b
封装成tag类的变量,加入
tag链表,当所有标记检测完成后,对链表头加上补偿时间makeuptime,以将所有剪错时间统一到原始音频时间轴中,并返回tag链表头指针,等待所有线程结束,将所有tag链表头指针存入临时数组tagheadlist,首先,对tagheadlist进行排序,这里重写了排序方法,以tagheadlist中每一个头指针指向的下一个剪错标记的开始位置的值作为排序值,由小到大排序,接着循环读取tagheadlist中每个剪错标记头指针,尾插法插入新的标记头taghead,将tagheadlist组成为一条链表,链表头为taghead,将用户输入的原始标记点origintags进行排序,并从taghead遍历链表,将origintags中所有标记转换为tag类型变量插入链表,接着处理taghead,因插入了用户输入的原始标记点而可能导致的tag同起点或嵌套的问题,从taghead遍历链表,比较前一tag和后一tag在时间上是否有重叠部分,如有重叠部分则进行合并,接着生成适配原始音频的标记段,深拷贝一份taghead为头指针的链表taghead
copy
,同时将用户输入的原始音频标记段转换为tag链表形式,链表头为taghead
origin
,将taghead
origin
所有项插入taghead,由于taghead
origin
时间线和taghead的并不相同,所以需要将taghead
origin
中每一项依次插入taghead且在插入后将插入点之后的所有tag增加插入的tag的时长,本发明采用链表结构组织tag的优势也就体现出来,只需要对插入的tag的下一tag增加时长即可完成所有tag的时长增加,taghead
origin
中所有项插入完毕后,预剪错操作全部结束,获得taghead和taghead
copy
;s56剪错:依次读取taghead中剪错tag,将原音频依据tag中的starttime和endtime进行剪切,每剪切完一个tag,将当前位置tag的后一个tag减去当前剪切的长度,最终获得剪错完成的音频,接着将taghead和taghead
copy
转换为方便用户导入的数组结构,即完成了剪错操作,最终输出剪错完成的音频、剪错完成的音频的剪错标记点、原始音频的剪错标记段。3.根据权利要求2所述的一种基于相似度检测的音频自动剪错方法,其特征在于,步骤s51,包括如下步骤:s511剪错记录tag:用来记录剪错段落,成员变量为剪切起始点starttime,终止点endtime,下一个剪错记录tag的地址next;成员方法重写了加法与减法;加法:一个tag加上一个常数则对应剪切起始点、终止点加上该常数,同时调用next加上该常数;减法:一个tag减去一个常数则对应剪切起始点、终止点减去该常数,同时调用next减去该常数;s512端点记录单节点section:用来记录端点激活检测后的结果,成员变量为起始管辖点startinterval,终止管辖点endinterval,前一管辖域内起始端点位置beforepoint,前一管辖域内终止端点位置beforepointend,当前管辖域内起始端点位置afterpoint,当前管辖域内终止端点位置afterpointend;s513端点数组单节点sectionsarraypoint:用来协助哈希散列存储section的类预处
理,成员变量为当前节点哈希号hashid,当前节点的所有section组成的数组sectionsarray;成员变量:判断是否存在相同section:isexistsection(section)

(ansindex),判断当前节点内的section的beforepoint或afterpoint是否相同,如相同则返回该section在sectionsarray中的下标,如没有相同则返回-1;寻找当前节点中与某一时刻最佳匹配的section:findsection(point)

(anssection),遍历sectionsarray判断该时刻point是否位于section的[startinterval,afterpoint]范围内,如位于则返回当前section,否则返回空。4.根据权利要求2所述的一种基于相似度检测的音频自动剪错方法,其特征在于,所述步骤s52,包括如下步骤:s521对用户输入的所有参数判断是否存在非法值,如存在非法值则将对应项置为默认值;s522读取要处理的音频,获取音频数组和采样率;s523如音频为多声道则保存一份原音频副本,并转化为单声道音频,为后续操作节约计算和内存资源;s524计算音频最大可拆分线程数,本发明限定每线程处理音频长度不超过2分钟;s525根据计算得出的最大可拆分线程数将音频平均分段,并创建线程池,将分完段的音频加入线程池。5.根据权利要求2所述的一种基于相似度检测的音频自动剪错方法,其特征在于,所述步骤s53,包括如下步骤:s531自动标记:输入待测语音段signal,分帧率framelengthrate,端点检测灵敏度sens,断句最短时间similartagsinterval,采样率samplerate,首先创建记录标记点的数组tags,端点记录数组sections,接着调用语音激活检测函数计算第一处语音段的起始位置和结束位置,组成section类变量,并加入单端点数组sections中,同时记录该结束点位置,接着将音频的起始位置到检测的语音段结束位置,进行下一次语音激活检测,将前一次记录的结束点位置和这一次得到的起始点位置求中点,加入待处理标签数组tags,并同样组成section类变量并加入sections,循环操作,直到剩余音频段长度小于一固定值,退出循环,返回tags和sections,s532初始化端点记录数组:initsectionspointarray(audiolength,sections)

(sectionspointarray)输入待测语音段长度audiolength,单端点数组sections,接着根据audiolength和sections计算装填因子创建端点记录数组sectionspointarray,接着遍历sections中所有
section,计算每个section中的startinterval到endinterval所跨域的哈希值,将该section的引用置入所有其包含的哈希块中,遍历装填完成后,返回初始化完成的sectionspointarray。6.根据权利要求2所述的一种基于相似度检测的音频自动剪错方法,其特征在于,所述步骤s54,包括如下步骤:逐个读取标签,获取剪辑的起点和终点:getcutting(sectionpointsarray,tag,signal,samplerate,sim(cut
a
,cut
b
)输入端点记录数组sectionpointsarray,当前标记点tag,待检测语音段signal,采样率samplerate,快速傅里叶的相似度标准similaraudiosvalue
fft
,梅尔频率倒谱系数的相似度标准similaraudiosvalue
mfcc
,帧长占比framelengthrate,端点检测灵敏度sens,惩罚系数penaltyc
dtw
,补偿时间makeuptime,最大前向检测次数maxintervalnum,首先,沿tag处将signal分为前半部分音频beforewave和后半部分音频afterwave,接着寻找afterwave的语音起始点,使用tag除以sectionpointsarray的装填因子,获得当前tag所在的sectionsarraypoint并调用成员方法findsection寻找tag具体所在的section记为aftersection,如未找到则进行语言激活检测,获得当前语音段的起始点终止点,如找到则直接获取语音段的起始点,接着获取beforewave的起始点和终止点,首先将beforewave倒置,接着检测aftersection是否为空,如为空则进行语言激活检测,获得当前语音段的起始点,终止点,并同afterwave的起始点终止点封装成section加入sectionpointsarray,如不为空则直接从aftersection获取起始点beforepoint终止点beforepointend,然后根据获得的起始点终止点截取前后两段语音,并统一到相同长度,即选取两段语音中长度较小段,将较长段截取成较小段,将两段语音记为afterpart、beforepart,s541计算快速傅里叶后的相似度:calculatesimilar
fft
(beforepart,afterpart,samplerate)

(similarfft)输入要检测的前后语音段beforepart、afterpart,采样率samplerate,接着计算每段音频的频谱插值,首先将音频进行带通滤波,随后快速傅里叶变换,接着在150hz到计算出均匀分布的100001个点进行三次方插值,插值确保了两段音频比较频率相似度时的点位相同,接着计算pearson相似度,获得similarfft;如计算得到的similarfft小于用户设置的similaraudiosvalue
fft
则跳过本次检测,获取在beforepart前一段的语音段进行检测,如得到的similarfft大于similaraudiosvalye
fft
则再计算两语音段的梅尔频率倒谱系数相似度;s542计算梅尔频率倒谱系数相似度:输入要检测的前后语音段beforepart、afterpart,采样率samplerate,帧长占比framelengthrate,惩罚系数penaltyc
dtw
,首先计算两段语音段的12阶梅尔倒谱系数,记为ccc
b
、ccc
a
,接着对两语音段每一阶梅尔倒谱系数进行动态时间规整,如动态时间规整的惩
罚率大于50%则直接使similar
mfcc
=0,pcrate
flag
=false并返回,否则计算pearson相似度,将当前阶的mfcc相似度记入similarmfcc
row
,循环直到12阶梅尔倒谱系数相似度全部计算完成,接着对获得的similarmfcc
row
进行归一化倒谱提升,提升人声特征频段的相似度权重,并获得最终的梅尔倒谱系数相似度similarmfcc,如果获得的pcrate
flag
为否,或者similarmfcc值小于用户设置的similaraudiosvalue
mfcc
则跳过本次检测,向前移动beforepart的位置再检测,检测轮次取决于用户设定的最大前向检测次数maxintervalnum,如similarmfcc大于等于用户设置的similaraudiosvalue
mfcc
则将剪错起点cut
a
置为当前beforepart的起始点,剪错终点cut
b
置为afterpart的起始点,并返回。

技术总结
本发明公开了一种基于相似度检测的音频自动剪错方法,针对一段音频自动判断其所有语音段,并对所有语音段进行有限次的相似度比较,对相似度较高音频进行剪错,并保留所有剪错长度和位置信息,自动剪错系统具体实现过程包括如下步骤:预处理、语音段确定(标记确定)、相似段判断、预剪错、剪错,其中相似段判断部分包含了如下的具体实现过程:(1)动态规划获取预判断相似度的语音片段(2)快速傅里叶变换并插值获得两语音段在频域上的相似度(3)计算梅尔频率倒谱系数并进行经过改良的动态时间规整得到两语音段在时域上的相似度。本发明引入动态规划思想设计音频自动剪错系统,极大减少了语音激活检测的次数,使得计算效率极大提升。升。升。


技术研发人员:葛昊宇 薛彦昊 魏立斐 张蕾
受保护的技术使用者:上海海洋大学
技术研发日:2022.07.13
技术公布日:2022/11/1
转载请注明原文地址: https://tieba.8miu.com/read-3784.html

最新回复(0)