这一篇介绍eSpeak1.06源码的编译调试及基本框架。

上篇详细说明了eSpeak的调试环境的搭建,调试则和一般的gdb调试命令行调试区别不大,只不过是有了vim的代码界面和vimgdb提供的gdb命令的快捷键。为了调试肯定要有已经编译好的speak可执行文件,当然前面已经说过增加-g参数,这里直接make即可,而后#vim speak.cpp进入编辑界面,因为运行过run macros/gdb_mappings.vim了,所以直接按空格键进入调试命令行,file speak加载可执行文件,会看到vimgdb的模式状态、gdb的版本信息,再在命令行下按个回车会看到加载speak成功的提示:

17 (gdb) file speak
          18 Reading symbols from /opt/tts/speak-1.06-source/src/speak...done.
 而如果之前在speak的makefile中没有修改,则会提示没有调试信息。 Ctrl+B在speak.cpp中添加断点,Shift+R键运行,Ctrl+P(命令行中p命令)输出变量值等;一般调试会有两个问题:
          一是如何运行时带参数,即这里想要保存为WAV文件,运行时需要-w参数和保存的WAV文件名。这时可以在命令行下通过r命令加参数来执行,即:r -w test就是运行speak -w test,当然前提是你已经加载了speak。
          二是调试运行中,需要和终端交互即输入输出,参考【1】中方法,通过tty /dev/pts/1命令来重定向标准输入输出其中的1数字可以在新开的终端通过tty命令查看。但是据说在Ubuntu中(我的是debian)会出现 “warning: GDB: Failed to set controlling terminal: 不允许的操作”提示,据说是个bug,没有解决,但是它在这里并不影响我们的输入,因此,只要在需要输入的时候,输入即可,比如这里输入“hello world”,回车之后虽然重定向的终端提示没有此命令,而后你再输入一遍,终端上没有回显,但其实已经输入,这时如果关闭该终端,而speak调试端没有其他断点,会显示“Program exited normally”,看到speak所在目录下的名为test的WAV文件。(此处如果不关闭终端会一直等待输入是因为speak程序收不到结束符。)

下面看看speak的运行流程如图所示:

在参数选择后(这里主要说保存问WAV文件),执行如下几个函数:

  1. initialise();LoadVoice(voicename,0);SetSpeed(speed,amp);
  2. OpenWaveFile(wavefile);
  3. synth->SpeakNextClause(f_text,0);
  4. for(;;)
  5. {
  6. if(WavegenFile() != 0)
  7. break;   // finished, wavegen command queue is empty
  8. if(synth->Generate(phoneme_list,1)==0)
  9. synth->SpeakNextClause(NULL,0);
  10. }
  11. CloseWaveFile();

在初始化过程中,主要是WavegenInit(22050,0);VoiceInit();LoadPhData();完成初始输入源的设置、音调等声音属性设置和加载因素表载入声音数据等操作,而后创建Synthesize类对象synth,它的部分函数如下:

  1. int Generate(PHONEME_LIST *phoneme_list, int resume);
  2. void MakeWave2(PHONEME_LIST *p, int n_ph);
  3. int OnTimer(void);
  4. void SpeakNextClause(FILE *f_text, int stop);
  5. private:
  6. void DoAmplitude(int amp);
  7. void DoPitch(unsigned char *env, int pitch1, int pitch2);
  8. void DoPause(int length);
  9. void DoSample(PHONEME_TAB *ph1, PHONEME_TAB *ph2, int which, int length);
  10. void DoSpect(PHONEME_TAB *this_ph, PHONEME_TAB *this_ph, int which, int length_mod, int stress, int modulation);
  11. void DoMarker(int type, int index);
  12. void EndPitch(int voice_break);
  13. void SmoothSpect(void);
  14. void StartSyllable(void);

能够看到其完成的合成操作。而最开始的文本输入和处理则是由Translator类来完成的,看看其部分函数:

  1. char *TranslateClause(FILE *f_text, char *buf, int *tone);
  2. int LoadDictionary(const char *name);
  3. virtual void CalcLengths();
  4. virtual void CalcPitches(int clause_tone);
  5. protected:
  6. int TranslateWord(char *word, int next_pause, int wflags);
  7. int TranslateWord2(char *word, int wflags, int pre_pause, int next_pause, int source_ix);
  8. void TranslateLetter(char letter, char *phonemes);
  9. void GetTranslatedPhonemeString(char *phon_out, int n_phon_out);
  10. void MakePhonemeList(int post_pause);
  11. char GetC(void);

主要分析这两个类,大部分所要的功能已经足够了。就列到这里了,其余的根据自己的需要深入吧,我只能给开这样一个头。

参考: vi/vim使用进阶: vimgdb调试时的常见问题及解决  http://easwy.com/blog/archives/advanced-vim-skills-vim-gdb-vimgdb-faq/

3个开源TTS(五)eSpeak1.06的源码调试分析相关推荐

  1. 阿里开源 iOS 协程开发框架 coobjc源码分析

    背景 昨天朋友圈被一篇文章(以下简称"coobjc介绍文章")刷屏了:刚刚,阿里开源 iOS 协程开发框架 coobjc!.可能大部分iOS开发者都直接懵逼了: 什么是协程? 协程 ...

  2. 服务器端编程心得(七)——开源一款即时通讯软件的源码

    服务器端编程心得(七)--开源一款即时通讯软件的源码 2017年04月06日 22:57:01 analogous_love 阅读数:30222更多 所属专栏: 高性能服务器编程实现细节详解 版权声明 ...

  3. 推荐 7 个 Vue2、Vue3 源码解密分析的开源项目

    大家好,我是你们的 猫哥,那个不喜欢吃鱼.又不喜欢喵 的超级猫 ~ 1. 为什么要学习源码 ? 阅读优秀的代码的目的是让我们能够写出优秀的代码. 不给自己设限,不要让你周围人的技术上限成为你的上限.其 ...

  4. [五]RabbitMQ-客户端源码之AMQChannel

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  5. cesium等高线_Cesium开源三维地球离线地图发布源码示例功能

    一.概述 Cesium开源三维地球离线地图发布源码提供了地图切换.查询定位.模型加载.专题图叠加显示和测量功能等,旨在为用户提供一个可以在Cesium快速加载离线地图或在线地图的解决方案,并提供技术支 ...

  6. 面试官系统精讲Java源码及大厂真题 - 06 LinkedList 源码解析

    06 LinkedList 源码解析 智慧,不是死的默念,而是生的沉思. --斯宾诺莎 引导语 LinkedList 适用于集合元素先入先出和先入后出的场景,在队列源码中被频繁使用,面试也经常问到,本 ...

  7. ROCBOSS开源微社区轻论坛类源码

    ROCBOSS开源微社区轻论坛类源码 ☑️ 编号:ym477 ☑️ 品牌:无 ☑️ 语言:微信小程序 ☑️ 大小:5.9MB ☑️ 类型:微社区轻论坛 ☑️ 支持:微信小程序

  8. java开源即时通讯软件服务端openfire源码构建

    java开源即时通讯软件服务端openfire源码构建 本文使用最新的openfire主干代码为例,讲解了如何搭建一个openfire开源开发环境,正在实现自己写java聊天软件: 编译环境搭建 调试 ...

  9. 工具类五合一小程序源码星座配对+星座运势+恶搞放屁音效+引流工具+流量主

    今天给大家带来一套5合一小程序 星座配对+星座运势+恶搞放屁音效+引流工具+流量主 怎么弄?需要用到分包功能, 问:为什么是三套小程序,跟你演示的不一样啊? 答:为了防止有些人拿了东西就去闲鱼卖,只要 ...

  10. php开源多功能留言板网站源码V1.2

    php开源多功能留言板网站源码V1.2 软件特点: 1.SpeedPHP框架驱动,高效轻快. 2.可创建多个留言板:每个留言板都能设置不同的模板:每个留言板都能设置单独管理员: 3.内置两套模板一个默 ...

最新文章

  1. 12306抢票脚本 python_如何使用Python实现12306抢票?摆脱无票可买的窘境
  2. 知道python不_为什么自学Python看不进去?
  3. MyBastis 三种批量插入方式的性能比较
  4. 35 SD配置-销售凭证设置-定义项目类别组
  5. 体绘制的原理和Raycasting的实现
  6. Automatic Judge
  7. Emscripten 单词_免费下载 | 北师大版高中英语教材重点单词汇总(可下载mp3版本)...
  8. 获取代理IP的三种途径
  9. 法向量与切向量的转化
  10. 简述WebS简述WebService与.NET Remoting的区别及适应场合
  11. COMSOL空气反应 模型框架
  12. python sns可视化小技巧(纪录所得)
  13. 这样可以几分钟快速对接支付宝APP支付和手机网站支付
  14. 在线学习算法FTRL基本原理
  15. Picasso加载圆角图片
  16. 为什么你觉得信用卡负担越来越重了?那是你不会技巧!
  17. 中学教学03教学原则与方法 04教学组织形式05教学评价
  18. Windows与Linux的命令行命令对比
  19. 接盘恒大、清债,自救的华远地产能度过地产寒冬吗?
  20. 最不可思议的巧合,这些电影一定是穿越者拍的了!

热门文章

  1. Adb refused a command 解决方法
  2. 虚拟机利用Host-only实现在不插网线的情况下,虚拟机与主机实现双向通信,实现ssh连接以及samba服务实现共享...
  3. SQL优化的一些总结
  4. 手机号码归属地查询练习
  5. 猜数字的算法的一个简单实现
  6. 拿下宝马中国量产订单的四维图新,如何在自动驾驶地图领域内外兼修?
  7. 摘抄:不注明来源,就是违反契约
  8. Go语言实战 (William,Kennedy 等著)
  9. 十个必备的学习iOS开发的网站
  10. javascript 自建立对象