3个开源TTS(五)eSpeak1.06的源码调试分析
这一篇介绍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文件),执行如下几个函数:
- initialise();LoadVoice(voicename,0);SetSpeed(speed,amp);
- OpenWaveFile(wavefile);
- synth->SpeakNextClause(f_text,0);
- for(;;)
- {
- if(WavegenFile() != 0)
- break; // finished, wavegen command queue is empty
- if(synth->Generate(phoneme_list,1)==0)
- synth->SpeakNextClause(NULL,0);
- }
- CloseWaveFile();
在初始化过程中,主要是WavegenInit(22050,0);VoiceInit();LoadPhData();完成初始输入源的设置、音调等声音属性设置和加载因素表载入声音数据等操作,而后创建Synthesize类对象synth,它的部分函数如下:
- int Generate(PHONEME_LIST *phoneme_list, int resume);
- void MakeWave2(PHONEME_LIST *p, int n_ph);
- int OnTimer(void);
- void SpeakNextClause(FILE *f_text, int stop);
- private:
- void DoAmplitude(int amp);
- void DoPitch(unsigned char *env, int pitch1, int pitch2);
- void DoPause(int length);
- void DoSample(PHONEME_TAB *ph1, PHONEME_TAB *ph2, int which, int length);
- void DoSpect(PHONEME_TAB *this_ph, PHONEME_TAB *this_ph, int which, int length_mod, int stress, int modulation);
- void DoMarker(int type, int index);
- void EndPitch(int voice_break);
- void SmoothSpect(void);
- void StartSyllable(void);
能够看到其完成的合成操作。而最开始的文本输入和处理则是由Translator类来完成的,看看其部分函数:
- char *TranslateClause(FILE *f_text, char *buf, int *tone);
- int LoadDictionary(const char *name);
- virtual void CalcLengths();
- virtual void CalcPitches(int clause_tone);
- protected:
- int TranslateWord(char *word, int next_pause, int wflags);
- int TranslateWord2(char *word, int wflags, int pre_pause, int next_pause, int source_ix);
- void TranslateLetter(char letter, char *phonemes);
- void GetTranslatedPhonemeString(char *phon_out, int n_phon_out);
- void MakePhonemeList(int post_pause);
- char GetC(void);
主要分析这两个类,大部分所要的功能已经足够了。就列到这里了,其余的根据自己的需要深入吧,我只能给开这样一个头。
参考: vi/vim使用进阶: vimgdb调试时的常见问题及解决 http://easwy.com/blog/archives/advanced-vim-skills-vim-gdb-vimgdb-faq/
3个开源TTS(五)eSpeak1.06的源码调试分析相关推荐
- 阿里开源 iOS 协程开发框架 coobjc源码分析
背景 昨天朋友圈被一篇文章(以下简称"coobjc介绍文章")刷屏了:刚刚,阿里开源 iOS 协程开发框架 coobjc!.可能大部分iOS开发者都直接懵逼了: 什么是协程? 协程 ...
- 服务器端编程心得(七)——开源一款即时通讯软件的源码
服务器端编程心得(七)--开源一款即时通讯软件的源码 2017年04月06日 22:57:01 analogous_love 阅读数:30222更多 所属专栏: 高性能服务器编程实现细节详解 版权声明 ...
- 推荐 7 个 Vue2、Vue3 源码解密分析的开源项目
大家好,我是你们的 猫哥,那个不喜欢吃鱼.又不喜欢喵 的超级猫 ~ 1. 为什么要学习源码 ? 阅读优秀的代码的目的是让我们能够写出优秀的代码. 不给自己设限,不要让你周围人的技术上限成为你的上限.其 ...
- [五]RabbitMQ-客户端源码之AMQChannel
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- cesium等高线_Cesium开源三维地球离线地图发布源码示例功能
一.概述 Cesium开源三维地球离线地图发布源码提供了地图切换.查询定位.模型加载.专题图叠加显示和测量功能等,旨在为用户提供一个可以在Cesium快速加载离线地图或在线地图的解决方案,并提供技术支 ...
- 面试官系统精讲Java源码及大厂真题 - 06 LinkedList 源码解析
06 LinkedList 源码解析 智慧,不是死的默念,而是生的沉思. --斯宾诺莎 引导语 LinkedList 适用于集合元素先入先出和先入后出的场景,在队列源码中被频繁使用,面试也经常问到,本 ...
- ROCBOSS开源微社区轻论坛类源码
ROCBOSS开源微社区轻论坛类源码 ☑️ 编号:ym477 ☑️ 品牌:无 ☑️ 语言:微信小程序 ☑️ 大小:5.9MB ☑️ 类型:微社区轻论坛 ☑️ 支持:微信小程序
- java开源即时通讯软件服务端openfire源码构建
java开源即时通讯软件服务端openfire源码构建 本文使用最新的openfire主干代码为例,讲解了如何搭建一个openfire开源开发环境,正在实现自己写java聊天软件: 编译环境搭建 调试 ...
- 工具类五合一小程序源码星座配对+星座运势+恶搞放屁音效+引流工具+流量主
今天给大家带来一套5合一小程序 星座配对+星座运势+恶搞放屁音效+引流工具+流量主 怎么弄?需要用到分包功能, 问:为什么是三套小程序,跟你演示的不一样啊? 答:为了防止有些人拿了东西就去闲鱼卖,只要 ...
- php开源多功能留言板网站源码V1.2
php开源多功能留言板网站源码V1.2 软件特点: 1.SpeedPHP框架驱动,高效轻快. 2.可创建多个留言板:每个留言板都能设置不同的模板:每个留言板都能设置单独管理员: 3.内置两套模板一个默 ...
最新文章
- 12306抢票脚本 python_如何使用Python实现12306抢票?摆脱无票可买的窘境
- 知道python不_为什么自学Python看不进去?
- MyBastis 三种批量插入方式的性能比较
- 35 SD配置-销售凭证设置-定义项目类别组
- 体绘制的原理和Raycasting的实现
- Automatic Judge
- Emscripten 单词_免费下载 | 北师大版高中英语教材重点单词汇总(可下载mp3版本)...
- 获取代理IP的三种途径
- 法向量与切向量的转化
- 简述WebS简述WebService与.NET Remoting的区别及适应场合
- COMSOL空气反应 模型框架
- python sns可视化小技巧(纪录所得)
- 这样可以几分钟快速对接支付宝APP支付和手机网站支付
- 在线学习算法FTRL基本原理
- Picasso加载圆角图片
- 为什么你觉得信用卡负担越来越重了?那是你不会技巧!
- 中学教学03教学原则与方法 04教学组织形式05教学评价
- Windows与Linux的命令行命令对比
- 接盘恒大、清债,自救的华远地产能度过地产寒冬吗?
- 最不可思议的巧合,这些电影一定是穿越者拍的了!