语音库保留着常用汉字的发音(多音的汉字只登记其一种发音,这也是本系统的一个缺点,必需尔后健全),因而先要获得一汉字集,这个汉字集包括了大局部常用的汉字,然后在依据这个汉字集,来一个个的获得汉字的发音,并且按定然的法定保留到语音库中。
因而告终语音库能够分为三步:
1.1:获得常用汉字的聚集
1.2:依据汉字集,利用一些朗读软件生成该汉字集的语音文件
1.3:处理汉字集语音文件的款式,使它能相称我们的要求
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
//区码0XB0—0XD7 87
for(wm=161;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
而且我写的东西,大局部是来自他的论文,在此我要向他表示忠心的谢意。但今天是周末,我家来了七大姑八大姨,站在厨房里的我就会感受面对一道混杂的问题。
文章知识点与官方知识档案匹配,可进一步学习相关知识CS入门技能树Linux入门初识Linux25349 人正在系统学习中 相关资源:qq冻结查询软件番薯QQ冻结查询器v2.0-其它代码类资源-CSDN文库
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!