linux中文语音合成软件,中文TTS 的容易告终(基于linux)之 语音库的告终

语音库保留着常用汉字的发音(多音的汉字只登记其一种发音,这也是本系统的一个缺点,必需尔后健全),因而先要获得一汉字集,这个汉字集包括了大局部常用的汉字,然后在依据这个汉字集,来一个个的获得汉字的发音,并且按定然的法定保留到语音库中。

因而告终语音库能够分为三步:

1.1:获得常用汉字的聚集

1.2:依据汉字集,利用一些朗读软件生成该汉字集的语音文件

1.3:处理汉字集语音文件的款式,使它能相称我们的要求

1.1依据汉字编码法定获得汉字字符集的文本文件

1.1.1编码知识:

所谓编码,是以安宁的次序编排字符,并以此作为登记、存贮、递交、沟通的统一内部个性。一个汉字有ASC II码、区位码等与之对应。ASC

II码中对应于码值161到254的字符用于表示汉字,每个汉字用两个ASC1I码值对应的字符表示。区位码用4位数字表示,前两位从01到94称区码,后两位从01到94称位码。一个汉字的前一半是ASC

II码为“160+区码”的字符,后一半是ASCII码为“160+位码”的字符。例如:“刘”的区位码是3385,其意为区码33和位码85,它是由ASCII码为160+33=193和160+85=245的两个字符构成。

该文所说的汉字字符集等闲是指ISO 10646.1 即GB130o0.1。在Windows

95/98/2000中,微软供给了“汉字伸展内码规范(GBK)”以处理汉字的收字不足、简繁共存、简化代码系统间转换等汉字消息沟通的瓶颈问题,利用GBK能够得体处理“镕”、“薯”等许多汉字的沟通问题而无须自行造字了。GBK字库共分为5局部,其中GBK/1和GBK/5为符号局部,GBK/2为国标汉字局部,GBK/3和GBK/4为伸展汉字局部。其中,第16区至55区为一级汉字,以拼音排序,共计3755字,56—87区为二级汉字,按偏旁部首排序,共计3008字。

1.1.2过程代码:

用C++告终的获得GBK中一级汉字字符的代码段如下:

//getgbk.cpp一获得GBK汉字码文件

#include

//字符串I/O垄断

#include //文件I/O垄断

unsigned char oneline[4];

ofstream

ofs("gbhz.txt",ios::binary

);

oneline[2]=163;

oneline[3]=172;

int qm;

int wm;

for( qm=176;qm<=247;qm++)

//区码0XB0—0XD7 87

for(wm=161;wm<=254;wm++)

//位码0XA1—0XFE

if(!((qm==247)&&(wm=250)))

//剔除GBK中未曾编码的字位

{

oneline[0]=qm; //汉字区码

oneline[1]=wm; //汉字位码

ofs.泰国圣荷write((char *)&oneline,4);

//写一行至gbhz txt

}//if end

1.2:依据获得的汉字集,利用一些报读软件生成该汉字集的语音文件,等闲为WAV款式的。

这里取名为gbhz.wav

1.3:处理汉字集读音文件的款式

1.3.1 会意WAV文件款式

WAVE文件作为多媒体中利用的声波文件款式之一.它是以RlFF款式为规范的 每个wAVE文件的头4个字节便是

“RIFF”

WAVE文件由文件头和数据体两大局部构成。其中文件头又分为RIFE/WAV文件标识段和声音数据款式解释段两局部

。WAVE文件款式解释见下表,

内容

数据种类

字节数

“RIFF”符号

Char

4Byte

文件大小

Long int

4Byte

&ldquoc4e3.com;wave”符号

Char

4Byte

“fmt”符号

Char

4Byte

PCMWAVFORMAT数据构造大小

Long int

4Byte

PCMWAVFORMAT数据构造

“data”符号

Char

4Byte

语音数据大小

Long int

4Byte

能够以时域-幅度的措施揭示出原始声音的波形,这是最简唯同时也是最直接的消息处理措施。在时域范国内,能够考察该信号波形是否继续,其中是否有祧变等。据觉察,经语音引擎处理后,每个汉字所对应的语音数据长度不尽雷同.这给尔后截取每个汉字的语音数据构成了艰难。因而.为了判别每个汉宇的语音数据.在生成汉字字符集时.在每个汉字后增加了一个逗号作为闻隔符

这么生成的语音文件的波形图(局部)如图1所示

图1:

1.3.2生成新的汉字字符集的话音文件的算法

(1)敞开gbhz.wav.从gbhz.wav中读人文件头CHAR HEAD[46]。46为文件头长度。

(2)从gbhz.wav 中读入第一个汉字的语音波形数据纳入CHAR BUFFER[3200]。

3200为一个汉字的语音波形数据长度.拨取决于构成语音的速率、音质等因素

(3)读后面的数据,万一是0x80则不做处理.继续后来读。

ox8O是逗号语音数据,既未曾发音的数据。

(4)直到读到第一个不是逗号的语音数据,开始登记第二

个汉字的语音波形数据到CHAR BUFFER[3200]

(5)重复3.4步直到读彻底端的语音波形数据。

融合新的汉字字符集的语音文件后的波形图(局部)如图2所示

图2:新的语音文件波形图

1.3.3 处理代码如下:

#define MAXLEN 32000

int HandingWav()

{

FILE * fpf,*fpt; //文件垄断指针

if((fpf=fopen("gbhz.wav","rb+"))==NULL)

//gbhz.wav为处理前的语音文件

return -1;

if((fpt=fopen("ddd.wav","rb+"))==NULL)

//ddd.wav为融合的新的语音文件

return -1;

char head[46]; //wav文件的文件头长度

char data[100]; //用来加速文件处理的数组

char buffer[MAXLEN];

memset(buffer,0,MAXLEN);

fread(head,sizeof(head),1,fpf); //head of wav

fwrite(head,sizeof(head),1,fpt);

while(www.myki7.info!feof(fpf))

{

fread(buffer,MAXLEN,1,fpf); //读一个字的发音

fwrite(buffer,MAXLEN,1,fpt); //写一个字

memset(buffer,0,MAXLEN);

fread(data,1,1,fpf); //读一个字节

while(data[0]==char(0x80)) //推断是否为0x80

{

if(fread(data,100,1,fpf)==-1)

//每次取100个字节,但只推断第一个字节,这么能够加速文件处理

{

fclose(fpf);

fclose(fpt);

return -1;

} //end if

} //end while 推断是否为0x80

} //end while(!feof(fpf))

fclose(fpf); //关闭文件

fclose(fpt);

return 0;

}

穿越以上的垄断后,就构成了我们所要的语音库了。

文章导读:

中文TTS 的容易告终(基于linux)之 序言

blog.csdn.net/dedodong/archive/2006/07/15/923543.aspx

中文TTS 的容易告终(基于linux)之

告终原理:blog.csdn.net/dedodong/archive/2006/07/16/927041.aspx

中文TTS 的容易告终(基于linux)之 告终语音融合

blog.csdn.net/dedodong/archive/2006/08/22/1105879.aspx

中文TTS 的容易告终(基于linux)之 后记

blog.csdn.net/dedodong/archive/2006/08/24/1109908.aspx

注:我告终该系统重要是参看

袁嵩的《一个TTS系统的告终计划》——

计算机工程与利用2004.21 229

而且我写的东西,大局部是来自他的论文,在此我要向他表示忠心的谢意。但今天是周末,我家来了七大姑八大姨,站在厨房里的我就会感受面对一道混杂的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值