博文
退出编程爱好者博客(2012-03-03 22:33:00)
摘要:今天,我要正式的退出编程爱好者博客了。告别这个陪伴我三年的博客了。
编程爱好者博客,再见了......
HTS 语音合成方法 简述(2012-02-23 16:28:00)
摘要:这里,想要写一些关于HTS语音合成系统的东西。其实也就是想说说HTS语音合成系统是个啥玩意,它的基本思想和基本流程是什么?而不是用一个什么简图了事的那种。
总的来说,HTS语音合成系统,和HTK语音识别系统思想和流程基本相同,为什么这么说?那么我们就从流程上来说一条条分析。
1. 训练模型。两者都需要对语音基本单元(音素,半音节,音节)进行训练HMM模型。且训练模型使用的参数也是那些语音的acoustic参数,如MFCC, LSF, F0等。
2. 模型细化。 以音素模型为例,一般我们喜欢用di-phone 或 tri-phone来表征上下文相关的模型。但是这意味着对训练数据量的需求就更大,这时,我们一般需要做一些特殊处理,如状态绑定,对那些数据稀疏的状态,将他绑定在其他和它相似的状态上。对HTS, 可能采用基本分类树的方法来克服数据稀疏的问题。
3. 解码过程。在解码阶段,HTS语音合成和HTK语音识别刚好是一对可逆的过程。 在HTK语音识别中,给定的是每个音素的HMM模型和观察序列(如MFCC, F0序列,从输入语音中提取出来的),要求的是这些观察序列属于哪个模型。 而在HTS语音合成中,给定的是每个音素的HMM模型,以及由这些模型解码的结果(即输入的文本信息,经过处理后的音素序列),要求的是观察序列(这里得到的观察序列是指每一帧的MFCC,F0等特征)。
至此,HTK语音识别的过程就完成了。但是,HTS语音合成系统还有一个过程,那就是语音合成器。
所谓语音合成器,就是给定MFCC和F0特征,产生实际的语音数据。
这里,我们一般根据人的发音方式,即根据假设人的发生是通过一个声波(由声带振动产生), 经过声带共振(相当于一个滤波器),然后到达口鼻辐射出去。 这里,这个声波的产生过程是,对于浊音,用一个周期脉冲(其频率就是前面得到的F0)代替,对于清音,则用一个高斯白噪声代替。 而声带共振调制过程,这个滤波器的主要参数就是前面得到的MFCC参数。最后,经过一个辐射模型就可以得到所要的合成语音了。
可见,HTS语音合成的方法是严重的依赖于HTK的。所以,欲练此功,必先学习HTK。 此外,如果你已经掌握了HTK,那么,我觉得在这整个过程中,还有几个问题需要注意及好好解决。
(1) 对基频F0的建模。 因为对于......
销毁一个对话框流程(2012-01-04 10:36:00)
摘要:点击标题栏中的“X”后,
调用OnClose(), --->
在CDialog::OnClose()中会自动调用OnCancel(); ---->
在CDialog::OnCancel()中会自动调用EndDialog(); ----->
在正式消毁对话框对象之前,会自动调用OnDestroy()。......
销毁一个对话框流程(2012-01-04 10:26:00)
摘要:点击标题栏中的“X”后,
调用OnClose(), --->
在CDialog::OnClose()中会自动调用OnCancel(); ---->
在CDialog::OnCancel()中会自动调用EndDialog(); ----->
在正式消毁对话框对象之前,会自动调用OnDestroy()。......
销毁一个对话框流程(2012-01-04 10:25:00)
摘要:点击标题栏中的“X”后,
调用OnClose(), --->
在CDialog::OnClose()中会自动调用OnCancel(); ---->
在CDialog::OnCancel()中会自动调用EndDialog(); ----->
在正式消毁对话框对象之前,会自动调用OnDestroy()。......
音高于基频(2011-11-23 09:22:00)
摘要:
音高(Pitch)和基频(F0)是两个非常接近的概念,
尽管它们有所不同,但通常并不区分。
音高和基频的关系最早在音乐界被发现,
通常认为,音高增高八度音程相当于基频翻倍。
在1000Hz以下,基频翻倍略小于音高的八度音程;
而在1000-5000Hz范围,基频翻倍略大于音高的八度音程。
John M. Eargle. Music, Sound and Technology. Van Nostrand Reinhold, Toronto, 1995.
Stephen Handel. Listening. MIT Press, Cambridge, 1989.
在3000Hz以上,保持基频不变,音强增强能使得音高增加;
在2000Hz以下,保持基频不变,音强增强却使得音高降低。
Stanley Coren, Lawrence M. Ward, and James T. Enns. Sensation and Perception.
Harcourt Brace College Publishers, Toronto, 1994.
以上是来自于正弦波实验的结论,而实际上,人声的谐波结构也会影响音高感知。
目前的基频提取算法很多,但是并没有一个基频提取算法在各种条件下都工作得很好。
通常一个算法离开了特定领域,性能就会变差。提取音乐基频和语音基频的算法就有所差异。
......
CRF++详解(二)(2011-11-18 16:57:00)
摘要:如果你只是想要简单的如何使用CRF++, 建议阅读
http://blog.csdn.net/Felomeng/article/details/4288492 。
这里以一个具体的例子介绍CRF++的一些思想和代码的实现过程。就加入我们想利用CRF++来进行分词。
一. 数据及其格式介绍
Train.data
中 F1 B-NP
华 F2 I-NP
人 F3 B-NP
民 F4 I-NP
共 F5 B-NP
和 F6 M-NP
国 F7 I-NP
国 F8 B-NP
家 F9 I-NP
主 F10 B-NP
席 F11 I-NP
Template:
# Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-1,0]/%x[0,0]
U06:%x[0,0]/%x[1,0]
U12:%x[0,1]
# Bigram
B
根据给定的template 和训练数据,需要得到一个CRF模型。
这里先对数据进行一个简单的介绍,
Train.data:
中 F1 B-NP
华 F2 I-NP
人 F3 B-NP
对于输入的一句话,最基本的单元是一个个的字。所以我们处理的单元是字。我们的任务是判断每个字到底是词首,词中还是词尾。 在训练数据中,我们用B-NP, M_NP, I_NP分别表示词首,词中,词尾。 训练数据的最后一列表示训练集中每个字属于哪一类。 而F1, F2, F3..... 则是表示每个字的其他特征,比如词性,频率等。为了方便,这里假设这一列是词性列。你可以为它任意添加新的特征,这也是CRF的优势之一。但是一般来说,你如果在训练集中定义了新特征,那么你在 t......
CRF++详解(2011-11-18 15:39:00)
摘要:最近想利用条件随机场做一些实验。理论基础知识花了我一个星期时间。然后下载了CRF++的代码看看,又花了差不多一个星期。总算是把算法描述的东西和程序里的描述对应起来。
但是,这次学习的过程给我最大的感受就是网上关于这方面的知识还是偏少,尤其是关于CRF++代码的解释就更少了。由于CRF++本身的代码没有任何的注释,而很多函数动辄十几个参数,刚开始连参数代表什么意思,对应到算法描述中的什么变量都不知道。
这里,为了给这次学习过程一个总结,也为了给后面学习CRF,特别是使用CRF++代码的朋友们一个方便。
本文分两部分来描述,第一部分介绍算法原理,这里介绍的原理就是CRF++中用到的算法。 第二部分就是分析CRF++代码,介绍如何通过代码来实现这些算法。
一。 CRF原理
1.无约束最优化
对无约束最优化不熟悉的读者也许要问,什么是无约束最优化。这里以一个例子来说明该问题。
上图所示为一元函数f(x)的图像,无约束最优化问题,即不对定义域或值域做任何限制的情况下,求解函数f(x)的最小值,上面显示两个最小值点:一个为全局最小值点,另一个为局部最小值点。受限于算法复杂度等问题,目前大部分无约束最优化算法只能保证求取局部最小值点。这时读者不免要问,既然只能求取局部最小值点,那为什么这类算法还能应用呢。这是因为实际应用中,许多情形被抽象为函数形式后均为凸函数,对于凸函数来说局部最小值点即为全局最小值点,因此只要能求得这类函数的一个最小值点,该点一定为全局最小值点。
理解了上面的无约束最优化问题之后,我们就可以开始介绍无约束最优化的求解过程了,对于无约束最优化的求解首先我们需要选择一个初始点x_0,如下所示:
初始点选择好之后,就可以按照各种不同的无约束最优化求解算法,求解最小值点了。求解过程中主要涉及两个概念,即从初始点开始沿“哪个方向”以及“走多远”到达下一个点处。所谓“走多远”即之前提的“步长”的概念,“哪个方向”即方向概念。
2.Line Search
Line search主要用于解决之前提到的步长的概念,即方向确定好之后,需要确定从当前点x_k沿着该方向走多远,以便走到下一个合适的点x_k+1。若......
拟牛顿法及其相关解法(2011-11-15 11:41:00)
摘要:最近在看条件随机场中的优化算法。其中就设计到了无约束化的最优化方法,也就是牛顿法。 在CRF(conditional random field)中,使用的是L-BFGS法。费了好大的劲把算法的原理及推导算是看明白了,可是到了具体实现上,又碰到问题了,比如在求搜索方向的时候,使用
但是程序中如何实现呢?
现在转载一篇文章,看过之后,会非常受益。
使用导数的最优化算法中,拟牛顿法是目前为止最为行之有效的一种算法,具有收敛速度快、算法稳定性强、编写程序容易等优点。在现今的大型计算程序中有着广泛的应用。本文试图介绍拟牛顿法的基础理论和若干进展。
牛顿法 (Newton Method)
牛顿法的基本思想是在极小点附近通过对目标函数做二阶Taylor展开,进而找到的极小点的估计值[1]。一维情况下,也即令函数为
则其导数满足
因此
(1)
将作为极小点的一个进一步的估计值。重复上述过程,可以产生一系列的极小点估值集合。一定条件下,这个极小点序列收敛于的极值点。
将上述讨论扩展到维空间,类似的,对于维函数有
其中和分别是目标函数的的一阶和二阶导数,表现为维向量和 矩阵,而后者又称为目标函数在处的Hesse矩阵。 设可逆,则可得与方程(1)类似的迭代公式:
(2)
这就是原始牛顿法的迭代公式。
原始牛顿法虽然具有二次终止性(即用于二次凸函数时,经有限次迭代必达极小点),但是要求初始点需要尽量靠近极小点,否则有可能不收敛。因此人们又提出了阻尼牛顿法[1]。这种方法在算法形式上等同于所有流行的优化方法,即确定搜索方向,再沿此方向进行一维搜索,找出该方向上的极小点,然后在该点处重新确定搜索方向,重复上述过程,直至函数梯度小于预设判据。具体步骤列为算法1。
算法1:
(1) 给定初始点,设定收敛判据,.
(2) 计算和.
(3) 若 < ,则停止迭代,否则确定搜索方向.
(4) 从出发,沿做一维搜索,
令.
(5) 设,转步......
马尔科夫随机场的经典解释(2011-11-03 16:37:00)
摘要: 马尔可夫随机场(Markov Random Field),也有人翻译为马尔科夫随机场,它包含两层意思:一是什么是马尔可夫,二是什么是随机场。 [1]
马尔可夫一般是马尔可夫性质的简称。它指的是一个随机变量序列按时间先后关系依次排开的时候,第N+1时刻的分布特性,与N时刻以前的随机变量的取值无关。拿天气来打个比方。如果我们假定天气是马尔可夫的,其意思就是我们假设今天的天气仅仅与昨天的天气存在概率上的关联,而与前天及前天以前的天气没有关系。其它如传染病和谣言的传播规律,就是马尔可夫的。
随机场包含两个要素:位置(site),相空间(phase space)。当给每一个位置中按照某种分布随机赋予相空间的一个值之后,其全体就叫做随机场。我们不妨拿种地来打个比方。“位置”好比是一亩亩农田;“相空间”好比是种的各种庄稼。我们可以给不同的地种上不同的庄稼,这就好比给随机场的每个“位置”,赋予相空间里不同的值。所以,俗气点说,随机场就是在哪块地里种什么庄稼的事情。
好了,明白了上面两点,就可以讲马尔可夫随机场了。还是拿种地打比方,如果任何一块地里种的庄稼的种类仅仅与它邻近的地里种的庄稼的种类有关,与其它地方的庄稼的种类无关,那么这些地里种的庄稼的集合,就是一个马尔可夫随机场。......