语音实验一端点检测

合集下载

详解python的webrtc库实现语音端点检测

详解python的webrtc库实现语音端点检测

详解python的webrtc库实现语⾳端点检测引⾔语⾳端点检测最早应⽤于电话传输和检测系统当中,⽤于通信信道的时间分配,提⾼传输线路的利⽤效率.端点检测属于语⾳处理系统的前端操作,在语⾳检测领域意义重⼤.但是⽬前的语⾳端点检测,尤其是检测⼈声开始和结束的端点始终是属于技术难点,各家公司始终处于能判断,但是不敢保证判别准确性的阶段.现在基于云端语义库的聊天机器⼈层出不穷,其中最著名的当属amazon的 Alexa/Echo 智能⾳箱.国内如⾬后春笋般出现了各种搭载语⾳聊天的智能⾳箱(如前⼏天在知乎上⼴告的若琪机器⼈)和各类智能机器⼈产品.国内语⾳服务提供商主要⾯对中⽂语⾳服务,由于语⾳不像图像有分辨率等等较为客观的指标,很多时候凭主观判断,所以较难判断各家语⾳识别和合成技术的好坏.但是我个⼈认为,国内的中⽂语⾳服务和国外的英⽂语⾳服务,在某些⽅⾯已经有超越的趋势.通常搭建机器⼈聊天系统主要包括以下三个⽅⾯:1. 语⾳转⽂字(ASR/STT)2. 语义内容(NLU/NLP)3. ⽂字转语⾳(TTS)语⾳转⽂字(ASR/STT)在将语⾳传给云端API之前,是本地前端的语⾳采集,这部分主要包括如下⼏个⽅⾯:1. 麦克风降噪2. 声源定位3. 回声消除4. 唤醒词5. 语⾳端点检测6. ⾳频格式压缩python 端点检测由于实际应⽤中,单纯依靠能量检测特征检测等⽅法很难判断⼈声说话的起始点,所以市⾯上⼤多数的语⾳产品都是使⽤唤醒词判断语⾳起始.另外加上声⾳回路,还可以做语⾳打断.这样的交互⽅式可能有些傻,每次必须喊⼀下唤醒词才能继续聊天.这种⽅式聊多了,个⼈感觉会嘴巴疼:-O .现在github上有snowboy唤醒词的开源库,⼤家可以登录snowboy官⽹训练⾃⼰的唤醒词模型.1. Kitt-AI : Snowboy2. Sensory : Sensory考虑到⽤唤醒词嘴巴会累,所以⼤致调研了⼀下,Python拥有丰富的库,直接import就能⾷⽤.这种⽅式容易受强噪声⼲扰,适合⼀个⼈在家玩玩.1. pyaudio: pip install pyaudio 可以从设备节点读取原始⾳频流数据,⾳频编码是PCM格式;2. webrtcvad: pip install webrtcvad 检测判断⼀组语⾳数据是否为空语⾳;当检测到持续时间长度 T1 vad检测都有语⾳活动,可以判定为语⾳起始;当检测到持续时间长度 T2 vad检测都没有有语⾳活动,可以判定为语⾳结束;完整程序代码可以从我的下载程序很简单,相信看⼀会⼉就明⽩了'''Requirements:+ pyaudio - `pip install pyaudio`+ py-webrtcvad - `pip install webrtcvad`'''import webrtcvadimport collectionsimport sysimport signalimport pyaudiofrom array import arrayfrom struct import packimport waveimport timeFORMAT = pyaudio.paInt16CHANNELS = 1RATE = 16000CHUNK_DURATION_MS = 30 # supports 10, 20 and 30 (ms)PADDING_DURATION_MS = 1500 # 1 sec jugementCHUNK_SIZE = int(RATE CHUNK_DURATION_MS / 1000) # chunk to readCHUNK_BYTES = CHUNK_SIZE 2 # 16bit = 2 bytes, PCMNUM_PADDING_CHUNKS = int(PADDING_DURATION_MS / CHUNK_DURATION_MS)# NUM_WINDOW_CHUNKS = int(240 / CHUNK_DURATION_MS)NUM_WINDOW_CHUNKS = int(400 / CHUNK_DURATION_MS) # 400 ms/ 30ms geNUM_WINDOW_CHUNKS_END = NUM_WINDOW_CHUNKS 2START_OFFSET = int(NUM_WINDOW_CHUNKS CHUNK_DURATION_MS 0.5 RATE)vad = webrtcvad.Vad(1)pa = pyaudio.PyAudio()stream = pa.open(format=FORMAT,channels=CHANNELS,rate=RATE,input=True,start=False,# input_device_index=2,frames_per_buffer=CHUNK_SIZE)got_a_sentence = Falseleave = Falsedef handle_int(sig, chunk):global leave, got_a_sentenceleave = Truegot_a_sentence = Truedef record_to_file(path, data, sample_width):"Records from the microphone and outputs the resulting data to 'path'" # sample_width, data = record()data = pack('<' + ('h' len(data)), data)wf = wave.open(path, 'wb')wf.setnchannels(1)wf.setsampwidth(sample_width)wf.setframerate(RATE)wf.writeframes(data)wf.close()def normalize(snd_data):"Average the volume out"MAXIMUM = 32767 # 16384times = float(MAXIMUM) / max(abs(i) for i in snd_data)r = array('h')for i in snd_data:r.append(int(i times))return rsignal.signal(signal.SIGINT, handle_int)while not leave:ring_buffer = collections.deque(maxlen=NUM_PADDING_CHUNKS) triggered = Falsevoiced_frames = []ring_buffer_flags = [0] NUM_WINDOW_CHUNKSring_buffer_index = 0ring_buffer_flags_end = [0] NUM_WINDOW_CHUNKS_ENDring_buffer_index_end = 0buffer_in = ''# WangSraw_data = array('h')index = 0start_point = 0StartTime = time.time()print(" recording: ")stream.start_stream()while not got_a_sentence and not leave:chunk = stream.read(CHUNK_SIZE)# add WangSraw_data.extend(array('h', chunk))index += CHUNK_SIZETimeUse = time.time() - StartTimeactive = vad.is_speech(chunk, RATE)sys.stdout.write('1' if active else '_')ring_buffer_flags[ring_buffer_index] = 1 if active else 0ring_buffer_index += 1ring_buffer_index %= NUM_WINDOW_CHUNKSring_buffer_flags_end[ring_buffer_index_end] = 1 if active else 0ring_buffer_index_end += 1ring_buffer_index_end %= NUM_WINDOW_CHUNKS_END# start point detectionif not triggered:ring_buffer.append(chunk)num_voiced = sum(ring_buffer_flags)if num_voiced > 0.8 NUM_WINDOW_CHUNKS:sys.stdout.write(' Open ')triggered = Truestart_point = index - CHUNK_SIZE 20 # start point# voiced_frames.extend(ring_buffer)ring_buffer.clear()# end point detectionelse:# voiced_frames.append(chunk)ring_buffer.append(chunk)num_unvoiced = NUM_WINDOW_CHUNKS_END - sum(ring_buffer_flags_end)if num_unvoiced > 0.90 NUM_WINDOW_CHUNKS_END or TimeUse > 10:sys.stdout.write(' Close ')triggered = Falsegot_a_sentence = Truesys.stdout.flush()sys.stdout.write('\n')# data = b''.join(voiced_frames)stream.stop_stream()print(" done recording")got_a_sentence = False# write to fileraw_data.reverse()for index in range(start_point):raw_data.pop()raw_data.reverse()raw_data = normalize(raw_data)record_to_file("recording.wav", raw_data, 2)leave = Truestream.close()程序运⾏⽅式sudo python vad.py以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

《基于深度学习的语音端点检测》范文

《基于深度学习的语音端点检测》范文

《基于深度学习的语音端点检测》篇一一、引言随着人工智能技术的不断发展,语音信号处理在众多领域中得到了广泛的应用。

其中,语音端点检测(Voice Activity Detection, VAD)是语音信号处理中的一个重要环节。

它主要用于区分语音信号中的语音段和非语音段,为后续的语音识别、语音合成等任务提供有效的预处理。

传统的语音端点检测方法往往依赖于阈值设定和特征提取,但这些方法往往容易受到噪声和环境因素的影响,导致误检和漏检。

近年来,深度学习技术的崛起为语音端点检测提供了新的解决方案。

本文将探讨基于深度学习的语音端点检测方法,以提高检测质量和鲁棒性。

二、相关工作传统的语音端点检测方法主要基于阈值设定和特征提取。

这些方法通常依赖于预先定义的阈值和特征,如短时能量、过零率等。

然而,这些方法在噪声环境下性能较差,容易受到各种干扰因素的影响。

近年来,深度学习技术在语音识别、语音合成等领域取得了显著的成果。

因此,将深度学习应用于语音端点检测已成为一个研究热点。

三、基于深度学习的语音端点检测方法本文提出一种基于深度学习的语音端点检测方法。

该方法利用循环神经网络(RNN)和卷积神经网络(CNN)的优点,构建一个端到端的模型,实现对语音信号的实时检测。

1. 数据预处理:首先对原始语音信号进行预处理,包括归一化、分帧等操作,以便于后续的模型训练。

2. 模型构建:构建一个基于RNN和CNN的深度学习模型。

RNN用于捕捉语音信号的时间依赖性,CNN用于提取局部特征。

通过将RNN和CNN进行融合,可以实现对语音信号的时空特征提取。

3. 训练与优化:使用大量的语音数据对模型进行训练,并采用适当的损失函数和优化算法来优化模型的性能。

此外,为了进一步提高模型的泛化能力,还可以采用数据增强等技术对训练数据进行扩展。

4. 实时检测:将训练好的模型应用于实时语音信号中,实现对语音段的实时检测。

通过设置合适的阈值,可以有效地区分出语音段和非语音段。

语音端点检测方法研究

语音端点检测方法研究

语音端点检测方法研究1沈红丽,曾毓敏,李平,王鹏南京师范大学物理科学与技术学院,南京(210097)E-mail:orange.2009@摘要: 端点检测是语音识别中的一个重要环节。

有效的端点检测技术不仅能减少系统的处理时间,增强系统处理的实时性,而且能排除无声段的噪声干扰,增强后续过程的识别性。

可以说,语音信号的端点检测至今天为止仍是有待进一步深入的研究课题.鉴于此,本文介绍了语音端点算法的基本研究现状,接着讨论并比较了语音信号端点检测的方法,分析了各种方法的原理及优缺点,如经典的基于短时能量和过零率的检测方法,基于频带方差的检测方法,基于熵的检测方法,基于倒谱距离的检测方法等.并基于这些方法的分析,对端点检测方法做了进行了总结和展望,对语音信号的端点检测的进一步研究具有深远的意义。

关键词:语音信号;端点检测;噪声中图分类号:TP206. 11. 引言语音信号处理中的端点检测技术,是指从包含语音的一段信号中确定出语音信号的起始点及结束点。

语音信号的端点检测是进行其它语音信号处理(如语音识别、讲话人识别等)重要且关键的第一步. 研究表明[1],即使在安静的环境中,语音识别系统一半以上的识别错误来自端点检测器。

因此,作为语音识别系统的第一步,端点检测的关键性不容忽视,尤其是噪声环境下语音的端点检测,它的准确性很大程度上直接影响着后续的工作能否有效进行。

确定语音信号的起止点, 从而减小语音信号处理过程中的计算量, 是众多语音信号处理领域中一个基本而且重要的问题。

有效的端点检测技术不仅能减少系统的处理时间,增强系统处理的实时性,而且能排除无声段的噪声干扰,增强后续过程的识别性。

可以说,语音信号的端点检测至今天为止仍是有待进一步深入的研究课题。

2. 语音端点检测主要方法和分析在很长一段时间里,语音端点检测算法主要是依据语音信号的时域特性[2].其采用的主要参数有短时能量、短时平均过零率等,即通常说的基于能量的端点检测方法。

《基于深度学习的语音端点检测》范文

《基于深度学习的语音端点检测》范文

《基于深度学习的语音端点检测》篇一一、引言随着人工智能技术的快速发展,语音识别技术得到了广泛的应用。

在语音识别系统中,语音端点检测(Voice Activity Detection,VAD)是一个重要的预处理步骤,它能够有效地将语音信号中的非语音部分剔除,从而提高语音识别的准确性和效率。

传统的语音端点检测方法往往基于简单的统计特征或者固定阈值来进行判断,但是这种方法容易受到环境噪声的干扰,无法满足实际应用的需求。

近年来,深度学习技术的发展为语音端点检测提供了新的解决方案。

本文旨在探讨基于深度学习的语音端点检测方法,以提高其准确性和鲁棒性。

二、相关工作传统的语音端点检测方法通常使用短时能量、过零率等特征来判断语音的起点和终点。

这些方法在较为简单的环境中效果尚可,但面对复杂的背景噪声、语音环境变化等情况时,其性能会显著下降。

近年来,深度学习技术在语音识别、语音合成等领域取得了显著的成果。

因此,越来越多的研究者开始探索基于深度学习的语音端点检测方法。

这些方法能够自动学习并提取更丰富的语音特征,从而提高对噪声的鲁棒性。

三、基于深度学习的语音端点检测方法本文提出了一种基于深度学习的语音端点检测方法。

该方法使用循环神经网络(RNN)和卷积神经网络(CNN)进行特征提取和分类。

首先,将原始的音频信号进行预处理,提取出短时段的音频帧作为输入数据。

然后,利用CNN对每个音频帧进行特征提取,获取音频的时频特征。

接着,使用RNN对时频特征进行序列建模,以便捕捉音频中的连续信息。

最后,通过一个全连接层进行分类,判断该段音频是否为语音。

具体实现中,我们选择了两种常用的神经网络结构进行实验对比:LSTM-RNN和GRU-RNN。

LSTM-RNN具有更强的记忆能力,适合处理长序列数据;而GRU-RNN则具有更少的参数和更快的训练速度。

在特征提取方面,我们尝试了多种不同的CNN 结构,包括一维卷积神经网络和二维卷积神经网络等。

语音端点检测

语音端点检测
随着语音识 别应用的发展,越来越多系统将打断功能作为一种方便有效的应用模式,而打断功能又直接依赖端点检测。端点检测对打断功能的影响发生在判断语音/非语音的过 程出现错误时。表现在过于敏感的端点检测产生的语音信号的误警将产生错误的打断。例如,提示音被很强的背景噪音或其它人的讲话打断,是因为端点检测错误的 将这些信号作为有效语音信号造成的。反之,如果端点检测漏过了事实上的语音部分,而没有检测到语音。系统会表现出没有反应,在用户讲话时还在播放提示音。
语音信号的最基本组成单位是音素。音素可分成浊音和清音两大类。如果将不存在语音而只有背景噪声的情况成为“无声”,那么音素可分成“无声”、“浊音”和“清音”三类。在短时分析的基础上可判断一短段语音属于哪一类。如果是浊语音段,还可测定它的另一些重要参数,如基音和共振峰等。
2.2 语音信号分析
语音信号处理包括语音识别、语音合成、语音编码、说话人识别等方面,但是其前提和基础是对语音信号进行分析。只有将语音信号分析成表示其本质特性的参数,才有可能利用这些参数进行高效的语音通信,以及建立用于识别的模板或知识库。而且,语音识别率的高低,语音合成的音质好坏,都取决于对语音信号分析的准确性和精度
第三章,从每一种算法的方程式入手,以原理简便、运算量小等方面为标准,通过大量的文献调研与实际研究,本课主题要研究语音起点和终点的检测,以短时能量和短时过零率相结合的双门限语音端点检测算法以及倒谱分析和谱熵技术等进行语音端点检测,并分析各算法在低信噪比和高信噪比条件下的检测效果进行对比。
对这种信号进行Matlab进行编程,对于不同信噪比的声音片段,最后用前后的噪声信号进行对比以得出结论
1.2 语音端点检测现状
作为一个完整的语音识别系统,其最终实现及使用的效果不仅仅限于识别的算法,许多相关因素都直接影响着应用系统的成功与否。语音识别的对象是语音信号,端点检测的目的就是在复杂的应用环境下的信号流中分辨出语音信号和非语音信号,并确定语音信号的开始及结束。一般的信号流都存在一定的背景声,而语音识别的模型都是基于语音信号训练的,语音信号和语音模型进行模式匹配才有意义。因此从信号流中检测出语音信号是语音识别的必要的预处理过程[2]。

重点(端点检测)

重点(端点检测)

在设计一个成功的端点检测模块时,会遇到下列一些实际困难:⑴信号取样时,由于电平的变化,难于设置对各次试验都适用的阀值。

⑵在发音时,人的咂嘴声或其他某些杂音会使语音波形产生一个很小的尖峰,并可能超过所设计的门限值。

此外,人呼吸时的气流也会产生电平较高的噪声。

⑶取样数据中,有时存在突发性干扰,使短时参数变得很大,持续很短时间后又恢复为寂静特性。

应该将其计入寂静段中。

⑷弱摩擦音时或终点处是鼻音时,语音的特性与噪声极为接近,其中鼻韵往往还拖得很长。

⑸如果输入信号中有50Hz工频干扰或者A/D变换点的工作点偏移时,用短时过零率区分无声和清音就变的不可靠。

一种解决方法是算出每一帧的直流分量予以减除,但是这无疑加大了运算量,不利于端点检测算法的实时执行;另一种解决方法是采用一个修正短时参数,它是一帧语音波形穿越某个非零电平的次数,可以恰当地设置参数为一个接近于零的值,使得过零率对于清音仍具有很高的值,而对于无声段值却很低。

但事实上,由于无声段以及各种清音的电平分布情况变化很大,在有些情况下,二者的幅度甚至可以相比拟,这给这个参数的选取带来了极大的困难[5]。

由上可见,一个优秀的端点检测算法应该能满足:⑴门限值应该可以对背景噪声的变化有一定的适应。

⑵将短时冲击噪声和人的咂嘴等瞬间超过门限值的信号纳入无声段而不是有声段。

⑶对于爆破音的寂静段,应将其纳入语音的范围而不是无声段。

⑷应该尽可能避免在检测中丢失鼻韵和弱摩擦音等与噪声特性相似、短时参数较少的语音。

⑸应该避免使用过零率作为判决标准而带来的负面影响。

在做本课题时,端点检测方法是将语音信号的短时能量与过零率相结合加以判断的。

但这种端点检测算法如果运用不好,将会发生漏检或虚检的情况。

语音信号大致可以分为浊音和清音两部分,在语音激活期的开始往往是电平较低的清音,当背景噪声较大时,清音电平与噪声电平相差无几。

采用传统的语音端点检测方法很容易造成语音激活的漏检。

而语音信号的清音段,对于语音的质量起着非常重要的作用。

基于短时自相关及过零率的语音端点检测算法

基于短时自相关及过零率的语音端点检测算法

基于短时自相关及过零率的语音端点检测算

语音端点检测是计算机语音处理领域的一种常见应用,它主要用于语音识别、拼写校正以及声纹分析等语音处理技术中。

基于短时自相关(Short-Time Auto/orrelation, STAC)和过零率(Zero-Crossing Rate, ZCR)的语音端点检测算法是当前检测语音端点所使用的一种常用方法。

通常情况下,该算法的实现步骤如下:首先,将语音信号拆分为多小片段,每块片段的长度一般以毫秒为单位(通常取20ms),并将片段之间用某种滤波器连接;接着计算每块片段的自相关系数,并在计算结果中检测端点;最后,计算每个片段的ZCR,用相邻两个片段之间的ZCR变化来确定语音端点,其中该变化值还可以决定端点的类型—开始点或结束点。

检测完语音端点后,即可实现对语音信号的分割及识别。

现有的STAC-ZCR算法效果较为理想,其特点是计算量小、易于实现,因此深受人们的欢迎并发展至今。

实验一语音信号端点检测

实验一语音信号端点检测

实验一语音信号端点检测一、 实验目的1.学会MATLAB 的使用,掌握MATLAB 的程序设计方法;2.掌握语音处理的基本概念、基本理论和基本方法;3.掌握基于MATLAB 编程实现带噪语音信号端点检测;4.学会用MATLAB 对信号进行分析和处理。

5. 学会利用短时过零率和短时能量,对语音信号的端点进行检测。

二、 实验仪器设备及软件MATLAB三、 实验原理端点检测是语音信号处理过程中非常重要的一步,它的准确性直接影响到语音信号处理的速度和结果。

本次实验利用短时过零率和短时能量相结合的语音端点检测算法利用短时过零率来检测清音,用短时能量来检测浊音,两者相配合便实现了信号信噪比较大情况下的端点检测。

算法对于输入信号的检测过程可分为短时能量检测和短时过零率检测两个部分。

算法以短时能量检测为主,短时过零率检测为辅。

根据语音的统计特性,可以把语音段分为清音、浊音以及静音(包括背景噪声)三种。

在本算法中,短时能量检测可以较好地区分出浊音和静音。

对于清音,由于其能量较小,在短时能量检测中会因为低于能量门限而被误判为静音;短时过零率则可以从语音中区分出静音和清音。

将两种检测结合起来,就可以检测出语音段(清音和浊音)及静音段1、短时能量计算定义n 时刻某语言信号的短时平均能量En 为:∑∑--=+∞∞--=-=n N n m m n w m x m n w m x En )1(22)]()([)]()([式中N 为窗长,可见短时平均能量为一帧样点值的平方和。

特殊地,当窗函数为矩形窗时,有∑--==n N n m m x En )1(2)(2、短时过零率过零就是指信号通过零值。

过零率就是每秒内信号值通过零值的次数。

对于离散时间序列,过零则是指序列取样值改变符号,过零率则是每个样本的改变符号的次数。

对于语音信号,则是指在一帧语音中语音信号波形穿过横轴(零电平)的次数。

可以用相邻两个取样改变符号的次数来计算。

如果窗的起点是n=0,短时过零率Z 为波形穿过横轴(零电平)的次数|))1(())((|2110∑-=--=N n w w n S Sgn n S Sgn Z {00,1,1)sgn(≥<-=x x x短时过零可以看作信号频率的简单度量浊音的短时平均幅度最大,无声的短时平均幅度最小,清音的短时过零率最大,无声居中,浊音的短时过零率最小。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一语音信号端点检测一、实验目的1.学会MATLAB 的使用,掌握MATLAB 的程序设计方法;2.掌握语音处理的基本概念、基本理论和基本方法;3.掌握基于MATLAB 编程实现带噪语音信号端点检测;4.学会用MATLAB 对信号进行分析和处理。

5. 学会利用短时过零率和短时能量,对语音信号的端点进行检测。

二、实验仪器设备及软件HP D538、MATLAB三、实验原理端点检测是语音信号处理过程中非常重要的一步,它的准确性直接影响到语音信号处理的速度和结果。

本次实验利用短时过零率和短时能量相结合的语音端点检测算法利用短时过零率来检测清音,用短时能量来检测浊音,两者相配合便实现了信号信噪比较大情况下的端点检测。

算法对于输入信号的检测过程可分为短时能量检测和短时过零率检测两个部分。

算法以短时能量检测为主,短时过零率检测为辅。

根据语音的统计特性,可以把语音段分为清音、浊音以及静音(包括背景噪声)三种。

在本算法中,短时能量检测可以较好地区分出浊音和静音。

对于清音,由于其能量较小,在短时能量检测中会因为低于能量门限而被误判为静音;短时过零率则可以从语音中区分出静音和清音。

将两种检测结合起来,就可以检测出语音段(清音和浊音)及静音段1、短时能量计算定义n 时刻某语言信号的短时平均能量En 为:∑∑--=+∞∞--=-=n N n m m n w m x m n w m x En )1(22)]()([)]()([式中N 为窗长,可见短时平均能量为一帧样点值的平方和。

特殊地,当窗函数为矩形窗时,有∑--==n N n m m x En )1(2)(2、短时过零率过零就是指信号通过零值。

过零率就是每秒内信号值通过零值的次数。

对于离散时间序列,过零则是指序列取样值改变符号,过零率则是每个样本的改变符号的次数。

对于语音信号,则是指在一帧语音中语音信号波形穿过横轴(零电平)的次数。

可以用相邻两个取样改变符号的次数来计算。

如果窗的起点是n=0,短时过零率Z 为波形穿过横轴(零电平)的次数|))1(())((|2110∑-=--=N n w w n S Sgn n S Sgn Z {00,1,1)sgn(≥<-=x x x短时过零可以看作信号频率的简单度量浊音的短时平均幅度最大,无声的短时平均幅度最小,清音的短时过零率最大,无声居中,浊音的短时过零率最小。

3、短时自相关函数∑--=+=1)()()(k N n ww w k n s n s k R ①是偶函数;②s(n)是周期的,那么R (k )也是周期的;③可用于基音周期估计和线性预测分析4、判断语音信号的起点和终点利用短时平均幅度和短时过零率可以判断语音信号的起点和终点。

语音端点检测方法可采用测试信号的短时能量或短时对数能量、联合过零率等特征参数,并采用双门限判定法来检测语音端点,即利用过零率检测清音,用短时能量检测浊音,两者配合。

首先为短时能量和过零率分别确定两个门限,一个是较低的门限数值较小,对信号的变化比较敏感,很容易超过;另一个是比较高的门限,数值较大。

低门限被超过未必是语音 的开始,有可能是很短的噪声引起的,高门限被超过并且接下来的自定义时间段内的语音。

四、实验步骤及程序(1) 实验步骤:1、取一段录音作为音频样本。

2、利用公式分别编程计算这段语音信号的短时能量和短时过零率,然后分别画出它们的曲线。

3、调整能量门限。

4、进行幅度归一化并设置帧长、短时能量阈值、过零率阈值等参数。

5、编写程序实现语音端点检测。

6、最后得到语音端点检测图像。

(2) 语音信号的端点检测程序流程图:图 1.1 语音信号的端点检测程序流程图(3) 语音信号的端点检测实验源程序:clc;clear;[x,fs]=wavread('2.wav');%%[y] = end_point(x);%%% [f0] = pitch_sift(x,0.38,fs);% plot(f0);%%e_x=(frame(x,'lpc_spectrum',fs));%plot(e_x(2,:));%某一维随时间变化plot(e_x(:,89));%一帧信号各维之间变化hold on;c=melcepst(x,fs);plot(c(89,:),'k');frame定义% function [y] = frame(x,func,SAMP_FREQ,l,step)% where y is output on a frame by frame basis, x is input speech,% and l is the window size. l and step are optional parameters,% by default SAMP_FREQ is 8000, l is 200, and step is 100.% func is a string e.g. 'pitch' that determines a function that you want% to apply to x on a short-time basis.%% Written by: Levent Arslan Apr. 11, 1994%function [yy] = frame(x,func,SAMP_FREQ,l,step)[m,n]=size(x);if m>nn=m;elsen=n;x=x';endif nargin < 3, SAMP_FREQ=16000; end;if nargin < 4, l=SAMP_FREQ/40; end;if nargin < 5, step=l/2; end;num_frames=ceil(n/step); %NUMBER OF FRAMESx(n+1:n+2*l)=zeros(2*l,1); %ADD ZEROS AT THE END OF THE SPEECH SIGNALi=[0:step:num_frames*step]';%i is the arithmetical proportion series by stepj=i*ones(1,l);i=j+ones(num_frames+1,1)*[1:l];y=reshape(x(i),num_frames+1,l)';y=(hanning(l)*ones(1,num_frames+1)).*y;for i=1:num_framescmd=sprintf('yy(:,i)=%s(y(:,i));',func);eval(cmd);endmelcepst定义function c=melcepst(s,fs,w,nc,p,n,inc,fl,fh)%MELCEPST Calculate the mel cepstrum of a signalC=(S,FS,W,NC,P,N,INC,FL,FH)%%% Simple use: c=melcepst(s,fs) % calculate mel cepstrum with 12 coefs, 256 sample frames% c=melcepst(s,fs,'e0dD') % include log energy, 0th cepstral coef, delta and delta-delta coefs%% Inputs:% s speech signal% fs sample rate in Hz (default 11025)% nc number of cepstral coefficients excluding 0'th coefficient (default 12)% n length of frame (default power of 2 <30 ms))% p number of filters in filterbank (default floor(3*log(fs)) ) % inc frame increment (default n/2)% fl low end of the lowest filter as a fraction of fs (default = 0)% fh high end of highest filter as a fraction of fs (default = 0.5)%% w any sensible combination of the following:%% 'R' rectangular window in time domain% 'N' Hanning window in time domain% 'M' Hamming window in time domain (default)%% 't' triangular shaped filters in mel domain (default)% 'n' hanning shaped filters in mel domain% 'm' hamming shaped filters in mel domain%% 'p' filters act in the power domain% 'a' filters act in the absolute magnitude domain (default)%% '0' include 0'th order cepstral coefficient% 'e' include log energy% 'd' include delta coefficients (dc/dt)% 'D' include delta-delta coefficients (d^2c/dt^2)%% 'z' highest and lowest filters taper down to zero (default)% 'y' lowest filter remains at 1 down to 0 frequency and % highest filter remains at 1 up to nyquist freqency%% If 'ty' or 'ny' is specified, the total power in thefft is preserved.%% Outputs: c mel cepstrum output: one frame per row%% Copyright (C) Mike Brookes 1997%% Last modified Thu Jun 15 09:14:48 2000%% VOICEBOX is a MATLAB toolbox for speech processing. Home page is at%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%% This program is free software; you can redistribute it and/or modify% it under the terms of the GNU General Public License as published by% the Free Software Foundation; either version 2 of the License, or % (at your option) any later version.%% This program is distributed in the hope that it will be useful,% but WITHOUT ANY WARRANTY; without even the implied warranty of% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the% GNU General Public License for more details.%% You can obtain a copy of the GNU General Public License from% or by writing to% Free Software Foundation, Inc.,675 Mass Ave, Cambridge, MA 02139, USA. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%if nargin<2 fs=11025; endif nargin<3 w='M'; endif nargin<4 nc=12; endif nargin<5 p=floor(3*log(fs)); endif nargin<6 n=pow2(floor(log2(0.03*fs))); end if nargin<9fh=0.5;if nargin<8fl=0;if nargin<7inc=floor(n/2);endendendif any(w=='R')z=enframe(s,n,inc);elseif any (w=='N')z=enframe(s,hanning(n),inc);elsez=enframe(s,hamming(n),inc);endf=rfft(z.');[m,a,b]=melbankm(p,n,fs,fl,fh,w);pw=f(a:b,:).*conj(f(a:b,:));pth=max(pw(:))*1E-6;if any(w=='p')y=log(max(m*pw,pth));elseath=sqrt(pth);y=log(max(m*abs(f(a:b,:)),ath));endc=rdct(y).';nf=size(c,1);nc=nc+1;if p>ncc(:,nc+1:end)=[];elseif p<ncc=[c zeros(nf,nc-p)];endif ~any(w=='0')c(:,1)=[];endif any(w=='e')c=[log(sum(pw)).' c];end% calculate derivativeif any(w=='D')vf=(4:-1:-4)/60;af=(1:-1:-1)/2;ww=ones(5,1);cx=[c(ww,:); c; c(nf*ww,:)];vx=reshape(filter(vf,1,cx(:)),nf+10,nc); vx(1:8,:)=[];ax=reshape(filter(af,1,vx(:)),nf+2,nc); ax(1:2,:)=[];vx([1 nf+2],:)=[];if any(w=='d')c=[c vx ax];elsec=[c ax];endelseif any(w=='d')vf=(4:-1:-4)/60;ww=ones(4,1);cx=[c(ww,:); c; c(nf*ww,:)];vx=reshape(filter(vf,1,cx(:)),nf+8,nc); vx(1:8,:)=[];c=[c vx];endif nargout<1[nf,nc]=size(c);t=((0:nf-1)*inc+(n-1)/2)/fs;ci=(1:nc)-any(w=='0')-any(w=='e');imh = imagesc(t,ci,c.');axis('xy');xlabel('Time (s)');ylabel('Mel-cepstrum coefficient');map = (0:63)'/63;colormap([map map map]);colorbar;end五、实验结果与分析六、实验体会这次的实验,,给我最大的收获就是培养了独立思考的能力,通过读程序,我更加了解MATLAB 的程序设计方法,进一步的了解了掌握基于MA TLAB 编程实现带噪语音信号端点检测的原理,让我对这门课程又有了新的理解。

相关文档
最新文档