
精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
在初始化espeak后,进行播放时出espeak段错误和espeak_Synth段错误,这个段错误和另外问题有交织,交织产生了误导,不过我选择了正确的方向,解决了问题。错误代码如下:
//int ret = espeak_Synth(word, strlen(word) + 1, 0, POS_CHARACTER, 0,
// espeakCHARS_WCHAR, NULL, NULL); // 发音
带注释是因为错的代码不用了。word是发音串内容,后面是一些播放的参数。在默认想法里,函数出错会有提示,也不会有段错误,段错误是其它地方导致的,其实不是。
代码换成下面形式:
unsigned int flags = espeakCHARS_AUTO | espeakENDPAUSE;
int ret = espeak_Synth(word, strlen(word) + 1, 0, POS_CHARACTER, 0, flags, NULL, NULL);
就能正常播放,所以问题肯定是在倒数第三个参数,标志参数,出错的是用的WCHAR,要求传入宽字符,而我传入的不是宽字符,是string的形式,就报段错误了,而用CHARS_AUTO,在espeak内部能识别word里的内容,就不出段错误。
用开源的软件,就是这样的状态,开源维护人只会大方向上帮你完成,不会给你做出来产品,所以遇到问题,要能调整换方向,不要认死理。比如这次的情况,如果认定段错误是espeak初始化没做好,比如espeak不支持线程这类,哪就进入了死胡同了。