合成语音归根到底是根据汉字在字符集的定位来取语音库中的数据

定位方法:

根据救字的两个字节中的值.从高字节算出汉字的位wm.从低字节算出汉字的区qm,

(qm一176)*94+wm一160就是该况字在汉字集里的位置position,

而该汉字所对应的语音数据的偏移量就是(position一1) 3200+46。

根据定位方法取得汉字在语音库中的发音数据后,根据WAV格式合成语音文件。

定位和合成代码如下:

#define MAXLEN  32000

/*

参数str:为纯汉字的字符串,且编码格式为GBK

返回值:

-1:表示语音库文件打开错误

-2:表示合成语音文件 打开/生成错误

其它:函数执行成功

*/

int   wav(char *str)

{

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

int qm,wm;      //汉字区、位码

int re;               //函数返回值

long fileleng=0;   //文件长度 后面修改WAV格式时有用

if((fpf=fopen("ddd.wav","rb+"))==NULL)    //打开语音库文件

return -1;

if((fpt=fopen("china.wav","wb+"))==NULL)  //打开或生成合成后的语音文件,用来播放的

return -2;

char head[46];                       //WAV 文件头

char buffer[MAXLEN];           //发音数据BUFF

memset(buffer,0,MAXLEN);  //置0

fread(head,sizeof(head),1,fpf);     //读语音库文件头

fwrite(head,sizeof(head),1,fpt);    //写入合成语音文件

int l=strlen(str);

char *s=str;

for(int i=0;i<=l;i=i+2)

{

qm=(unsigned char)*(s+i);      //取汉字的区码

wm=(unsigned char)*(s+1+i);      //取汉字的位码

if (qm<176||qm>215)   //判断是否在汉字字符集中

continue;

if (wm<161||wm>254)  //判断是否在汉字字符集中

continue;

int position =(qm-176)*94+wm-160;

int offset=(position-1)*MAXLEN+46;     //定位

fseek(fpf,offset,0);

fread(buffer,sizeof(buffer),1,fpf);     //取发音数据

fwrite(buffer,sizeof(buffer),1,fpt);     //写入合成文件

fileleng++;                                          //合成文件长度增加

}   //end for

re =fileleng;

fileleng=fileleng*MAXLEN;

fseek(fpt,42,SEEK_SET);

fwrite(&fileleng,sizeof(long),1,fpt);    //修改合成文件的WAV格式,主要是修改文件大小,具体请看WAV格式表

fileleng+=44;

fseek(fpt,4,SEEK_SET);

fwrite(&fileleng,sizeof(long),1,fpt);  //修改合成文件的WAV格式,主要是修改文件大小,具体请看WAV格式表

fclose(fpf);     //关闭文件

fclose(fpt);

return re;

}

其它:

由函数WAV可以看出,我们接收用户的输入字符的编码必须为GBK编码,

所以如果系统使用的不是 GBK编码的话,我们还应当进行编码转换。

如果编码正确的话,还得从把用户的输入中把中文字符给提取出来。

为此,我写了小段代码,用来过滤非中文字符的。

void trans(char *str)

{

int i = 0, j = 0;

while( str[i] != '' )

{

if ( str[i] < 0 )

{

str[j++] = str[i++];

str[j++] = str[i++];

}

else

i++;

}   //end while

str[j] = '';

}

java 调用linux的tts_中文TTS 的简单实现(基于linux)之 实现语音合成相关推荐

  1. linux系统下Qt应用程序重启,嵌入式Linux重启QT应用程序的简单办法(基于QT4.8 qws)...

    嵌入式Linux重启QT应用程序的简单办法(基于QT4.8 qws) 应用软件一般都有这样的业务需求: 当有新版本的APP,则程序就需要执行更新,更新完毕后(所谓的更新大多就是以覆盖的方式),不需要关 ...

  2. 基于linux的netfilter处理数据包的过程分析,基于Linux的Netfilter处理数据包的过程分析...

    基于Linux的Netfilter处理数据包的过程分析 防火墙技术在保护网络安全方面的作用越来越明显.相比较window,Linux有更好的网络性能,因此基于Linux的Netfilter技术 (本文 ...

  3. linux虚拟机模板部署模板,创建和部署基于 Linux 的虚拟机模板

    适用于: System Center 2012 SP1 - Virtual Machine Manager 通过使用 Virtual Machine Manager (VMM) 中 System Ce ...

  4. 用java调用.net的wcf其实还是很简单的

      前些天和我们的一个邮件服务商对接,双方需要进行一些通讯,对方是java团队,而作为.net团队的我们,只能公布出去的是一个wcf的basicbinding,想不 到问题来了,对方不知道怎么去调用这 ...

  5. linux 轻量化图形界面,YOXIOS 入门教程--基于Linux的 轻量化GUI图形系统和硬件平台(41页)-原创力文档...

    YOXIOS --基于 Linux 的轻量化 GUI图形系统和硬件平台 YOXIOS 入门教程 基于 Linux 的 轻量化 GUI图形系统和硬件平台 (V1.0 2020-05) 提示:阅读此文档需 ...

  6. linux下eeprom读写测试,本科毕业设计__基于linux的eeprom的读写控制.doc

    毕业设计[论文] 题目:基于linux的EEPROM的读写控制 毕业论文(设计)原创性声明 本人所呈交的毕业论文(设计)是我在导师的指导下进行的研究工作及取得的研究成果.据我所知,除文中已经注明引用的 ...

  7. 基于linux的oracle_rac实时应用集群研究,基于Linux的OracleRAC实时应用集群研究毕业设计论文(资料4)...

    <基于Linux的OracleRAC实时应用集群研究毕业设计论文.doc>由会员分享,可免费在线阅读全文,更多与<基于Linux的OracleRAC实时应用集群研究毕业设计论文> ...

  8. 基于linux的oracle_rac实时应用集群研究,基于Linux的OracleRAC实时应用集群研究毕业设计论文...

    <基于Linux的OracleRAC实时应用集群研究毕业设计论文.doc>由会员分享,可免费在线阅读全文,更多与<基于Linux的OracleRAC实时应用集群研究毕业设计论文> ...

  9. linux界面设计论文,毕业设计(论文)-基于linux的云校园桌面虚拟化系统的设计与实现.doc...

    毕业设计(论文)-基于linux的云校园桌面虚拟化系统的设计与实现.doc 还剩 67页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧, ...

最新文章

  1. arima模型matlab代码_PSTR面板平滑转换模型简介(附Matlab代码分享)
  2. GCD LCM UVA - 11388 (思维。。水题)
  3. 查询除了一列意外_想让你的查询语句变快吗?
  4. java while等待 yeild_Java中run(), start(), join(), wait(), yield(), sleep()的使用
  5. 一维卷积神经网络、卷积神经网络的基础知识
  6. 34深入理解C指针之---通过字符串传递函数
  7. linux内核移植过程问题总结
  8. 中职计算机应用基础表格制作说课稿,表格制作的说课稿
  9. Zap之日志记录器选择
  10. Elasticsearch实战(十四)---聚合搜索Aggs多层嵌套聚合处理
  11. 还在找面试题?不要盲目找了,这份 Java 面试通关手
  12. go 四种 base64 编码实现方式
  13. FIN_WAIT_2状态解释
  14. Gurobi + Python
  15. c语言体重指数bmi计算器,身高106cm体重19.5kg的女性标准体重与BMI指数 - BMI计算器...
  16. TIOBE 8 月编程语言排行榜发布:Python 势如破竹!
  17. 学生选课管理系统 jsp + servlet + mysql (2021)
  18. 爱立信语言交换机eMG800ucp使用方法
  19. 如何禁止PC端微信自动接收视频附件(不适用于3.7.0.29以后版本)
  20. 微软应用商店Microsoft Store错误代码: 0xC002001B官方解决方法和Windows计算器替代品Qalculate

热门文章

  1. 外卖项目 - Day05
  2. java+ssm的高考志愿选择辅助系统
  3. 使用max31865读取PT100温度
  4. 最右技术问答的一点个人见解
  5. [强化学习实战]函数近似方法-线性近似与函数近似的收敛性
  6. 启明星辰集团CEO严望佳:与AI共生,共建以人为本的数字善治生态体系
  7. 自动生成100个数据 c语言,用C语言随机函数生成100个不大于100的数的具体算法怎么写?...
  8. 盘点 | 全球关键信息基础设施网络安全大事件
  9. Photoshop文字之——模仿书法字
  10. 下一代无线局域网(802.11n) 第6章 强健性